前提・実現したいこと
Googleフォームで,定員のある選択肢のある質問を2つ以上作成したいです。
試したこと
https://qiita.com/GMA/items/e672c18b09d84c753973 このリンクの方法を2個ならべました。選択肢の作成・更新は,2問ともできましたが,定員のある選択肢とはなっていませんでした。
スプレッドシートには,シートを分けて,「フォームの回答」「候補A」「候補B」を作りました。
////
// 【基本設定】
// ここを編集するだけで使用できます
////
//「https://docs.google.com/spreadsheets/d/xxx/edit」のxxxを入れてください
var spreadSheetID = 'xxx';
// 候補日と定員を書くシート名
var sheetName = '候補A';
// 回答のシート名
var answerSheetName = 'フォームの回答';
// 定員のある項目の名前
var questionName = 'Aの利用希望(各日定員50名です。)';
////
// 【フォームを更新する関数】
////
function updateForm(){
////
// 【スプレッドシートの情報を取得】
// 候補と定員を取得し、定員に満たない候補のみを取得します
////
// スプレッドシートをIDで取得
var sheets = SpreadsheetApp.openById(spreadSheetID);
// 候補と回答のシートを取得
var sheet = sheets.getSheetByName(sheetName);
var answerSheet = sheets.getSheetByName(answerSheetName);
// 候補のシートのA行の2行目から下の値を配列で取得する
var sheetLastRow = sheet.getLastRow();
if (sheetLastRow > 1) {
// 候補と定員を取得
var candidate = sheet.getRange(2, 1, sheetLastRow - 1, 2).getValues();
} else {
return;
}
// 回答のシートの2行目から下の値を配列で取得する
var answerSheetLastRow = answerSheet.getLastRow();
if (answerSheetLastRow > 1) {
var questionNames = answerSheet.getRange(1, 1, 1, answerSheet.getLastColumn()).getValues();
var colCount = questionNames[0].indexOf(questionName);
// 必要な部分だけ取得
var answerData = answerSheet.getRange(2, colCount + 1, answerSheetLastRow - 1).getValues();
}
////
// 【Googleフォームの選択肢の上書き】
////
// フォームの取得
var form = FormApp.getActiveForm();
// 質問項目をすべて取得
var items = form.getItems();
// 選択肢の作成、更新
items.forEach(function(item){
// 質問項目がquestionNameの項目を探す
if(item.getTitle() === questionName){
var listItemQuestion = item.asListItem();
// 選択肢を入れる配列
var choices = [];
// 候補日を一つ一つ見ていく // nameAndCapacity[0]が候補日、nameAndCapacity[1]がその定員 candidate.forEach(function(nameAndCapacity){ if(nameAndCapacity[0] != ""){ // 定員無制限かどうか。また、回答が一件もない場合もこっち if (answerData == null || nameAndCapacity[1] == 0 || nameAndCapacity[1] == ""){ choices.push(listItemQuestion.createChoice(nameAndCapacity[0])); } else { // 定員がある場合は定員以上になっていないか確認 var counter = 0; // 何人分キャパが埋まっているかカウント for(var i = 0; i < answerData.length; i++){ if (nameAndCapacity[0] == answerData[i]){ counter++; } } // まだキャパがあれば選択肢に追加 if (counter < nameAndCapacity[1]){ choices.push(listItemQuestion.createChoice(nameAndCapacity[0])); } } } }); if (choices.length > 0) { // フォームの回答を受け付ける form.setAcceptingResponses(true); // 選択肢を上書き listItemQuestion.setChoices(choices); } else { // 満員につき、回答受付終了 form.setAcceptingResponses(false); } return; }
});
}////
// 【基本設定(2問目の質問)】
//
////
//「https://docs.google.com/spreadsheets/d/xxx/edit」のxxxを入れてください
var spreadSheetID = 'xxx';
// 候補日と定員を書くシート名
var sheetName2 = '候補B';
// 回答のシート名
var answerSheetName = 'フォームの回答';
// 定員のある項目の名前
var questionName2 = 'Bの利用希望(各日定員30名です。)';
////
// 【フォームを更新する関数】
////
function updateForm(){
////
// 【スプレッドシートの情報を取得】
// 候補と定員を取得し、定員に満たない候補のみを取得します
////
// スプレッドシートをIDで取得
var sheets = SpreadsheetApp.openById(spreadSheetID);
// 候補と回答のシートを取得
var sheet2 = sheets.getSheetByName(sheetName2); //「Sheet2」とした
var answerSheet = sheets.getSheetByName(answerSheetName);
// 候補のシートのA行の2行目から下の値を配列で取得する
var sheetLastRow = sheet2.getLastRow(); //「Sheet2」とした
if (sheetLastRow > 1) {
// 候補と定員を取得
var candidate = sheet2.getRange(2, 1, sheetLastRow - 1, 2).getValues(); //「Sheet2」とした
} else {
return;
}
// 回答のシートの2行目から下の値を配列で取得する
var answerSheetLastRow = answerSheet.getLastRow();
if (answerSheetLastRow > 1) {
var questionNames = answerSheet.getRange(1, 1, 1, answerSheet.getLastColumn()).getValues();
var colCount = questionNames[0].indexOf(questionName);
// 必要な部分だけ取得
var answerData = answerSheet.getRange(2, colCount + 1, answerSheetLastRow - 1).getValues();
}
////
// 【Googleフォームの選択肢の上書き】
////
// フォームの取得
var form = FormApp.getActiveForm();
// 質問項目をすべて取得
var items = form.getItems();
// 選択肢の作成、更新
items.forEach(function(item){
// 質問項目がquestionNameの項目を探す
if(item.getTitle() === questionName2){ //「questionName2」とした
var listItemQuestion = item.asListItem();
// 選択肢を入れる配列
var choices = [];
// 候補日を一つ一つ見ていく // nameAndCapacity[0]が候補日、nameAndCapacity[1]がその定員 candidate.forEach(function(nameAndCapacity){ if(nameAndCapacity[0] != ""){ // 定員無制限かどうか。また、回答が一件もない場合もこっち if (answerData == null || nameAndCapacity[1] == 0 || nameAndCapacity[1] == ""){ choices.push(listItemQuestion.createChoice(nameAndCapacity[0])); } else { // 定員がある場合は定員以上になっていないか確認 var counter = 0; // 何人分キャパが埋まっているかカウント for(var i = 0; i < answerData.length; i++){ if (nameAndCapacity[0] == answerData[i]){ counter++; } } // まだキャパがあれば選択肢に追加 if (counter < nameAndCapacity[1]){ choices.push(listItemQuestion.createChoice(nameAndCapacity[0])); } } } }); if (choices.length > 0) { // フォームの回答を受け付ける form.setAcceptingResponses(true); // 選択肢を上書き listItemQuestion.setChoices(choices); } else { // 満員につき、回答受付終了 form.setAcceptingResponses(false); } return; }
});
}
あなたの回答
tips
プレビュー