编辑现有Google表单中的复选框选项

时间:2013-12-11 10:56:23

标签: google-apps-script google-sheets google-form

我正在尝试使用具有动态复选框答案的Google表单和电子表格创建调查,这样如果参与者1在“其他”文本框中填写答案,则该答案随后可用作后续响应者的复选框

我使用以下代码:

//a function to update Question 2's answer options
function updateChoices() {

    //open the existing survey form  
    var form = FormApp.openById('1DEcjGr6x9KrlxapgIkFxreW1F-2Vlj_yDDzLQUhcmgk');

    //retrieve existing Question 2
    var items = form.getItems();
    var question2 = items[1];

    //retrieve previously submitted responses from response spreadsheet
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    SpreadsheetApp.setActiveSheet(ss.getSheets()[1]);
    var numRows = ss.getLastRow()-1;
    var values = SpreadsheetApp.getActiveSheet().getRange(2,16,numRows,16).getValues();

    //declare a 1D array for existing survey answers
    var answersSoFar = new Array(numRows);

    //Pass the 2D array into the 1D array.
    for (i=0; i < numRows; i++){
    answersSoFar[i] = values[i][0];     
    }

    //update the choices for the question
    question2.setChoiceValues(answersSoFar);

}

我收到以下错误消息:

TypeError: Cannot find function setChoiceValues in object Item. (line 57, file "Code")

即使setChoiceValues方法列在课程项目中(第57行是最后一行代码)。

我还尝试在for循环中使用setChoicescreateChoice单独设置选项。

1 个答案:

答案 0 :(得分:3)

类项是一个通用对象,需要在调用特定于项的方法之前将其强制转换为特定的项类型。有关课程项目,请参阅preamble in the documentation。你可以这样做:

question2.asCheckboxItem().setChoiceValues(answersSoFar);
          ^^^^^^^^^^^^^^^^

Spoiler alert:你的功能中还有其他一些问题。如果你想独自留下来解决它们,请立即停止阅读!

无需调用SpreadsheetApp.setActiveSheet(),因为它对此特定脚本没有任何好处。

使用ss.getSheets()[1]获取特定工作表的句柄是不可靠的,因为索引取决于工作表的顺序,这可能会发生变化。如果您需要特定工作表,最好按名称引用它。 (如果您使用的方法采用gridId参数,则使用ID。)

16中值getRange(2,16,numRows,16).getValues();的目的是什么?这表示范围从P2开始,向下延伸numRows列,向右延伸16列。否则,您似乎打算生成以前对问题2的所有回复的列表,其中位于第3列,或C(允许时间戳和问题1在{ {1}})。

这一行A..B创建一个数组,其中包含一个元素,一个Number,它等于工作表中的行数。它创建一个包含var answersSoFar = new Array(numRows);元素的数组。参考:JavaScript Arrays

循环行以检索单元格值是有效的,但可能会变得丑陋且难以维护。如果我们转换二维数组,请考虑对问题的所有回答都会出现在同一行...回想一下高中矩阵数学。来自Google Spreadsheet Script - How to Transpose / Rotate Multi-dimensional Array?numRows功能将帮助我们。

代码

transpose