使用Google表格中的值从DropDown填充Google

时间:2018-03-03 04:53:32

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

我查看了所有问题,但我无法弄清楚我做错了什么。这是背景:

我创建了一个包含多个标签的电子表格。每个标签对应于事件的类型(例如游行,节日,体育)。这些选项卡中的每一个都用于将特定作业编号分配给特定事件。游行工作数量在2000年范围内,节日3000范围,体育4000范围。

然后我有一个不同的选项卡,它定义了一个收集所有工作号和事件的数组,并按字母顺序对它们进行排序。此选项卡名为" Active_Job_Numbers"。

我的目标是创建几个表单,调用此电子表格中的" Active_Job_Numbers"标签。我有点工作,但不完全。每个表格的目的都是提交会计要求以处理信用卡交易;另一种提交支票请求的表格。

所有这些要求必须与不断变化的工作号码列表联系在一起。当我更新电子表格时,电子表格中的下拉列表将根据" Active_Job_Numbers"填充。数据

我正在使用的代码确实有效,但如果我在电子表格上更新了作业编号或事件名称,表单仍会看到旧值。我为onSubmit和onOpen设置了触发器,但是,如果我更改其中一个" var"我仍然可以获得更新表单中的下拉列表的唯一方法。标签。然后保存它。然后重新打开表单。这是一个停滞不前。

以下是我正在使用的代码:

function updateForm(){
  // call your form and connect to the drop-down item
  var creditCardRequestGoogleForm = FormApp.openById("1LqtPLGEhocGdkg75mkdldfplxSxWJmYZCp3u1bMwVQQ");

  var jobNumberDropDown = creditCardRequestGoogleForm.getItemById("1632374512").asListItem();




// identify the sheet where the data resides needed to populate the drop-down
  var ss = SpreadsheetApp.openById("17fgel9Jfl4Aske85mfkwsphBQpZgtGhR8Q");
SpreadsheetApp.setActiveSpreadsheet(ss);
  var activeJobNumbers = ss.getSheetByName('Active_Job_Numbers');

  // grab the values in the first column of the sheet - use 2 to skip header row 
  var jobNumValues = activeJobNumbers.getRange(2, 1, activeJobNumbers.getMaxRows() - 1).getValues();

  var jobNums = [];

  // convert the array ignoring empty cells
  for(var i = 0; i < jobNumValues.length; i++)    
    if(jobNumValues[i][0] != "")
      jobNums[i] = jobNumValues[i][0];

  // populate the drop-down with the array data
  jobNumberDropDown.setChoiceValues(jobNums);

}

一个单独但相关的问题......我有一些表单有两个不同的下拉元素,它们调用同一个电子表格但是调用不同的标签。我不知道如何对这个脚本进行分组,所以我必须像这样分开:

function updateForm(){
  // call your form and connect to the drop-down item
  var ccrForm = FormApp.openById("1r5n6Sr7fhtGCqht_QHy9qWR1v2ESabxdE-bMxjR-M");

  var jobNumberDropDown = ccrForm.getItemById("1678955392").asListItem();




// identify the sheet where the data resides needed to populate the drop-down
  var ss = SpreadsheetApp.openById("17eGAlcnBB7ejdfqp3HBQBK9wJAKWYhBQpZgtGhR8Q");
SpreadsheetApp.setActiveSpreadsheet(ss);
  var currentJobNumbers = ss.getSheetByName('Active Job Numbers');

  // grab the values in the first column of the sheet - use 2 to skip header row 
  var jobNumValues = currentJobNumbers.getRange(2, 1, currentJobNumbers.getMaxRows() - 1).getValues();

  var jobNums = [];

  // convert the array ignoring empty cells
  for(var i = 0; i < jobNumValues.length; i++)    
    if(jobNumValues[i][0] != "")
      jobNums[i] = jobNumValues[i][0];

  // populate the drop-down with the array data
  jobNumberDropDown.setChoiceValues(jobNums);

}

function updateForm(){
  // This call your form and connect to the drop-down item
  var form = FormApp.openById("1r5n6Sr7fhtGCqht_QHy9qWR1v2ESabxdE-bMxjR-M");

  var poNumberDropDown = form.getItemById("57865789991").asListItem();




// This is the second dropdown which calls the same spreadsheet but different tab NEED HELP COMBINING THESE TWO MORE ELEGANTLY
  var ss = SpreadsheetApp.openById("17eGAlcnBB7ejdfqp3HBQBK9wJAKWYhBQpZgtGhR8Q");
SpreadsheetApp.setActiveSpreadsheet(ss);
  var currentPONumbers = ss.getSheetByName('PO_Number');

  // grab the values in the first column of the sheet - use 2 to skip header row 
  var poNumValues = currentPONumbers.getRange(2, 1, currentPONumbers.getMaxRows() - 1).getValues();

  var poNums = [];

  // convert the array ignoring empty cells
  for(var i = 0; i < poNumValues.length; i++)    
    if(poNumValues[i][0] != "")
      poNums[i] = poNumValues[i][0];

  // populate the drop-down with the array data
  poNumberDropDown.setChoiceValues(poNums);

}

非常感谢任何见解。

1 个答案:

答案 0 :(得分:0)

onOpen trigger for a form,如文档中所述:

  

当用户打开要响应的表单时,不会发生此事件,但是   而是当编辑器打开表单进行修改时

相反,您可以在编辑工作表时使用installable trigger激活代码。

此外,每次在电子表格上进行编辑时,不要修改所有表单。您可以检查电子表格中修改的工作表以修改相应的表单。要确定修改了哪个工作表,您可以使用event objects.

以下是示例代码,您可以修改它以供您使用。

function installedEdit(evtObj){
  Logger.log("Edit running")
 var sheetName = evtObj.range.getSheet().getSheetName()
 Logger.log(sheetName)
 var itemId="None"
 switch (sheetName){
   case "Active Job Numbers": 
     itemId = "1678955392"
     updateForm(sheetName,itemId)
     break;
   case "PO_Number":
     itemId = "57865789991"
     updateForm(sheetName,itemId)
     break;
 }
}

function updateForm(sheetName,itemId){
  // call your form and connect to the drop-down item
  var form = FormApp.openById("1r5n6Sr7fhtGCqht_QHy9qWR1v2ESabxdE-bMxjR-M");
  var dropDown = form.getItemById(itemId).asListItem();
// identify the sheet where the data resides needed to populate the drop-down
  var ss = SpreadsheetApp.openById("17eGAlcnBB7ejdfqp3HBQBK9wJAKWYhBQpZgtGhR8Q");
  SpreadsheetApp.setActiveSpreadsheet(ss);
  var sheet = ss.getSheetByName(sheetName);
  // grab the values in the first column of the sheet - use 2 to skip header row 
  var choiceValues = sheet.getRange(2, 1, sheet.getLastRow() - 2).getValues();
  var choices = [];
  // convert the array ignoring empty cells
  for(var i = 0; i < choiceValues.length; i++)    
    if(choiceValues[i][0] != "")
      choices[i] = choiceValues[i][0];
     // populate the drop-down with the array data
     dropDown.setChoiceValues(choices);
  }

注意:确保installedEdit()设置为在编辑电子表格时运行并绑定到电子表格。