ニフクラmBaaSお役立ちブログ

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

mBaaSのデータストアをGoogleスプレッドシートに自動バックアップする

mBaaSのデータをバックアップしたいというニーズは良く聞きます。元々エクスポートサービスはありますが、申請後にメールで案内が送られてくるシステムになっており、リアルタイムで逐次バックアップを取るという形ではありません。

そこで今回はGoogleスプレッドシートへ自動バックアップを行うツールを作成したので紹介します。

制限事項

あらかじめ制限事項をお伝えします。

  1. データの削除には対応していません。
  2. 複数のクラスに対応していません(修正すれば対応可能)

スクリプトについて

GoogleスプレッドシートではGoogle App Script(通称GAS)を使ってスクリプトを組めます。以前紹介したGAS用NCMBを更新し、検索オペランドに「以上」を追加した他、limitやskipにも対応させました(バージョン15以降)。

利用する際にはGoogleスプレッドシートのスクリプトエディタより、ライブラリにて「1yWnb7GfYsBCR-MZvi6r-TOYv_y-AV4le5P7kaG5B3iZ5VNnSk9Q55pSJ」を登録してください。

NCMBの初期化

まずNCMBの初期化を行います。アプリケーションキー、クライアントキーはそれぞれ置き換えてください。

// NCMBの準備
var application_key = 'YOUR_APPLICATION_KEY';
var client_key      = 'YOUR_CLIENT_KEY';

var ncmb = NCMB.init(application_key, client_key);
var dataTest = ncmb.DataStore("dataTest");

スプレッドシートの準備

現在のアクティブなスプレッドシートを指定します。

// スプレッドシートのオブジェクト
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();

最終更新時間を取得

最後に処理されたデータストアの時間を取得します。あればそれをデータストアの検索条件に適用します。

// バックアップ済みデータの最終行に関する情報を取得
var range = sheet.getRange("B2");
var lastDate = range.getValue();
if (lastDate != '') {
  // 最終更新日があれば
  lastDate = new Date(lastDate);
  dataTest = dataTest.greaterThanOrEqualTo("updateDate", lastDate);
}

データストアを検索

バックアップ対象になるデータを取得します。最終更新時間でソートします。

var results = dataTest
  .order('updateDate')
  .fetchAll();

カラムを作成

最初の実行時やカラムが追加された時に合わせて、スプレッドシートの2行目にカラムを作ります。

var keys = Object.keys(fields);
if (sheet.getRange("A2").getValue() == "objectId")
  return;
array2row(sheet, 3, keys);

// 配列を指定された行に順番に出力します
function array2row(sheet, row, ary) {
  for (var i = 0; i < ary.length; i++) {
    sheet.getRange(row, i+1).setValue(ary[i]);
  }  
}

バックアップ処理

バックアップはすでに登録済みのobjectIdであればそのデータを上書きします。なければ一番下の行に追記します。

var keys = Object.keys(results[0].fields);

// バックアップ開始
for (var i = 0; i < results.length; i++) {
  var row = results[i];
  var values = [];
  for (var j = 0; j < keys.length; j++) {
    values.push(row.fields[keys[j]]);
  }
  
  // すでに記録済みであれば更新
  if (index = existObjectId(sheet, row.get("objectId"))) {
    array2row(sheet, index, values);
  }else{
    array2row(sheet, last_row, values);
    last_row++;
  }
}

最終取得時間を更新

最後に処理したデータ(一番最近更新したデータ)の時間を記録しておきます。

// 最終行の日付を記録
var updateDate = new Date(results[results.length - 1].get("updateDate"));
if (lastDate < updateDate) {
  sheet.getRange("B2").setValue(updateDate);
  lastDate = updateDate;
}

次のデータを取得

あらかじめ指定した取得件数(最大1000件)以上更新データがあった場合に備えて再度検索処理を行います。

page++;
dataTest = dataTest.skip(page * limit);

全体のコードはGitHub Gistへアップロードしてあります。実装時の参考にしてください。後はこのコードを時間(1時間、1分など)単位のトリガーにセットしておけば自動的にバックアップを取ってくれるようになります。

データの削除は検知できないので注意してください(徐々に件数がずれていくでしょう)。また、過去のデータに戻ることもできないので注意が必要です(スクリプトを変更すれば大丈夫ですが)。データストアのデータをエクスポートして分析されていた方は、この方法を使えば手軽になるのではないでしょうか。