Google Apps Script を WebHook の レシーバとして動作させる(ただしGETに限る)

こんにちは、Dozensの松田です。こちらのブログはすっかりご無沙汰しておりました。相変わらずの三日坊主ぶりですみません。

Google Apps Script って超便利。

さて、以前、「Google Apps ScriptでWeb死活監視」という記事でGoogle Apps Script を使ったスクリプトを紹介したわけですが、 Google Apps Script 便利ですよね。JavaScriptで気軽に書けて、URLのフェッチとかスプレッドシートに何か書くとかメールを送信するとか、ちょっとしたことだったら簡単に実装できてしまいます。トリガーで定期的に実行もできるので、Cron的なことも可能です。Google のプラットフォーム上で動いてくれるので、サーバが止まってしまったらどうしよう的な不安も(かなり)解消されます。というわけで僕はGoogle Apps Scriptがかなり好きです。

Google Apps Script のちょっぴり残念な部分(と思ってたこと)

ただ今までちょっと残念だったのは、外部からのキックでスクリプトを動作させること、即ちWebHook的なことをするための実装が特に用意されてない(ように見える)ことでした。

WebHookは最近のWeb系サービスではよく実装されているので、使うことができれば他のサービスとGoogle Apps Scriptを連携させることも出来るようになってより便利ですよね。なのになんでないのだろう…昔は私もそう思ってました。そう、この機能をGoogle Apps Scriptで実装する方法を発見するまではね。

これがWebHookのレシーバにする方法だ!

そうです、発見したのです、Google Apps Scipt を WebHookのレシーバとして動作させる方法を!

というわけでそのやり方を紹介してみたいと思います。よろしくお願いいたします。

と言っても、そのやり方は存外簡単です。ざっと書くと

  1. Google Apps Scriptで実装したい内容を関数で実装する
  2. 適当なHTMLを書く
  3. Google Apps Scriptをウェブアプリケーションとして実装する
  4. ウェブアプリケーションが起動するときに1の関数を実行するようにする
  5. ウェブアプリケーションを公開する
  6. ウェブアプリケーションのURLを叩く(ただしGETに限る)

こんなかんじです。こう書いてみると単純ですが、コロンブスの卵といいますか、今まで全然気づきませんでした。予め残念というか、あれなのは、GitHubとか多くのメジャーなWebHookはPOSTなんですよね。まだPOSTで受け付ける方法が見えてないのでとりあえず今回はGETで受ける方法です。POSTのほうはなかなか難しいのではないかと思いますが、引き続き研究してみます。

しかしGETでも出来るのは便利です。というわけで上に書いた手順をもうちょっと詳しく順を追って書いていってみますね。

まずは関数の実装

これはまあ色々ですね。サンプル的にこんな関数を書いてみました。単にスプレッドシートに日時を追記していくだけの関数です。



This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters


function doFunction()
{
var ss = SpreadsheetApp.openById("XXXXXXXXXXXXXXXXXXXXXXXXXXXX"); //SpredsheetのIDに書き換えてください
var sheet = ss.getSheetByName('sheetname');
sheet.appendRow([Utilities.formatDate(new Date(), "Asia/Tokyo", "yyyy/MM/dd HH:mm:ss")]);
}

細かい点としては、 Utilities.formatDate() で タイムゾーンと日時表記のフォーマットを指定するんですが、それぞれ、こちらこちらをご覧いただくと良いみたいです。

HTMLを用意する

次はHTMLです。これも単にWebHooksでアクセスする先を作るだけなので、取り敢えずなんでもいいです。index.html という名前で <h1>Hello World</h1> とするファイルを書いただけにしました。ひとつ注意点としては、 Google Apps Script上でのHTMLファイルの追加方法です。メニューから「ファイル」-「新規作成」-「HTMLファイル」で作成できます。スクリーンショットも念のためつけておきます。

スクリーンショット 2014-04-28 15.26.10

Google Apps Scriptのウェブアプリケーション化

次はWebアプリケーションとして動作させる方法です。これもそんな難しいものではないです。

まずはコード.gsの中で、doGet() コマンドを実装します。このなかで先ほど実装した関数を呼び出すようにします。スクリプトの全体像はこんなかんじ。簡単ですね。



This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters


function doGet()
{
doFunction();
return HtmlService.createHtmlOutputFromFile('index');
}
function doFunction()
{
var ss = SpreadsheetApp.openById("XXXXXXXXXXXXXXXXXXXXXXXXXXX");
var sheet = ss.getSheetByName('sheet1');
sheet.appendRow([Utilities.formatDate(new Date(), "Asia/Tokyo", "yyyy/MM/dd HH:mm:ss")]);
}
view raw

doGet.js

hosted with ❤ by GitHub

HtmlService.createHtmlOutputFromFile(‘index’)でindex.htmlがアウトプットとして返されます。

そして「ファイル」-「版の管理」で最新状態を版として確定させます!

スクリーンショット 2014-04-28 15.32.32

 ウェブアプリケーションを公開する

さあいよいよ公開です。メニューの「公開」-「ウェブアプリケーションとして導入」で先ほどの「版の管理」で指定したバージョンを選択してください。公開先を「アプリケーションにアクセスできるユーザ」を「全員(匿名ユーザを含む)」を選ばないと後悔しますね。

スクリーンショット 2014-04-28 15.34.51

ここで表示されるURLがこのウェブアプリケーションのURLになります!ユニークで長いURLになるので、通常は誰かに伝えなければ誰もアクセスしてこないURLになると思います。

URLにアクセス!

あとはこのURLにアクセスするだけ。ブラウザからアクセスすると当然HelloWorldだけ表示されるわけですが、日時出力先のGoogle SpreadSheetを見てみると!

じゃじゃーん。

スクリーンショット 2014-04-28 15.47.39

日時が追加されてる!すばらしい。レシーバの完成です。

Google Apps Sciriptで夢が広がる(…ただしGETに限る)

というわけでGoogle Apps ScriptでのWebHooksレシーバの実装方法でした。(自分にとっては)コロンブスの卵的な偉大な発見でした。これができるとなると、色々応用がきいてきます。

たとえば僕はZoho CRMをよく使っているのですが、Zoho CRMからのWebHooksでGoogle Apps Script から Zoho CRM のAPIを叩いて、データをスプレッドシートで集計したり、場合によってはCRMのデータを更新したり、さらにそれを誰かにメールしつつ、Google Tasksにタスクとして追加するとか… Zoho CRMのWebHookはGETでもPOSTでも指定できるのでよかったです。

今調べているかんじではPOSTでも受けられそうな雰囲気なので、もうちょっと調べて次回の記事にしたいと思います。

 

  • WordPress.com で次のようなサイトをデザイン
    始めてみよう