FJCT_ニフクラ mobile backend(mBaaS)お役立ちブログ

スマホアプリ開発にニフクラ mobile backend(mBaaS)。アプリ開発に役立つ情報をおとどけ!

Google Apps Scriptでアプリのマスターメンテナンスを行う

f:id:mbaasdevrel:20180517135843p:plain

mBaaSのデータストアは管理画面上で一覧表を使ってデータ管理ができます。インラインで編集できたり、データの絞り込みはできるのですが、それでも表計算ソフトウェア(Excelなど)に比べると機能不足感は否めません。

アプリのマスターデータをメンテナンスする際に、mBaaSの管理画面ではなくGoogleスプレッドシートを使ってみましょう。今回は既存のデータストアに入っているデータを取得する方法について紹介します。

使い方

まず空のGoogleスプレッドシートを開きます。

f:id:mbaasdevrel:20180517135624p:plain

そしてスクリプトエディタを開きます。

f:id:mbaasdevrel:20180517135804p:plain

リソースメニューのライブラリにてNCMBライブラリ 1yWnb7GfYsBCR-MZvi6r-TOYv_y-AV4le5P7kaG5B3iZ5VNnSk9Q55pSJ を登録します。バージョンは最新のものを選択してください。

f:id:mbaasdevrel:20180517135825p:plain

設定

最初にmBaaSの初期化をします。

var userProperties = PropertiesService.getScriptProperties();
var application_key = "APPLICATION_KEY";
var client_key = "CLIENT_KEY";
var ncmb = NCMB.init(application_key, client_key);

mBaaSにはクラス一覧を返すAPIがありませんので、マスターメンテナンスを行う対象になるデータストアのクラスを定義します。

var classes = [
  "Sessions",
  "Speakers"
];

そしてこのクラスごとに処理を行います。

for (var i = 0; i < classes.length; i += 1) {
  syncClass(ncmb, classes[i]);
}

データを取得、表示する

データを取得するのは fetchAll を使います。ただし、通常のJavaScriptと異なり、同期でデータが返ってきます。

var Item = ncmb.DataStore(sheetName);
// 現在クラスにある全データ(最大1000件)を取得します
var items = Item.limit(1000).fetchAll();

そして取得したデータを精査してヘッダー(一行目)を作ります。

// ヘッダーをすべて取得
var headers = [];
for (var i = 0; i < items.length; i += 1) {
  var row = items[i];
  for (var j in row.fields) {
    if (['objectId', 'updateDate', 'acl', 'createDate'].indexOf(j) > -1) continue;
    headers[j] = true;
  }
}
// ヘッダー作成
sheet.getRange(1, 1).setValue('objectId');
var column = 2;
for (var j in headers) {
  sheet.getRange(1, column).setValue(j);
  column += 1;
}

ヘッダー部ができあがったら、データを並べていきます。注意点として、日付のような文字列(今回は 12:00 といった時刻のような文字列)をそのまま値として入力すると日付型に自動変換されてしまいます。そのため、正規表現によって若干の処理分けを行っています。

for (var i = 0; i < items.length; i += 1) {
  var row = items[i];
  column = 2;
  sheet.getRange(index, 1).setValue(row.fields['objectId']);
  for (var j in headers) {
    var value = row.fields[j];
    
    if (value) {
      if (value.match && value.match(/^[0-9]*:[0-9]*$/)) {
        sheet.getRange(index, column).setFormula("=\"" + value + "\"");
      } else {
        sheet.getRange(index, column).setValue(value);
      }
    }
    column += 1;
  }
  index += 1;
}

ポインターの変換

データにポインターが含まれていた場合、別なシートのデータを参照するように変更します。データを上から精査し、ポインターの形式になっているものがあれば、別処理を実行します。これはポインターが指定しているクラス名を取得し、そのシート内でobjectIdを探すというものです。

while (true) {
  var field = sheet.getRange(1, column).getValue();
  if (field == '') break;
  column += 1;
}
var rowIndex = 2;
while (true) {
  // すべての行が空であれば、処理終了とします
  var range = sheet.getRange(rowIndex, 1, 1, column);
  if (range.isBlank()) break;
  // 各行を処理します
  for (var i = 0; i < column; i += 1) {
    // 表示されている値と、そこで使われている計算式を取ります
    var value = sheet.getRange(rowIndex, i + 1).getValue();
    if (value == '') continue;
    var match = value.match && value.match(/^{__type=Pointer, className=(.*?), objectId=(.*?)}$/);
    if (match) {
      var targetSheetName = match[1];
      var targetObjectId = match[2];
      var rowId = getTargetRow(targetSheetName, targetObjectId);
      if (rowId) {
        var formula = "=" + targetSheetName + "!A" + rowId;
        sheet.getRange(rowIndex, i + 1).setFormula(formula);
      }
    }
  }
  rowIndex += 1;
}

function getTargetRow(targetSheetName, targetObjectId) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName(targetSheetName);
  var rowIndex = 2;
  while (true) {
    // すべての行が空であれば、処理終了とします
    var objectId = sheet.getRange(rowIndex, 1).getValue();
    if (objectId == '') break;
    if (objectId == targetObjectId) {
      return rowIndex;
    }
    rowIndex += 1;
  }
  return null;
}

f:id:mbaasdevrel:20180517135843p:plain

まとめ

これらの処理によって、現在mBaaS上にあるデータをGoogleスプレッドシートにダウンロードできます。一回マスターデータができあがったら、Googleスプレッドシートで編集した後、Google Apps Script用SDKを使ってマスターデータをGoogleスプレッドシートでメンテナンスする - ニフクラ mobile backend(mBaaS)お役立ちブログを使ってmBaaSに反映できるようになります。カラムの並び替えであったり、データフィルタリングなども使えるので、データメンテナンスが大幅にやりやすくなるはずです。ぜひお試しください!

今回のコードはmBaaSのデータをGoogleスプレッドシートへダウンロードにアップロードしてあります。Google Apps Scriptとして役立ててください。

中津川 篤司

中津川 篤司

NCMBエヴァンジェリスト。プログラマ、エンジニアとしていくつかの企業で働き、28歳のときに独立。 2004年、まだ情報が少なかったオープンソースソフトの技術ブログ「MOONGIFT」を開設し、毎日情報を発信している。2013年に法人化、ビジネスとエンジニアを結ぶDXエージェンシー「DevRel」活動をスタート。