質問するログイン新規登録
Google フォーム

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

Google Apps Script

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

Q&A

解決済

1回答

293閲覧

スプレッドシートの特定のセルが空白になったら、Googleフォームの設問を①削除し、②一番最初のセクションに戻したい。

10-mo

総合スコア23

Google フォーム

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

Google Apps Script

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

0グッド

2クリップ

投稿2023/10/12 06:00

0

2

実現したいこと

見ていただきありがとうございます。下記の件、困っております、、、
よろしくお願いいたします。

①連結しているスプレッドシートの特定のセルが空欄になったら、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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

YellowGreen

2023/10/12 08:01

次のように修正してみると希望の動作になるでしょうか? //1つ目の質問を反映させる if (sitelist.length > 0) { itemOfService.asMultipleChoiceItem().setChoiceValues(sitelist).setRequired(true); }
YellowGreen

2023/10/12 08:36

キャンセルがあった場合は、手動で復活するのですね。
10-mo

2023/10/12 09:15

YellowGreenさん コメントいただきありがとうございます。早速試してみたところ、設問が削除されました。sitelist.length>0のif文使えばよかったのですね!一つ勉強になりました!
10-mo

2023/10/12 09:18

キャンセルは別のGoogleフォームがあり、そこから対応する形にしています。イベント内容的に、そこまでキャンセルが出ると想定していないので、イベント数日前に確認してキャンセル分申込でもやろうかなと思っています。 ちなみに、今件の②については実現可能な内容なのでしょうか?
YellowGreen

2023/10/13 02:22

②がどのような動作を希望されているのかよくわかりませんでしたが、 formFile.deleteItem(items[4]); の次に items[5].asPageBreakItem().setGoToPage(FormApp.PageNavigationType.RESTART); を追加したときの動作でしょうか?
10-mo

2023/10/13 02:31

分かりづらい質問で申し訳ありません。 ①で削除しても次の質問に進めてしまいます。フォームの設定で⑤の10時の人数で参加人数を決定→参加同意のセクションに進むようになっています。 現状ですと、設問消えても④のテキストボックスが残って「次へ」ボタンが押せて11時の人数参加の設問へ飛んでしまいます。これは望んでいないので、設問が消える→「次へ」(ボタン)→最初の①の入力へ戻すような形にしたいのです。
YellowGreen

2023/10/13 02:48

定員が残っている場合、10時の人数を選択して次へに進むと送信に進むのでなく、 11時の人数の選択の質問に移行するのですね。 それはさておき、まずは、 上のコメントをお試しいただいて、どのように違うのかをご説明いただけますか。
10-mo

2023/10/13 04:46

遅くなりました。上記いただいたコードを試してみたところ、確かに①に戻るようになりました。 しかし、⑤の人数が選択できる状態で次に進んでも①に戻ってしまいます。 混乱してきたので整理させていただくと ・選択肢が残っていたら、Googleフォームの設定を使って指定のセクションへ飛ぶようにする←設定済 ・⑤10時の人数(参加する人数)の選択肢がゼロ→設問そのものを削除←ここまではOK! ・上で削除して「次へ」を押すと①へ戻る←ここが分からないです。。。
YellowGreen

2023/10/13 05:05 編集

上のコメントに書いてあることがよく理解できませんでした。 まず、最初の2行では人数が選択できる状態で次に進んでも①に戻るというのは、 まだ、定員に達していない状態=選択肢が削除されていない状態で人数を選択してから 次へを押すと初期設定どおり11時の人数の選択のページに移行するはずが 最初のページに戻るということでしょうか? 仮にそうだとすると items[5].asPageBreakItem().setGoToPage(FormApp.PageNavigationType.RESTART); の文を formFile.deleteItem(items[4]); の直後以外の場所に追加していないでしょうか? あるいは、削除された選択肢を復活させたときに ページの遷移先を元の11時の人数のページに戻していないのではないでしょうか? 上の二つの文は続けて処理されるので、 選択肢が削除されないうちにページ遷移が変わることはないと思うのですが。 次の ・上で削除して「次へ」を押すと①へ戻る←ここが分からないです。。。 についてですが、 削除して次へを押すとはどのような操作のことでしょうか? 定員に達した後は、回答者が満員となっている10時を選択しても 選択肢の無いページに移行し、 「戻る」と「次へ」しか選べないのでどちらを選んでも最初のページに移行します。 削除して次への操作がわかりません。
10-mo

2023/10/13 05:26

申し訳ありません。私がGoogleフォームの設定を変更してしまっていたようです。 再度、ご教示いただいたようにやってみたところ、正常に作動しました!! 上記の件、不要かと思われますが....念のため 「まず、最初の2行では人数が選択できる状態で次に進んでも①に戻るというのは、 まだ、定員に達していない状態=選択肢が削除されていない状態で人数を選択してから 次へを押すと初期設定どおり11時の人数の選択のページに移行するはずが最初のページに戻るということでしょうか?」 →そのご理解で間違いありません。 私が行っている設定では、 ・選択肢がある→最終セクションへ移動 ・選択肢がない→①へ戻る(ここを実現したいです!) 次の~は、 ここの「次へ」はGoogleフォームのボタンのことでして、設問が削除されても「戻る・次へ」のボタンはフォーム上に残ったままで、設問が無い=①へ戻る。を実現させたかったのです。 色々と検索しても見当たらなかったので大変助かりました! ありがとうございました!!
guest

回答1

0

自己解決

YellowGreenさんにご回答いただきました。ありがとうございました。
ベスト回答にしたかったのですが、それができずこちらに共有させていただきます。

ソースコードの選択肢削除の部分に変更を加えています。

//1つ目の質問を反映させる
if (sitelist.length > 0) {
itemOfService.asMultipleChoiceItem().setChoiceValues(sitelist).setRequired(true);
}
//選択肢削除
if(!sheet.getRange(2, 11).getValue()){
//console.log(sheet.getRange(2, 11).getValue());
formFile.deleteItem(items[4]);
items[5].asPageBreakItem().setGoToPage(FormApp.PageNavigationType.RESTART);
}

投稿2023/10/13 09:47

10-mo

総合スコア23

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問