【Google Apps Script (GAS)】Googleフォームの集計結果をメールで送信する

2020年2月18日Google Apps

Googleフォームはスマホでのアプリを提供していないので、スマホで集計状況を確認することが困難です。
(スプレッドシートにデータ連携していればそちらからでも確認できますが・・・)

そこで、ボタン1つで集計状況を収集して、メールで送信してくれくようにしてみました。

概要

スポンサーリンク

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

作った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でGoogleフォームを取得して、回答者の人数と回答者の一覧をメールにして入力フォームに入力したメールアドレスに送付します。

集計対象はこちらで作った応募フォームを使うことにしました。

/**
 * 任意のフォームの応募者の一覧と総人数をメールで送信する
 * @param formId 集計対象の応募フォームID
 * @param mailAddress 送信先メールアドレス
 * @return なし
 */
function aggregateApplicant(formId, mailAddress) {
  var message = '';
  var applicantList = '';
  
  // フォームIDからフォームを開く
  var form = FormApp.openById(formId);
  // 回答を保存しているスプレッドシートを取得する
  var spreadSheet = SpreadsheetApp.openById(form.getDestinationId());
  var sheet = spreadSheet.getSheetByName('フォームの回答 1');
  
  // スプレッドシートの各行から応募者を取得する
  for (var row = 2; row <= sheet.getLastRow(); row++) {
    var applicant = sheet.getRange(row, 3).getValue();
    if (applicant != '') {
      if (applicantList != '') {
        applicantList = applicantList + '\n';
      }
    applicantList = applicantList + applicant;
    }
  }
  
  // メール本文を作成する
  message += '応募者の一覧です。\n\n';
  message += '応募者人数:' + (sheet.getLastRow() - 1) + '人\n\n';
  message += '応募者一覧\n';
  message += '*-----------------------*\n';
  message += applicantList + '\n';
  message += '*-----------------------*\n';
  
  // メールを送信する
  GmailApp.sendEmail(mailAddress, '集計結果', message);
}

フォームを開き、回答連携先スプレッドシートを取得する

  // フォームIDからフォームを開く
  var form = FormApp.openById(formId);
  // 回答を保存しているスプレッドシートを取得する
  var spreadSheet = SpreadsheetApp.openById(form.getDestinationId());
  var sheet = spreadSheet.getSheetByName('フォームの回答 1');

FormApp.openById()を使用し、formIdからGoogleフォームを開いて操作可能な状態にします。

form.getDestinationId()で回答を連携しているスプレッドシートのIDを取得できるので、SpreadsheetApp.openById()を使って、スプレッドシートを操作可能な状態にします。

スプレッドシートを1行ずつ処理して回答者を集計する

  // スプレッドシートの各行から応募者を取得する
  for (var row = 2; row <= sheet.getLastRow(); row++) {
    var applicant = sheet.getRange(row, 3).getValue();
    if (applicant != '') {
      if (applicantList != '') {
        applicantList = applicantList + '\n';
      }
    applicantList = applicantList + applicant;
    }
  }

for (var row = 2; row <= sheet.getLastRow(); row++)はヘッダ行を考慮してrow=2としています。

sheet.getLastRow()でスプレッドシートに入力がある最終行を取得してその行になるまで読み込みを繰り返します。

まとめ

普段スマホで作業する場合や、外出中にイベントの参加状況を知りたい場合、スタッフに周知するためのメール本文を作るなんてことにも使えるので活躍の機会は案外多いのでは?と思っています。