やったこと
タイトル通り、Google Formで回答を受け付けたらそれをSlackに通知します。 大体の手順は以下のような感じ。
- Google FormでFormの用意。また、回答をSpreadSheetに出すようにしておく。
- Slackのincoming webhookの用意をする。
- 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
で出来たという備忘録として残します。