GoogleAppsScriptでGoogleフォームをいじった話 - sayonari/memo GitHub Wiki

おはなし

Googleフォームで,学会参加フォームをつくってて, オンライン参加,オフライン参加 をラジオボタンで選ぶようにしてあった.

  • オンライン参加 (定員500名) 
  • オフライン参加 (定員200名)

こんな感じで.

で,各項目に人数制限して,

  1. 定員に達したらその項目はアンケートを締め切り,
  2. 全部の項目が定員になったら,アンケート自体を閉じる.

というふうにしたくて,ググって以下のブログを発見して実現したけど, プログラムがもっさりしてたので, スッキリさせた っていう話.

参照したブログ

以下のブログで勉強させてもらいました.

著者:河野由香 博士(工学)
ブログタイトル:Yuka Life
記事タイトル:Googleフォームで回答数により選択肢を変更する
https://yukaobu.wordpress.com/2016/10/23/googleform-2/

フォームとスクリプト

テスト用フォーム(スクリプト実装済み) 

https://forms.gle/tBsSTq5WQRveHuUF6

スクリプト

function limitCheck() {
  // 各種設定 /////////////////////////////////////////////////////
  var LIMIT = [200, 300];         // ここで数上限を設定
  var QUESTION = '食べたいもの';    // 対象の質問を指定
  var answerList = ['りんご', 'みかん'];

  // 回答数カウント用配列用意 ////////////////////////////////////////
  var answerCount = Array(LIMIT.length);    // 要素数だけ指定して配列を作成
  answerCount.fill(0);                      // 配列を0で初期化

  // フォームの内容を取得 ////////////////////////////////////////////
  var form = FormApp.getActiveForm();       // アクティブフォームを取得
  var formResponses = form.getResponses();  // 全回答内容を取得

  for (var i = 0; i < formResponses.length; i++) {
    var formResponse = formResponses[i];                    // 回答ひとつ分を取得
    var itemResponses = formResponse.getItemResponses();    // 質問項目を取得

    for (var j = 0; j < itemResponses.length; j++) {       // 回答内容をひとつずつチェック
      var itemResponse = itemResponses[j];

      var question = itemResponse.getItem().getTitle();
      var answer = itemResponse.getResponse();
      if (question == QUESTION) {                         
        for(var k=0; k<answerList.length; k++){
          if (answer == answerList[k]) { answerCount[k]++;} // 申込み数カウント
        }
      }
    }
  }

  // LIMITに達している選択肢があるかチェック //////////////////////
  var answerCountLimitCheck = 0;
  var choiceArray = [];
  for (var i = 0; i < answerCount.length; i++) {
    if (answerCount[i] >= LIMIT[i]) {
      answerCountLimitCheck++;
    } else {
      choiceArray.push(answerList[i]);
    }
  }

  // 全てLIMITなら申込みフォームを受付終了 //////////////////////
  if (answerCountLimitCheck == answerCount.length) {
    form.setAcceptingResponses(false);
  }

  // LIMITに達していない選択肢のみを選択肢として再設定する /////////
  if ((answerCountLimitCheck != answerCount.length) && (answerCountLimitCheck >= 1)) {
    var items = form.getItems();
    for (var i = 0; i < items.length; i++) {
      var item = items[i];
      if (item.getTitle() == QUESTION) {
        item.asMultipleChoiceItem().setChoiceValues(choiceArray);
      }
    }
  }
}