知り合いから、「予約する」システムを作って欲しいと頼まれたので、検討してみました。
最終的には必要なくなったとのことだったので、そのメソッドだけ記録しておきます。
今回もGASを利用していきます。
予約可能数を指定し、入力情報を取得し、その入力情報に従って、予約可能数が埋まり次第、選択肢を消去するという流れです。
(同時、もしくはほぼ同時に入力された場合にはどうなるかは検証できていません)
function pullDowncandidateList() {
/**
// スプレッドシートの情報を取得する
//
**/
//スプレッドシートのID →「https://docs.google.com/spreadsheets/d/△△△/edit#gid=0」の△△△を↓に記述
var sheets = SpreadsheetApp.openById('----------------------------').getSheets();
// シート1の情報を取得
//(2個目のシートの情報を取得します)
var sheet = sheets[1];
// スプレッドシートのA1のセルが「候補日」の場合
if("候補日" == sheet.getRange("A1").getValue()){
// A行の2行目からコンテンツをもつ最後の行までの値を配列で取得する
var colA = sheet.getRange(2, 1, sheet.getLastRow() - 1).getValues();
}
/**
// Googleフォームのプルダウン内の値を上書きする
//
**/
// GoogleフォームのIDを設定 →「https://docs.google.com/forms/d/〇〇〇/edit」の〇〇〇を↓に記述
var form = FormApp.openById('15XpRTOjyZGoniIVPFFWeD0i_9YTE8ejEUCCHKqfJdBE');
// 質問項目がプルダウンのもののみ取得
var items = form.getItems(FormApp.ItemType.LIST);
items.forEach(function(item){
// 質問項目が「候補日を選んでください」を含むものに対して、スプレッドシートの内容を反映する
if(item.getTitle().match(/.*候補日を選んでください$/)){
var listItemQuestion = item.asListItem();
var choices = [];
colA.forEach(function(name){
if(name != ""){
choices.push(listItemQuestion.createChoice(name));
}
});
// プルダウンの選択肢を上書きする
listItemQuestion.setChoices(choices);
}
});
}
例のごとく、プルダウン を作成します。
function reverseFormCheck() {
var LIMIT_COUNT = 3; //ここで席数上限を設定
var ANSWER_LENGTH = 8; //時間帯の数
var answerCount = [0,0,0];//カウント用:時間帯の数分配列を準備します
var itemID = 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 == '摂取希望日を選んでください'){ // 申込み数カウント
if(answer == '6/30(水) 17~18時'){ answerCount[0]++; }
else if( answer == '7/4(土) 13~14時'){ answerCount[1]++; }
else if( answer == '7/7(水) 17~18時'){ answerCount[2]++; }
else if( answer == '7/10(土) 13~14時'){ answerCount[3]++; }
else if( answer == '7/14(水) 17~18時'){ answerCount[4]++; }
else if( answer == '7/17(土) 13~14時'){ answerCount[5]++; }
else if( answer == '7/21(土) 17~18時'){ answerCount[6]++; }
else if( answer == '7/24(土) 13~14時'){ answerCount[7]++; }
}
}
}
// LIMIT_COUNTになっている選択肢があるかチェック
var answerCheck = 0;
var choiceArray = [];
var arrayCount = 0;
for(var i = 0; i < ANSWER_LENGTH; i++){
// LIMIT_COUNTになっていない選択肢は残す
if ( i == 0 ){ choiceArray[arrayCount] = '6/30(水) 17~18時'; arrayCount++; }
else if( i== 1 ){choiceArray[arrayCount] = '7/4(土) 13~14時'; arrayCount++;}
else if( i== 2 ){choiceArray[arrayCount] = '7/4(水) 17~18時 '; arrayCount++;}
else if( i== 3 ){choiceArray[arrayCount] = '7/10(土) 13~14時'; arrayCount++;}
else if( i== 4 ){choiceArray[arrayCount] = '7/14(水) 17~18時'; arrayCount++;}
else if( i== 5 ){choiceArray[arrayCount] = '7/17(土) 13~14時'; arrayCount++;}
else if( i== 6 ){choiceArray[arrayCount] = '7/21(土) 17~18時'; arrayCount++;}
else if( i== 7 ){choiceArray[arrayCount] = '7/24(土) 13~14時'; arrayCount++;}
}
}
フォームのスクリプトエディタに上のスクリプトを入力して、候補日への入力が指定数に達したら、フォームの選択肢が消されるようになっています。
こんな感じで上2つの回答は指定回答回数を超えたので、表示されなくなってます。
ちなみにどうやって戻せばいいのか分からなくなってしまいました。(これ一から作り直すんか....?)
てなわけで、需要もなくなり、自分も少し行き詰まってしまったので、このプロジェクトは終了しました。
色んなことができるんだな〜と思うとともに、相談できる相手がいないのは少しきついですね。
また需要が出たり、興味が出れば、進めていきたいです。