Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
19
Help us understand the problem. What is going on with this article?
@harhogefoo

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!

参照文献

19
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  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
harhogefoo
今日も1日がんばるぞい!
praha-inc
受託開発と自社開発を並走する「自給自足型スタートアップ」

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
19
Help us understand the problem. What is going on with this article?