动态更新电子表格中列的Google表单“从列表中选择”选项

Met*_*hod 5 google-sheets google-apps-script google-forms

我正在尝试设置一个Google表单,该表单将创建一个“ 从列表中选择 ”问题,每个选项均从特定列的行中绘制。

我已经尝试过此代码,但是对我来说根本没有用。

我到目前为止的代码如下。我能够使用特定列中仅一行的数据(在本例中为该列的最后一行)创建所需的表单问题。

如果有人可以通过向我指出有关如何将每个选定行分配给仅一个问题选项的正确方向来提供帮助。同样,如果这是每次电子表格更新时动态更新问题选项的某种方式。

var idColumn = 1; // ID of the selected column

//gets document ID from spreadsheet 
//(not 100% sure the role of all of these lines, have worked it out from other examples of code online)
function spreadSheetGetter() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var rows = sheet.getDataRange();
  var numRows = rows.getNumRows();
  var values = rows.getValues();
  var lr = rows.getLastRow();  

  var docId = sheet.getRange(lr,idColumn,1,1).getValue(); //gets the data from the last row in selected column

fillFormData(docId);
}


//fills for with document ID
function fillFormData(docId) {
var form = FormApp.openById('MY FORMS ID');
var item = form.addListItem();

item.setTitle('Select Existing Customer') //creates the choose from list question
     .setChoices([
         item.createChoice(docId), //data from row 1
         item.createChoice(docId) //data from row 2 etc...
       ])
}
Run Code Online (Sandbox Code Playgroud)

Ala*_*lls 3

这个说法:

var docId = sheet.getRange(lr,idColumn,1,1).getValue();
Run Code Online (Sandbox Code Playgroud)

只能得到一个值。我认为您需要列中的所有值,因此请使用getValues()('s' on the end) 方法来获取二维值数组。并将numRows参数(要获取的行数)更改为lr变量。另外,您可能想从第 2 行开始。语法是:

getRange(row, column, numRows, numColumns)
Run Code Online (Sandbox Code Playgroud)
  • row - 整数范围的起始行
  • column - 范围的起始列的整数
  • numRows - 要返回的整数行数
  • numColumns - 要返回的整数列数

所以,参数需要这样设置:

var docId = sheet.getRange(2,idColumn,lr,1).getValues();
Run Code Online (Sandbox Code Playgroud)

如果在电子表格中,第一行有标题名称,您可能不希望在项目列表中包含标题。这就是为什么第一个参数设置为数字 2,从第 2 行开始。

然后,您需要处理二维数组中的数据,并创建一个采用setChoices(choices)方法所需格式的新数组,以便将每个值添加到列表中。您将需要一个编程循环。这将每次创建一个新的项目值数组,因此列中的当前值将更新到列表中。

var thisValue = "";
var arrayOfItems = [];
var newItem = "";

for (var i=0;i<docId.length;i++) {
  thisValue = docId[i][0];
  newItem = "item.createChoice('" + thisValue + "')";
  arrayOfItems.push(newItem);
};
Run Code Online (Sandbox Code Playgroud)

完整的函数看起来像这样:

//fills item with document ID
function fillFormData(docId) {
  var form = FormApp.openById('MY FORMS ID');
  var item = form.addListItem();

  var thisValue = "";
  var arrayOfItems = [];
  var newItem = "";

  for (var i=0;i<docId.length;i++) {
    thisValue = docId[i][0];
    Logger.log('thisValue: ' + thisValue);
    newItem = item.createChoice(thisValue);
    arrayOfItems.push(newItem);
  };

  item.setTitle('Select Existing Customer') //creates the choose from list question
     .setChoices(arrayOfItems)
};
Run Code Online (Sandbox Code Playgroud)