【Google Apps Script (GAS)】Googleフォームの回答状況をメールで送信する

2021年5月29日

Googleフォームは回答状況をフォーム編集画面の「回答」タブから確認することができます。
回答別、質問別など色々な角度からデータを確認することができます。

しかし、Googleフォームはスマホでのアプリを提供しておらず、スマホのブラウザでも開くことができないので、集計状況をパッとスマホで確認したくてもできない状態なのです。
(スプレッドシートにデータ連携していればそちらからでも確認できますが・・・)

そこで、Googleフォームの回答状況をメールで自分に向けて送信するプログラムを作ってみましたので、作り方を解説していこうと思います。
なお、本記事では、「回答状況を収集するしてメールを送信する」プログラムを解説していますが、プログラムを実行するためのGoogleフォームはあくまで例なので、用途に合わせて作り換えてください。

プログラムの仕様は下記のとおりで、Googleフォームでバッチ実行画面を簡単に作る!で紹介しているように別のGoogleフォームから呼び出すようにすると、スマホから実行できるようになります。
メールの送信先をスマホで確認できるメールアドレスにすることで、スマホでも確認できるようになります。

プログラムの仕様

  • 回答状況を集計したいGoogleフォームを指定する
  • メール形式にまとめて、自分に送る
注意点

対象のフォームはGoogleフォームであればどんなフォームでも良いのですが、集計するフォームには「お名前」の質問が必須項目となります。

プログラムを実行するためのフォームを作成する

募集に使用しているGoogleフォームとは別にGoogleフォームを作ります。
Webブラウザで表示できればなんでも良いので、スタンドアロンのGoogle Apps Scriptを作成してWebアプリケーションとして公開しても良いですが、Google Apps Scriptプログラムが簡単に実行でき、Web画面も簡単にできるのでGoogleフォームを使用するのがオススメです。

集計状況取得画面として使うフォームを作る

Googleフォームを立ち上げて、「メールアドレス」と「集計するフォーム」を指定する入力欄を作ります。
Googleフォームの作成方法については、Googleフォームの作り方とScriptでの回答の取得方法で解説しています。

実行のためのフォーム

入力項目としては「メールアドレス」と「どのイベントを集計するか」で十分かと思います。
「メールアドレス」は集計状況の収集結果を送信する宛先アドレスを入力してもらうようにします。
「どのイベントを集計するか」はプルダウン式にして選択させるようにすることで誤入力を防止します。

集計状況取得画面のプログラム

Googleフォームで作った「集計状況取得画面」にスクリプトを記述していきます。
まずは、プログラムを記述するために「メニュー」->「スクリプトエディタ」からスクリプトエディタを起動します。

後述する「状況収集プログラム」を実行するためのプログラムを記述します。
入力フォームで入力した値を受け取り、受け取った値を元に適切なパラメータを「状況収集プログラム」の呼び出しに設定します。

function myFunction(e) {
  var mail = '';
  var kbn = '';
  //回答のオブジェクトを取得
  var itemResponses = e.response.getItemResponses();
  
  //回答内容を取得
  for (var i = 0; i < itemResponses.length; i++) {
    var itemResponse = itemResponses[i];
    var question = itemResponse.getItem().getTitle();
    var answer = itemResponse.getResponse();
    
    if (question == 'メールアドレス'){
      mail = answer;
    }
    if (question == 'どのイベントの集計状況を取得しますか?'){
      kbn = answer;
    }
  }

  if ( kbn == '応募フォーム' ) {
    var formId = 'abcdefghijklmnopqrstuvwxyz'; // GoogleフォームのIDを指定する
  }
  
  // 回答状況を集計し、メールで送信する
  aggregateApplicant(formId, mail);
}

「どのイベントの集計状況を取得しますか?」の質問で選択された内容を基にして、募集しているGoogleフォームのIDを「状況収集」プログラムのパラメータに設定しています。

状況収集プログラム

「集計状況取得画面」ができたら、「状況収集プログラム」を作成していきます。

画面からの入力であるformIdを使って送信データと回答データを取得して欲しいデータを集め、同じく画面からの入力であるmailAddressの宛先に集計結果を送付します。

スクリプトエディタの「ファイル」からスクリプトファイルを追加して、下記のプログラムをコピー&ペーストで貼り付けます。

/**
 * 任意のフォームの応募者の一覧と総人数をメールで送信する
 * @param formId 集計対象の応募フォームID
 * @param mailAddress 送信先メールアドレス
 * @return なし
 */
function aggregateApplicant(formId, mailAddress) {
  var message = '';
  var applicantList = '';
  
  // フォームIDからフォームを開く
  var form = FormApp.openById(formId);
  for (var i=0; i<form.getResponses().length; i++) {
    var response = form.getResponses()[i];
    for (var j=0; j<response.getItemResponses().length; j++) {
      var itemResponse = response.getItemResponses()[j];
      var question = itemResponse.getItem().getTitle();
      var answer = itemResponse.getResponse();
      var applicant = '';
      if (question == 'お名前'){
        applicant = answer;
      }

      if (applicant != '') {
        if (applicantList != '') {
          applicantList = applicantList + '\n';
        }
        applicantList = applicantList + applicant;
      }
    }
  }
  
  // メール本文を作成する
  message += '応募者の一覧です。\n\n';
  message += '応募者人数:' + form.getResponses().length + '人\n\n';
  message += '応募者一覧\n';
  message += '*-----------------------*\n';
  message += applicantList + '\n';
  message += '*-----------------------*\n';
  
  // メールを送信する
  GmailApp.sendEmail(mailAddress, '集計結果', message);
}

プログラムの解説

本プログラムはgetResponses()getItemResponses()のメソッドがポイントになります。
getResponses()はフォームに記録されている送信データを全て取得します。送信データが取得できたら、getItemResponses()を使って、回答データ(質問と回答のペア)を取得します。

質問データが取得できたら、質問と回答内容にしたがって、処理を進めていくプログラムになっています。

メソッド名説明
getResponses()フォームの全ての送信データを配列で取得する。
getItemResponses()フォーム送信データに含まれるすべての質問データを取得します。
(取得した質問データの順序はフォームに表示される順序)
ポイントとなるメソッドの説明

送信データ、回答データを取得する

全ての送信データ、全ての回答データについてfor文を使って一つ一つ確認していき、「回答した人の一覧」を作っていきます。

// フォームIDからフォームを開く
var form = FormApp.openById(formId);
for (var i=0; i<form.getResponses().length; i++) {
  var response = form.getResponses()[i];
  for (var j=0; j<response.getItemResponses().length; j++) {
    var itemResponse = response.getItemResponses()[j];
    var question = itemResponse.getItem().getTitle();
    var answer = itemResponse.getResponse();
    :
    :
  }
}

回答データ一つ一つについてif (question == 'お名前')といったようにif文を使って、「もし質問が"お名前"だったら、○○しなさい」と記述します。
このプログラムの場合は、質問が「お名前」だったら、applicantの変数に回答を保持します。
同様にプログラム中にはif文で記述されている箇所が3つあります。

質問と回答内容に応じた処理

  • 「メールアドレス」 => 集計結果のメール送付先
  • 「どのイベントの集計状況を取得しますか?」 => 集計するフォームを特定する
  • 「お名前」 => 応募者を一覧化してメールに載せる

メールを送信する

最後にメール本文を作成して、メールを送信します。
Gmailを使ったメールの送信方法やメール本文をテンプレート化する方法については、下記の記事で解説していますので参考にしてみてください。

集計するデータや、メールの送信内容はサンプルですので、欲しい情報にカスタマイズしてもよいと思います。
報告などに使用する際は、送信する内容をツールで生成してしまうと時間短縮になります。

参考

まとめ

Googleフォームの回答状況を集計して、メールで送付するプログラムを解説しました。
プログラムの仕様は大まかに次の2点です。

プログラムの仕様

  • 回答状況を集計したいGoogleフォームを指定する
  • メール形式にまとめて、自分に送る

このプログラムはgetResponses()getItemResponses()のメソッドが2つのフォームで実行されるので、混乱するかもしれません。
肝は「どのフォームに対して実行しているのか」を捉えられるかどうかだと思います。

このツールを作っておくと、下記のようなメリットがありますので、是非作ってみてください。

  • スマホで投稿フォームの回答状況を確認できる
  • メール文章を工夫すれば、報告用に使用できる