質問: 0; i < dt.length; i++){ choices.push(qui.createChoice(dt[i][0])); } qui.setChoices(choices); } ``` --- 【解決させたい問題】 1.スプレッドシートより参照する質問の値は、毎日変化する為、トリガーを毎日1時に実行させる事によって、Googleフォームへと表示される質問の値は常に最新の状態へと切り替えたいと考えております。 しかし、上記構文をトリガーによって毎日実行すると、当然ながらGoogleフォームへと表示される質問の値は変わりますが、古い質問の選択肢は残ったままになって、最新の質問だけがトリガーを実行される度、無限に追加される事になってしまいます。 以下の選択肢となる値が、毎日変化してスプレッドシートの同セル内へと表示されている状態となります。 トリガーを実行1回目→選択肢 a1 a2 a3 a4 a5 トリガーを実行2回目→選択肢 b1 b2 b3 b4 b5 トリガーを実行3回目→選択肢 c1 c2 c3 c4 c5 トリガーを実行4回目→選択肢 d1 d2 d3 d4 d5 質問が追加される事なく、常に最新の値をGoogleスプレッドシートから取得してGoogleフォームの質問の選択肢の欄へと追加させたいのが、解決へと至りたい問題その1となります。 --- 2.セクションが複数あった場合、上記の構文を実行すると、質問は一番下位のセクションへと追加される事になりますが、指定のセクションへと追加させる方法を実現させたいと考えております。 Googleフォームのセクションが4つあったとしまして、質問を追加させたいセクションは2つめのセクションが解決へと至りたい問題その2となります。 --- 長文での質問となって、たいへん実現したい事がわかりにくい事かもしれませんが、ご教示いただければ幸いです。 宜しくお願いいたします。 また、まずは上記構文を自分と同じくスプレッドシートのスクリプトエディタへと書き込んで実際に実行してみると質問の意味を分かっていただけるかもしれません。
回答: 問題1は、下記のコードでフォームの既存の設問に対し、全ての選択肢を上書きすることができます。設問の新規追加をして最後尾に設問が追加されるわけではないので、フォームの必要な場所に設問を設置しておけばよいことになります(この方法で問題2は解決) ``` function replaceCategory() { var mspid = "スプレッドシートのファイルID"; //スプレッドシートのID var ss = SpreadsheetApp.openById(mspid); var sheets = ss.getSheets(); var mst = sheets[0]; var dt = mst.getSheetValues(startRow, startColumn, numRows, numColumns); var frmid = "フォームのファイルID"; //フォームのID var frm = FormApp.openById(frmid); var listItem =frm.getItems(FormApp.ItemType.LIST);//既存の全LISTを取得 for (var i0 = 0; i0 < listItem.length; i0++){ if (listItem[i0].getTitle()=='ラベル名'){//タイトルが一致するLISTを選択 var qui = listItem[i0].asListItem()//変数quiにobjectを格納 break; } } if (i0 == listItem.length){//forloopが完走してしまった場合 Logger.log("指定したタイトルのlistItemが存在しない") return } var choices = [] for (var i = 0; i < dt.length; i++){ choices.push(qui.createChoice(dt[i][0])); } qui.setChoices(choices) } ```