質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.44%
Google フォーム

Google フォームは、 Google社が提供しているアンケートフォーム作成および集計ができる無料のツール。Googleアカウントがあれば利用が可能です。集計データは、スプレッドシートに収集され、データ分析もできます。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

1回答

1370閲覧

Googleフォームのスプリクトでトリガー設定するとエラーがでます

chikaMM

総合スコア4

Google フォーム

Google フォームは、 Google社が提供しているアンケートフォーム作成および集計ができる無料のツール。Googleアカウントがあれば利用が可能です。集計データは、スプレッドシートに収集され、データ分析もできます。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

2クリップ

投稿2023/06/12 03:35

実現したいこと

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

試したこと

ポップアップとリダイレクトを許可、再ログイン

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YellowGreen

2023/06/12 06:54 編集

同様のスプレッドシートとフォームを作成してフォームの送信のトリガーを作成して追試してみました。 私の環境ではなぜかシート名が2文字や3文字だとシートの取得に失敗するのでシート名を「回答シート」「接種日シート」に変更してあります。(念のためですが、接種日の候補は===で比較できるよう文字列になっています。) ご提示のスクリプトをコピペしてスプレッドシートのIDを回答先のスプレッドシートのIDに変更し、シート名を私の環境でのシート名に変更しただけですが、フォームを送信して定員に達するとその次の回答からはその候補日が削除されます。 なお、間をおかずに連続して回答すると選択肢のアップデートのためか「この質問には変更が加えられています...」と表示され回答の選択肢をもう一度選び直さなければ送信できないことがありました。 そういう表示が出たときは、定員を超えた選択肢がなくなっていますが、連続して回答(5秒間隔)していたので既に前の回答で定員を超えて申し込みができてしまっていました。
chikaMM

2023/06/12 09:09

フォームの作成を試していただきありがとうございます。 回答を必須にすると定員を超えずに、再度選択するようになると思います。 当質問はトリガーに関することなのですが、ご質問内容に関することでどのような事が疑問でしたでしょうか?
YellowGreen

2023/06/12 09:23

最初に 同様のスプレッドシートとフォームを作成してフォームの送信のトリガーを作成して追試してみました。 と申し上げてます。 トリガーを時間主導ではなくてフォームの送信にするとエラーになるというご質問ではないのでしょうか?
YellowGreen

2023/06/12 09:24

なお書きは付加情報です。
YellowGreen

2023/06/12 09:33

そのスクリプトで、特に問題なくトリガー設定できてます。 そちらの環境になにかあるのか、例えばPCやブラウザを再起動してみるとか、ブラウザのキャッシュをクリアするとかフォームやスプレッドシートをコピーして同じものを別に作成するとか。
YellowGreen

2023/06/12 09:37

ソースコードをご提示されたのは、コードに問題がないか確認して欲しかったのではなかったのでしょうか?
chikaMM

2023/06/12 12:37

こちらに記載されているのは質問に対するコメント欄(回答欄ではない)になっており、当質問に対して何かご質問があるのではないかと思った次第です。 ご提示いただいた再起動等はすべて試しております。 お試しいただきありがとうございました。
YellowGreen

2023/06/12 12:43

こちらに記載されているのは質問に対するコメント欄(回答欄ではない)になっており なので、回答ではないのでこちらに記載したのです。 お役に立てず、残念です。
guest

回答1

0

自己解決

Googleサポートにも質問したところ複数の同現象の報告があるが、現在は解決方法がないとの回答をもらいました。
無料アカウントで該当のGoogleフォームを共有し、トリガー設定を行ったところ正常通り設定ができましたので、Google Workspaceのアカウントだと何かしらの問題があるのかもしれません。

投稿2023/06/14 06:33

chikaMM

総合スコア4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.44%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問