33
27

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2018-11-27

概要

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!

参照文献

33
27
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
33
27

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?