

Googleフォームの質問の選択肢（プルダウン式）をスプレッドシートから読み取りたくて下記のようにスクリプトエディタで作成をしています。

2つ目の質問までは反映できるのですが3つ目の質問が反映できません。  
3つ目の質問は別のセクションになっており、どのようにコードを書き変えたらいいのかわからず困っております。どなたかわかれば教えていただきたいです。

よろしくお願い致します。

[code]

    function updateForm() {
        //GoogleフォームのURLからIDを取得する
        //こういうの "xxxxxxxx-xxxxxxxxxxx-xxxxxx"
        var formId = "xxxxxxxx-xxxxxxxxxxx-xxxxxx"
            const formFile = FormApp.openById(formId);
        var items = formFile.getItems();
    
        var ssId = "xxxxxxxx-xxxxxxxxxxx-xxxxxx"; //スプレッドシートのIDを指定
        var ssName = "カテゴリー"; //スプレッドシートのシート名を指定
        var sheet = SpreadsheetApp.openById(ssId).getSheetByName(ssName);
        //そのシートで一番下の行の番号を取得する
        var last_row = sheet.getLastRow();
        Logger.log(sheet);
    
        //１つ目の質問をスプレッドシートの内容と同期させる
        var itemOfService = items[0];
        //2行目1列目,1セル取得
        var sitelistNames = dropNullItemFromArray(sheet.getRange(2,1,last_row,1).getValues());
        var sitelist = [];
        for ( var i = 0; i<sitelistNames.length; i++ ) {
            sitelist[i] = sitelistNames[i]
        }
    
        //１つ目の質問を反映させる
        itemOfService.asListItem().setChoiceValues(sitelist).setRequired(true);
    
        //2つ目の質問をスプレッドシートの内容と同期させる
        var itemOfService = items[1];
        var sitelistNames = dropNullItemFromArray(sheet.getRange(2,6,last_row,1).getValues());
        var sitelist = [];
        for ( var i = 0; i<sitelistNames.length; i++ ) {
            sitelist[i] =sitelistNames[i]
        }
    
        //2つ目の質問を反映させる
        itemOfService.asListItem().setChoiceValues(sitelist).setRequired(true);
    
        //3つ目の質問をスプレッドシートの内容と同期させる
        var itemOfService = items[2];
        var sitelistNames = dropNullItemFromArray(sheet.getRange(3,3,last_row,1).getValues());
        var sitelist = [];
        for ( var i = 0; i<sitelistNames.length; i++ ) {
            sitelist[i] =sitelistNames[i]
        }
    
        //3つ目の質問を反映させる
        itemOfService.asListItem().setChoiceValues(sitelist).setRequired(true);
    
    }
    
    //配列の空配列をいい感じに消す関数
    function dropNullItemFromArray(array){
        var new_array = [];
        array.forEach(function(value){
            if(value != null && value != "") {
                new_array.push(value);
            }
        });
        return new_array;
    }
    
[/code]


CC BY-SA 4.0
2022-06-14T02:17:22.103
89379
2022-06-16T03:01:33.373
2022-06-14T03:07:34.383
3060
53058
question
google-apps-script
Googleフォームの質問の選択肢をスプレッドシートから読む取る方法について（セクションがわかれている場合について）


提供していただいたGoogle
Formから、"PAGE_BREAK"を使用していることがわかりました。この場合、表示されているスクリプトを修正しますと、次のように修正してみてください。

### From:

[code]

    var itemOfService = items[2];
    
[/code]

### To:

[code]

    var itemOfService = items[3];
    
[/code]

  * "PAGE_BREAK"もItemオブジェクトであるため、`itemOfService.asListItem().setChoiceValues(sitelist).setRequired(true);`でエラーが発生していたと思われます。この修正で、"PAGE_BREAK"をスキップしますのでエラーは回避できるかと思われます。

### 提案

参考になるかどうかわかりませんが、表示されているスクリプトと、提供していただいたGoogle Form, Google
Spreadsheetから、スクリプトを下記のようにも修正できるかもしれないと思いました。Itemオブジェクトをループ内で処理すると便利かと思いました。参考になりましたら幸いです。

[code]

    function sample() {
      const formId = "###"; // Form IDをセットしてください。
      const ssId = "###"; // Spreadsheet IDをセットしてください。
    
      // スプレッドシートから値を取得
      const sheet = SpreadsheetApp.openById(ssId).getSheetByName("シート1");
      const [, ...v] = sheet.getDataRange().getValues();
      
      // 転置
      const values = v[0].map((_, c) => v.map(r => r[c]));
    
      // Google Formへ質問を設定。このとき、PAGE_BREAKはスキップする。
      const formFile = FormApp.openById(formId);
      let c = 0;
      formFile.getItems().forEach(e => {
        if (e.getType() != FormApp.ItemType.PAGE_BREAK) { // or if (e.getType() == FormApp.ItemType.LIST) {
          e.asListItem().setChoiceValues(values[c++]).setRequired(true);
        }
      });
    }
    
[/code]

### 参考

  * [Enum ItemType](https://developers.google.com/apps-script/reference/forms/item-type)


CC BY-SA 4.0
2022-06-16T03:01:33.373
89411
2022-06-16T03:01:33.373
19460
89379
answer