GoogleAppsScriptでGoogleフォームをいじった話 - sayonari/memo GitHub Wiki
おはなし
Googleフォームで,学会参加フォームをつくってて, オンライン参加,オフライン参加 をラジオボタンで選ぶようにしてあった.
- オンライン参加 (定員500名)
- オフライン参加 (定員200名)
こんな感じで.
で,各項目に人数制限して,
- 定員に達したらその項目はアンケートを締め切り,
- 全部の項目が定員になったら,アンケート自体を閉じる.
というふうにしたくて,ググって以下のブログを発見して実現したけど, プログラムがもっさりしてたので, スッキリさせた っていう話.
参照したブログ
以下のブログで勉強させてもらいました.
著者:河野由香 博士(工学)
ブログタイトル: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);
}
}
}
}