実現したいこと
Googleフォームのスプリクトでフォームを送信すると
質問を更新するというトリガーを設定したいのですがエラーが出てしまいます。
前提
以下の条件に設定すると「ページを再読み込みして、もう一度お試しください」と表示されてしまいます。
(実行関数は「該当のソースコード」に記載します)
時間主導型は設定できるのですが、フォームを選択するとエラーが出るようです。
ご教授いただけると大変助かります。
【トリガー設定不可な条件】
・実行する関数を選択 → updateForm
・実行するデプロイを選択 → Head
・イベントのソースを選択 → フォームから
【トリガー設定可能な条件】
・実行する関数を選択 → updateForm
・実行するデプロイを選択 → Head
・イベントのソースを選択 → 時間主導型
発生している問題・エラーメッセージ
ページを再読み込みして、もう一度お試しください。
該当のソースコード
GAS
1 2//「https://docs.google.com/spreadsheets/d/xxx/edit」のxxxを入れてください 3var spreadSheetID = '1MvPmpTxnDeClS4xlC7rhay-R7Pg95_cO1GdfTinC2eQ'; 4 5// 候補日と定員を書くシート名 6var sheetName = '接種日'; 7 8// 回答のシート名 9var answerSheetName = '回答'; 10 11// 定員のある項目の名前 12var questionName = '質問'; 13 14//// 15// 【フォームを更新する関数】 16//// 17function updateForm() { 18 //// 19 // 【スプレッドシートの情報を取得】 20 // 候補と定員を取得し、定員に満たない候補のみを取得します 21 //// 22 23 // スプレッドシートをIDで取得 24 var sheets = SpreadsheetApp.openById(spreadSheetID); 25 26 // 候補と回答のシートを取得 27 var sheet = sheets.getSheetByName(sheetName); 28 var answerSheet = sheets.getSheetByName(answerSheetName); 29 30 // 候補のシートのA行の2行目から下の値を配列で取得する 31 var sheetLastRow = sheet.getLastRow(); 32 if (sheetLastRow > 1) { 33 // 候補と定員を取得 34 var candidate = sheet.getRange(2, 1, sheetLastRow - 1, 2).getValues(); 35 } else { 36 return; 37 } 38 39 // 回答のシートの2行目から下の値を配列で取得する 40 var answerSheetLastRow = answerSheet.getLastRow(); 41 if (answerSheetLastRow > 1) { 42 var questionNames = answerSheet.getRange(1, 1, 1, answerSheet.getLastColumn()).getValues(); 43 var colCount = questionNames[0].indexOf(questionName); 44 if (colCount === -1) { 45 Logger.log("定員のある項目が見つかりません。questionName の値を確認してください"); 46 } 47 48 // 必要な部分だけ取得 (2次元配列で返ってくるので、flat()で1次元配列に変換しておく) 49 var answerData = answerSheet.getRange(2, colCount + 1, answerSheetLastRow - 1).getValues().flat(); 50 } 51 52 //// 53 // 【Googleフォームの選択肢の上書き】 54 //// 55 56 // フォームの取得 57 var form = FormApp.getActiveForm(); 58 59 // 質問項目をすべて取得 60 var items = form.getItems(); 61 62 // 選択肢の作成、更新 63 items.forEach(function(item) { 64 // 質問項目がquestionNameの項目を探す 65 if(item.getTitle() === questionName) { 66 var listItemQuestion = item.asListItem(); 67 // 選択肢を入れる配列 68 var choices = []; 69 70 // 候補日を一つ一つ見ていく 71 // nameAndCapacity[0]が候補日、nameAndCapacity[1]がその定員 72 candidate.forEach(function(nameAndCapacity) { 73 if(nameAndCapacity[0] != "") { 74 // 定員無制限かどうか。また、回答が一件もない場合もこっち 75 if (!answerData || nameAndCapacity[1] === 0 || nameAndCapacity[1] === "") { 76 choices.push(listItemQuestion.createChoice(nameAndCapacity[0])); 77 } else { 78 // 定員がある場合は定員以上になっていないか確認 79 var counter = 0; 80 // 何人分キャパが埋まっているかカウント 81 for(var i = 0; i < answerData.length; i++) { 82 if (nameAndCapacity[0] === answerData[i]) { 83 counter++; 84 } 85 } 86 // まだキャパがあれば選択肢に追加 87 if (counter < nameAndCapacity[1]) { 88 choices.push(listItemQuestion.createChoice(nameAndCapacity[0])); 89 } 90 } 91 } 92 }); 93 94 if (choices.length > 0) { 95 // フォームの回答を受け付ける 96 form.setAcceptingResponses(true); 97 // 選択肢を上書き 98 listItemQuestion.setChoices(choices); 99 } else { 100 // 満員につき、回答受付終了 101 form.setAcceptingResponses(false); 102 } 103 return; 104 } 105 }); 106} 107
試したこと
ポップアップとリダイレクトを許可、再ログイン
![guest](/img/icon/icnUserSample.jpg)
回答1件
あなたの回答
tips
プレビュー