概要
Google Formのsubmit時にtriggerとして設定した関数からフォームの情報を取得したい。
これを達成するためドキュメントを読んだり、リバースエンジニアリング的に調査した結果をまとめておきます。
備忘録です。
コピペで使えるようなコードを記載していますので、ぜひご利用ください!
対象読者
- Google Formのsubmit時に何かしたい人
- Google Formのsubmit時にSlackに通知したい人
前提知識
Google Formのフォームサブミット時のトリガーのコールバック関数の一覧を確認しておきましょう。
参照: https://developers.google.com/apps-script/guides/triggers/events#form-submit_4
- authMode
- response
- source
- triggerUid
Google Formのフォームサブミット時のユーザが回答した内容は response
パラメータに含まれます。
回答以外の要素(タイトル、説明)などは source
パラメータに含まれます。
サンプルコード
サンプルコードを添付します。サンプルコードの解説は次の章に記載します。
function submit(event) {
var itemResponses = event.response.getItemResponses();
var order = '';
var firstName = '';
var lastName = '';
for (var i = 0; i < itemResponses.length; i++) {
var itemResponse = itemResponses[i];
var question = itemResponse.getItem().getTitle();
var type = itemResponse.getItem().getType();
var answer = itemResponse.getResponse();
if (question === 'お名前(姓)をご入力ください'){
lastName = answer;
}
else if (question === 'お名前(名)をご入力ください') {
firstName = answer;
}
if(type == 'GRID'){ // typeはEnumのため比較演算子を使う
var rows = itemResponse.getItem().asGridItem().getRows();
for(var j = 0; j < rows.length; j++){
var titleRow = rows[j];
var answerCol = answer[j];
order += titleRow + ' : ' + answerCol + '\n';
}
}
}
var message = order
message += '名前: ' + lastName + firstName + JSON.stringify(getItemSummary(event));
notifySlack({ message: message })
}
// 回答したフォームに配置されているアイテム全てをオブジェクトに変換する
function getItemSummary(event) {
var items = event.source.getItems();
var sourceSummary = [];
for (var i = 0; i < items.length; i++) {
var item = items[i]
var title = item.getTitle();
var type = item.getType() + '';
var helpText = item.getHelpText();
var summary = {
title: title,
type: type,
helpText: helpText,
}
sourceSummary.push(summary)
}
return sourceSummary
}
function notifySlack(opt) {
var WEBHOOK_URL = ''; // Slackで取得したweb hook url
var options = opt || {}
var jsonData = {
"username": options.botName || '通知',
"text": options.message || "送信テスト",
"icon_emoji": options.botIcon || ':bird:'
};
var payload = JSON.stringify(jsonData);
UrlFetchApp.fetch(WEBHOOK_URL, {"method": "post", "payload": payload});
}
サンプルコードに書いてあること
- フォームサブミット時にユーザの回答をstringに変換する
- フォームサブミット時にフォームの要素全てをobjectに変換する
- Google Formの選択式(グリッド)の内容を取得したい場合は、asGridItem関数でGridItemを取得し、全ての情報を取得する
- Google Apps ScriptからSlack通知を行いたい場合は、web hook URLを取得し、UrlFetchAppでpostする
- getType関数はEnumが返るため文字列にしたい場合は、空文字と結合することで対応する
おわりに
Google Formのsubmit時のtriggerのドキュメントを見つけるのが難しかったのと
リバースエンジニアリング的に挙動を調べ、思いの外時間が取られたのでまとめました。
参考になれば幸いです!
Happy coding!
参照文献