ESM アジャイル事業部 開発者ブログ

永和システムマネジメント アジャイル事業部の開発者ブログです。

Google Apps Script で esa.io の記事を更新する

こんばんは。 @hrysd です。

弊事業部には @takkanm が管理しているアカウントリストというスプレッドシートがあります。 これには、メンバーが各サービスで使用しているアカウント名等が集約されていて新しいメンバーが増えた時なんかに更新されています。

スプレッドシートどこにあるの問題

スプレッドシートの URL を覚えていないので、どこにあるのか全く見当がつかないという理由から、 日常的に使用している esa.io に貼り付てみました。

f:id:hrysd:20160729185145p:plain

これだとスプレッドシートの内容で検索する事が出来ないため、Google Apps Script を使用してスプレッドシートの中身と記事の更新を連動させたいと思います。

Google Apps Script を書く

スプレッドシートを開きツールバーツール > スクリプト エディタ を開く事で Web 上から編集を行う事も出来ますが、npm のモジュールを使用したい等の理由から手元のTerminalで作成していきます。

$ mkdir post_to_esa && cd post_to_esa
$ npm init -y
$ npm install -D browserify gasify
$ npm install -S markdown-table

実際に記述したコードが以下になります。 内容としてはスプレッドシートをマークダウン形式のテーブルに変換して、esa.io の記事を更新するというものです。(POST_ID と ACCESS_TOKEN をベタに書いているけど、うまい方法がわからなかった...)

var table = require('markdown-table');

var POST_ID = 12345;
var ACCESS_TOKEN = 'ACCESS_TOKEN';

global.myFunction = function() {
  var sheet  = SpreadsheetApp.getActive().getSheetByName('シート1');
  var rows   = sheet.getDataRange().getValues();

  var stringifiedPayload = JSON.stringify({
    post: {
      name:       'アカウントリスト',
      body_md:    table(rows),
      tags:       [],
      category:   '',
      wip:        false,
      message:    '情報量が増えました',
      updated_by: 'esa_bot'
    }
  })

  UrlFetchApp.fetch(
    'https://api.esa.io/v1/teams/esminc/posts/POST_ID?access_token=ACCESS_TOKEN',
    {
      method:      'PUT',
      contentType: 'application/json',
      payload:     stringifiedPayload
    }
  );
}

これをコンパイルし、中身をスクリプトエディタに貼り付けます。

$ $(npm bin)/browserify main.js -p gasify -o bundle.gs

スプレッドシート更新のタイミングでスクリプトが動くようにする

スクリプトエディタを開き、ツールバーリソース > 現在のプロジェクトのトリガー より設定していきます。 今回は、更新時にスクリプトが呼ばれるようにしたました。

f:id:hrysd:20160729185351p:plain

結果

スプレッドシートを更新する事で自動的に esa.io の記事も更新されるようなりました。(モザイク処理には Pixelmator を使用)

f:id:hrysd:20160729185313p:plain

最後に

Google Apps Script を使う事で簡単にサービス間での連携を行う事ができました。生成物をコピーアンドペーストしている箇所がいけてない感が強いので、スクリプトをローカルで管理できる soundTricker/gas-manager みたいなのも試してみたいです。

参考