実現したいこと
見ていただきありがとうございます。下記の件、困っております、、、
よろしくお願いいたします。
①連結しているスプレッドシートの特定のセルが空欄になったら、Googleフォームの設問を削除したい(または残しても良いので最初のセクションへ戻したい)
②削除したら、一番最初のセクションに飛ばしたい。
前提
Googleフォームとスプレッドシートを使ってイベントの予約フォームを作成しています。
Googleフォームでは
①名前
②空き状況
③時間
-------(セクション)
④タイトルと説明
⑤10時の人数(参加する人数)
-------(セクション)
⑥~は11時、12時・・・④⑤のように続きます。
②の空き状況や⑤はスプレッドシートを連動しており、Googleフォームで回答があれば、自動で集計するようにしています。
②の空き状況では満席になれば「満席」と表示され、⑤の選択肢を減らしてくれます。
⑤の選択肢の中身は、「1、2、3、4、5」となっています。(参加する人数を把握するためのもの)
発生している問題・エラーメッセージ
上記の動作は良いのですが、⑤の選択肢で人数が減って最終的に満席となると、スプレッドシートの選択肢連動セルは空白になります。そうすると、プラグラムエラーが発生し上手く作動しないのです。
設問削除しても、次のセクションに進めてしまえることもあり、最悪設問削除できなくても一番最初のセクション(名前入れるところ)に戻したいのです。
エラーメッセージ エラー:Exception: Array is empty: values
該当のソースコード
ソースコード = Google App Script function updateForm() { //GoogleフォームのURLからIDを取得 var formId = "フォームID" const formFile = FormApp.openById(formId); var items = formFile.getItems(); var ssId = "スプレのID"; //スプレッドシートのIDを指定 var ssName = "シート3"; //スプレッドシートのシート名を指定 var sheet = SpreadsheetApp.openById(ssId).getSheetByName(ssName); //そのシートで一番下の行の番号を取得する var last_row = sheet.getLastRow(); var table = sheet.getDataRange().getValues().slice(1); //console.log(table); var options = table.map(row => { return { date: row[0], //日程 cap: row[1], //定員 reserved: row[2],//予約数 seats: row[3], //残数 s10:[10], //10時のプルダウン s11:[11], //11時のプルダウン s13:[12], //13時のプルダウン }; }); // 空き状況, 参加希望日 の値を作成 var infoText = ""; // 「空き状況」テキスト var choices = []; // 「参加希望日」選択肢 console.log(infoText); for (const option of options){ if (option.reserved < option.cap){ infoText += `${option.date} : 残り ${option.cap - option.reserved} 名\n`; choices.push(option.date); } else { infoText += `${option.date} : 満員(申込不可)\n`; } } //空き状況をGoogleフォームの設問にセット。(名前・空き状況となっていて、空き状況は「1」) items[1].setHelpText(infoText); //フォーム空き状況を更新 if (!choices.length) { form.setAcceptingResponses(false); } //1つ目の質問をスプレッドシートの内容と同期させる var itemOfService = items[4]; //2行目11列目,1セル取得 var sitelistNumbers = dropNullItemFromArray(sheet.getRange(2,11,6,1).getValues()); var sitelistNames = dropNullItemFromArray(sheet.getRange(2,11,last_row-1,1).getValues()); var sitelist = []; for ( var i = 0; i<sitelistNames.length; i++ ) { sitelist[i] = sitelistNumbers[i] //+ "," + sitelistNames[i] } //1つ目の質問を反映させる itemOfService.asMultipleChoiceItem().setChoiceValues(sitelist).setRequired(true); //選択肢削除 if(!sheet.getRange(2, 11).getValue()){ console.log(sheet.getRange(2, 11).getValue()); formFile.deleteItem(items[4]); }
試したこと
コード内の選択肢削除を//1つ目の質問を反映させるの前に持っていきました。確かに、items[4]の設問は消えたのですが、//1つ目の質問を反映させるコードでエラーが出てしまいました。最悪、設問削除できなくても良いから、定員一杯となったら「満員」と表示させてみました。しかしそうすると、その「満席」を選択して次のセクションに進めてしまうので具合が良くありません。。。。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。

回答1件
あなたの回答
tips
プレビュー