UUUM攻殻機動隊(エンジニアブログ)

UUUMのエンジニアによる技術ブログです

Google Apps Script で Kintone API のライブラリ作った

おはこんばんちは!! 尾藤 a.k.a. BTO です。

みなさん、Google Apps Script 書いてますか〜。 Cybozu の Kintone 使ってますか〜。

Cybozu の Kintone ってちょっとした業務アプリを手軽に作るのに便利なんですよね。 弊社でも社内の情報を管理するのに Kintone 使ってます。

一方で、 Kintone ってプログラミングは必要ないんだけど、やっぱりシステムの知識がある程度ないと使いこなすのは難しいですよね。 なので、情シスで対応できないところは Google Spreadsheet でデータの管理をしていたりします。

そうすると欲しくなりますよね。 Kintone とデータ連携するためのツールが!! というわけで、Google Apps Script で Kintone API 用のライブラリを作りました〜!!(パチパチパチパチ

Google Apps Script Kintone Library

せっかくなので、必要な方に使ってもらおうと思って、公開しました〜。

gas-kintone

使い方

詳しい使い方は README.mdをご覧ください。

それだけだと寂しいので、簡単なサンプルスクリプト貼っておきます。

var subdomain = 'subdomain';
var appId = 1;
var apiToken = 'xxxx';
var kintone = new Kintone(subdomain, appId, apiToken);

// レコード作成
var id = kintone.recordCreate({foo: 'bar'});
alert(id);

// レコード取得
var record = kintone.recordGet(id);
alert(record.foo);

// レコード更新
var revision = kintone.recordUpdate(id, {foo: 'baz'});
alert(revision);

// レコード削除
var result = kintone.recordDelete(id);
alert(result);

開発はローカルでできるようにする

この Kintone ライブラリを開発するにあたっていくつか工夫した点を書いておきます。

まず Google Apps Script は ES5(Javascript) です。 なので、Nodejs との親和性が高く、開発環境の構築は Nodejs のツールでやるのが良いです。

Google Apps Script はデフォルトで Google が Script Editor を用意してくれています。 これ自体は悪くはないですが、やはりローカルで自分の好きな環境で開発したいですよね。 そこで、ローカルで開発して、Google Apps Script にディプロイして動作確認をするやり方をとりました。

ローカルからディプロイ

ローカルで開発するにあたって、最も重要なのは、Google Apps Script のプロジェクトにどうやってディプロイするかです。 Google Apps Script は Google Drive 上に存在しており、Google Drive API 経由で書き換えが可能です。 この仕組みを使って Google Apps Script をディプロイするツールがいくつか公開されています。 gas-kintone では、Google の公式ツールである node-google-apps-scriptを使いました。

node-google-apps-script の使い方は割愛しますが、Google Drive API 経由でアクセスするため、Google Drip API の権限を持った認証キーを使えば、ローカルで編集したファイルをコマンドラインからディプロイできるようになります。

ユニットテスト

ユニットテストは GasTというライブラリを使いました。 Google Apps Script のユニットテストのライブラリはいくつかあるのですが、継続的にメンテナンスされているものがなく、高機能なものよりもシンプルで安定的に使えそうなものを選びました。

こんな感じのユニットテストを実行するための関数を定義しておきます。

function testRunner() {
  var test = new GasTap();

  var functions = testRunner.functions;
  for (var i = 0; i < functions.length; i++) {
    functions[i](test);
  }

  test.finish();
}

testRunner.functions = [];

そして他のファイルから、この testRunner.functions に追加すれば勝手に実行されるテストとして登録される仕組みです。

testRunner.functions.push(function (test) {
  // ここにテストを書く
});

ディプロイした後に、Google Apps Script プロジェクトにアクセスして testRunner を実行すれば、登録したテストが実行されます。 テストの実行結果はログで確認できます。

f:id:masatobito:20170623172125p:plain

最後の行で、82のテストを実行して、失敗が0だったのがわかります。

ユニットテストの実行のところは、コマンドラインで完結してなくてブラウザにアクセスしないといけないのでちょっとかったるいです。 ですが、Google Apps Script は Google の環境でしか実行できないので、ある程度は仕方がないです。

ちなみに GasT には syslog にログを吐き出す機能も持っているので、syslog でログを受け取るサーバを立てれば、もう少し自動化できるんじゃないかと思います。

eslint でコードチェック

Google Apps Script は ES5 なので、Nodejs で使われてるコードチェックツールがそのまま使えます。 なので、 eslint でコードチェックをするようにしました。 特にこだわりはないので、 airbnb-es5 をノンカスタマイズで使っています。

{
  globals: {
    // Google Apps Script
    PropertiesService: true,
    UrlFetchApp: true,

    // Test Library
    GasTap: true,

    // Our classes
    Kintone: true,
    KintoneClient: true,
    KintoneError: true,
    KintoneResponse: true,

    // test function
    testRunner: true,
  },
  extends: 'airbnb-es5',
}

固有値は Script properties に突っ込む

Kintone API 用のライブラリなので、テストの実行には実際に Kintone の API を叩く必要があります。 Kintone API を叩くには、実際にそのアプリが存在していないといけないし、アクセスするための APIトークンが必要になってきます。 例えテストプログラムといえども、この固有値をプログラムの中には埋め込みたくないですよね。 そこで、固有値に関しては、Google Apps Script の Script properties に保存するようにしています。

Script properties の値は Google Apps Script からアクセスできるクラスが準備されているので簡単に取り出すことができます。

まとめ

UUUM の社員旅行(任意参加)では石垣島に行けます!!

f:id:masatobito:20170623173301j:plain