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

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

Google Apps Scriptのトリガーを使ってスクリプトを自動テストする

f:id:mbaasdevrel:20200310172712p:plain

スクリプト機能を使うことで、本来mBaaSでは提供されていない機能を呼び出せるようになります。言語もNode.jsやRubyが使えるので、サーバサイド開発のようにmBaaSの機能を拡張できます。

そんなスクリプトを使ってデータの自動更新などを行っているケースは多いですが、サーバサイドの処理になるのでエラーが出ていても分かりづらいという問題があります。そこで今回はGoogle Apps Scriptを使ってスクリプトを自動テストしてみたいと思います。

Googleスプレッドシートについて

Googleスプレッドシートではスクリプトを列挙し、さらに設定するクエリー、ヘッダー、ボディをそれぞれ指定します。そして最後に期待するレスポンスを書いておきます。

f:id:mbaasdevrel:20200310172712p:plain

Google Apps Scriptについて

Google Apps Scriptでの実装です。まずスプレッドシートのオブジェクトを取得します。

const ss = SpreadsheetApp.getActiveSpreadsheet();
const sh = ss.getSheetByName('testResult');

次にmBaaSを初期化します。ライブラリのIDは 1Z8Lezd0OS6qm9W0EVQxBGx1gztqD14kXPfQxycr_rc2atOfKujiWZe7I になります。

const applicationKey = 'b6f...ee6';
const clientKey = '955...202';
const ncmb = NCMB.init(applicationKey, clientKey);

次にスプレッドシートの上から順番に読み込んでいきます。

const lastRow = sh.getLastRow();
let lastColumn = sh.getLastColumn() + 1;
sh.getRange(1, lastColumn).setValue(new Date);
for (let row = 2; row <= lastRow; row++) {
  const values = sh.getRange(row, 1, row, 6).getValues()[0];
  const script = values[0];
  const method = values[1];
  const query  = values[2] !== "" ? JSON.parse(values[2]) : {};
  const headers  = values[3] !== "" ? JSON.parse(values[3]) : {};
  const body  = values[4] !== "" ? JSON.parse(values[4]) : {};
  const success = values[5];
  // 処理が続きます
  
}

必要な情報を得たら、スクリプトを実行します。そして結果を期待したレスポンスと比較して、成否を判断します。結果はスプレッドシートに記録されていきます。

const response = ncmb
  .Script()
  .set(headers)
  .query(query)
  .data(body)
  .exec(method, script);
if (success === JSON.stringify(response)) {
  sh.getRange(row, lastColumn).setValue('成功');
} else {
  sh.getRange(row, lastColumn).setValue('失敗');
}

トリガーを設定する

完了したら、トリガーを設定します。今回の場合、1日1回実行されるのを想定しています。

f:id:mbaasdevrel:20200310172734p:plain

注意点

今回のレスポンスは固定値で返ってくるのを想定しています。レスポンスが変化する場合には、入っていて欲しいJSONキーを指定して成否を判断するなど、カスタマイズしてみてください。失敗時にはスプレッドシートに記録するだけでなく、メールやプッシュ通知、またはSlackへの通知を活用してもよさそうです。

コードについて

コード全体は次のようになります。実装時の参考にしてください。

function scriptTest() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sh = ss.getSheetByName('testResult');
  
  const applicationKey = 'b6f...ee6';
  const clientKey = '955...202';
  const ncmb = NCMB.init(applicationKey, clientKey);
  
  const lastRow = sh.getLastRow();
  let lastColumn = sh.getLastColumn() + 1;
  sh.getRange(1, lastColumn).setValue(new Date);
  for (let row = 2; row <= lastRow; row++) {
    const values = sh.getRange(row, 1, row, 6).getValues()[0];
    const script = values[0];
    const method = values[1];
    const query  = values[2] !== "" ? JSON.parse(values[2]) : {};
    const headers  = values[3] !== "" ? JSON.parse(values[3]) : {};
    const body  = values[4] !== "" ? JSON.parse(values[4]) : {};
    const success = values[5];
    const response = ncmb
      .Script()
      .set(headers)
      .query(query)
      .data(body)
      .exec(method, script);
    if (success === JSON.stringify(response)) {
      sh.getRange(row, lastColumn).setValue('成功');
    } else {
      sh.getRange(row, lastColumn).setValue('失敗');
    }
  }
}

まとめ

mBaaSではタイマー機能がないので、Google Apps Scriptのトリガーを使うのが一番手軽な方法になるかと思います。テスト実行した結果も蓄積できれば、スクリプトが正常に動いているかどうかもすぐに分かるでしょう。

中津川 篤司

中津川 篤司

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