我正在尝试使用具有动态复选框答案的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循环中使用setChoices
和createChoice
单独设置选项。
答案 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