ほろ酔い開発日誌

AI企業のエンジニアのブログです。機械学習、Web開発の技術的お話、ビジネスチックなお話、日常のお役立ち情報など雑多な内容でお送りします。

Google Formで回答を受けたらSlackに通知する (Google Apps Script)

やったこと

タイトル通り、Google Formで回答を受け付けたらそれをSlackに通知します。 大体の手順は以下のような感じ。

  1. Google FormでFormの用意。また、回答をSpreadSheetに出すようにしておく。
  2. Slackのincoming webhookの用意をする。
  3. Google Apps Scriptを書く。

これだけ。以下の記事を見つけたのでこの記事に沿ってやりました。基本はこれを見て下さい。スクリプトの箇所はちょっと変えたので記録しておきます。あとその他説明。

http://chezou.hatenablog.com/entry/2015/03/04/003131chezou.hatenablog.com

スクリプト説明

スクリプト

最初に最終型を出します。 url とかチャンネルは変えて下さい。

function sendToSlack(body, channel) {
  var url = "https://hooks.slack.com/services/hogehoge/pogepoge";
  var data = { "channel" : channel, "username" : "form-notification", "text" : body, "icon_emoji" : ":turtle:" };
  var payload = JSON.stringify(data);
  var options = {
    "method" : "POST",
    "contentType" : "application/json",
    "payload" : payload
  };
  var response = UrlFetchApp.fetch(url, options);
}

function test() {
  var body = "test message by notification bot\n";
  sendToSlack(body, "#notification");
}

function onFormSubmit(e){
  var name = e.namedValues["氏名"]
  var body = name + "さんからの回答";
  sendToSlack(body, "#notification");
}

説明

はじめ紹介した記事の e.response.getItemResponses() の箇所でなぜかエラーが出てしまいました。undefined 的なことを言われました。それでデバックすると e の中に response がいないんですよね。

Documentには response があるっぽいのですけど。。

Event Objects  |  Apps Script  |  Google Developers

よくわからないですけど e の中にいないものはしょうがないです。 e をデバックしたら中身に namedValues というのがいたのでこれを使いました。カラム名をキーにすると値がとれます。

実行エラー等は「表示」->「実行トランスクリプト」で見れました。 あとは Logger.log('test 内容'); とかを使って、「表示」->「ログ」でデバック出来ました。

ちなみに、最初に紹介した記事でやっていることは response オブジェクトを利用して値を取り出しているのですが、以下で説明がありました。

Class FormResponse  |  Apps Script  |  Google Developers

form全体のオブジェクトをループさせるのはいいのですが、1行に対応するオブジェクトをループさせるのはちょっと気持ちわるい感がありました。

ひとまず namedValues で短く書けるし結果オーライでした。

おわりに

他の記事もあたりましたが、 e.response.getItemResponses() のエラーの記事はちょくちょくありました。 namedValues で出来たという備忘録として残します。