Help us understand the problem. What is going on with this article?

Google Formのサブミット時にGoogle Apps Scriptで値を取得する(Slackに通知するサンプルコード付)

概要

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!

参照文献

https://developers.google.com/apps-script/guides/triggers/events#form-submit_4

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away