【プリチャン】ARコーデ管理アプリ作ってみた その4 ~所持数更新などなど~
前回のあらすじ
前回の記事ではGoogleスプレッドシートのデータをUnityに読み込ませてコーデ認識時の所持状態表示とコーデ一覧を表示する機能を作成した。
今回はアプリからGoogleスプレッドシート上にある所持状態を更新できるようにしてみる。
必要な情報、洗い出してみた
コーデの所持状態を更新するために、前回と同様にGASのWeb APIを使用して更新用の関数を実行する。更新に必要な情報は「コーデを識別できる値(今回はコーデIDとする)」「現在の所持状態」「持っているコーデの個数」の3種類だ。
また、現時点ではGASに紐付いているスプレッドシートを直接更新する方法でも構わないが、今後複数のGoogleスプレッドシートを使用するようなことが起こる可能性もあるので、公開設定されているGoogleスプレッドシートの内容を更新できるようにしておく。そのため、上記に加えて「更新対象のSpreadsheetID」が必要となる。
また、現在のコーデの所持状態を記録しているGoogleスプレッドシートは弾ごとにシートを分けているので「更新する弾のシート名」も必要だ。
改めて整理すると、所持状態の更新のために必要な条件は以下の通りだ。
・SpreadsheetID
・シート名(DB名)
・コーデID
・現在の所持状態
・所持数
上記の値をパラメータとしてdoGet()で受け取れるようにしておく。
//前回同様、doGetで関数を実行できるように
function doGet(e) {
var sheet_id = e.parameter.sheetId;//SpreadsheetのID
var sheet_name = e.parameter.sheetName;//シートの名前(弾ごとのDB名)
var coord_id = e.parameter.coordId;//更新対象のコーデID
var status = e.parameter.status;//所持状態
var possession_num = e.parameter.possession_num;//個数
//ここに更新するための処理を書く
return ContentService.createTextOutput("更新したぷり");
}
コーデIDから行番号を検索してみた
所持数を更新するには、コーデの所持状態がシートのどこに記録されているかを調べる必要がある。具体的に言うと、コーデIDを使って行番号を返す仕組みを作成する必要があるということになる。
以下の記事で高速かつ簡単に行番号を取得する方法が記載されている。こちらを参考にしてコーデIDから行番号を取得する関数を作成する。
//mySheetシートからcoord_idの行番号を返す
function searchRow(mySheet,coord_id){
//対象シートのデータを2次元配列で取得
var arrData = mySheet.getDataRange().getValues();
var _ = Underscore.load();//Underscoreをロード
var arrTrans = _.zip.apply(_, arrData);//Underscoreで2次元配列を転置
//コーデIDの列からcoord_idの位置を探して返す
return arrTrans[2].indexOf(coord_id);
}
GoogleスプレッドシートのAPIをループで回して値を検索すると処理時間がとんでもないことになるのでシート全体(2次元配列)を取得する。
得られた2次元配列は行方向を基準に格納されているので、2次元配列を転置させて列方向を基準として2次元配列を作成し、コーデIDが格納されている配列にindexOf()をかけることで行番号が得られる。
上記の記事内でも触れているが、GAS用ライブラリの「Underscore for GAS」を使用しているので実行にはライブラリのインポートが必要だ。
Underscore for GAS
プロジェクトキー:M3i7wmUA_5n0NSEaa6NnNqOBao7QLBR4j
スプレの値を更新してみた
コーデIDから行番号を取得する関数を使用して、Googleスプレッドシートに記録されているコーデの所持状態を更新するSetPossessionStatus関数を作成する。
作成したSetPossessionStatusをdoGetから呼び出し、前回同様にWebAPIとしてアクセスすることでUnityアプリからコーデの所持状態を更新することができる。
function doGet(e) {
SetPossessionStatus(e);
return ContentService.createTextOutput("更新したぷり");
}
//コーデの所持状態を更新する
function SetPossessionStatus(e){
//doGetのパラメータeから値を取得
var sheet_id = e.parameter.sheetId;
var sheet_name = e.parameter.sheetName;
var coord_id = e.parameter.coordId;
var status = e.parameter.status;
var possession_num = e.parameter.possession_num;
//更新するシートを取得
var sheet = SpreadsheetApp.openById(sheet_id).getSheetByName(sheet_name);
//コーデIDから行番号を取得
var row = searchRow(sheet,coord_id);
//見つかった行番号の所持状態を所持数を更新
sheet.getRange(row+1,1).setValue(status);
sheet.getRange(row+1,2).setValue(possession_num);
}
余談:第6弾の情報がでました!
6弾の情報が出た=アプリの更新ということで、前の記事で紹介したVuforiaのDeveloper Portalから第6弾のコーデ画像を1つ1つ手作業で追加しています(60オーバーなので結構手間)。
で、もしかしてAPIでDeveloper PortalのTarget Managerに画像を追加できるのではと思い改めて調べてみたら発見しました。
しかし、内容を読んでみるとCloud Database限定の機能のようで、Device Databaseを使用している「ARコーデ管理アプリ」には関係のないお話のようでとても残念…地道に手作業で追加します。
Device Database:
アプリ内にARマーカーの情報を持っている。識別時に通信が発生しないので高速。識別数制限がない。更新にはアプリの改修が必須(Asset Bundleとかでどうにかならないのかしら?)
Cloud Database:
クラウド上のあるARマーカーの情報で識別。通信が必要なのでその分だけDevice Databaseに劣る。開発版ライセンスでは1,000識別/月なのでとても辛い。クラウドにマーカーを追加すればアプリの更新の必要がない。
今までの経験上、コーデを見た瞬間にわかっていたことなのですが、新KRの「アイランジュホワイト」シリーズの識別率が非常に厳しい感じになっています。
識別率はさておき…アイランジュ…すっごく気になるワードです…
余談2:第6弾の画像がjpgに戻りました!
実は5弾の時にVuforiaを使う上で非常に悲しい事件が起こってました。
で、12月チャンネル、1月チャンネル、らぁら&ゆいチャンネル、メルティックスターセレクションと尽く8bitのpngをjpg変換する作業を強いられていたわけですが…
第6弾で4弾以前のjpg形式に戻りました!公式ありがとう!
Session Continues...
この記事が気に入ったらサポートをしてみませんか?