Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 在表单中,我需要将同一电子表格列的内容填充50次。有没有一种方法可以用更少的迭代来编写这个逻辑_Loops_Google Apps Script_Google Sheets_Dry_Google Forms - Fatal编程技术网

Loops 在表单中,我需要将同一电子表格列的内容填充50次。有没有一种方法可以用更少的迭代来编写这个逻辑

Loops 在表单中,我需要将同一电子表格列的内容填充50次。有没有一种方法可以用更少的迭代来编写这个逻辑,loops,google-apps-script,google-sheets,dry,google-forms,Loops,Google Apps Script,Google Sheets,Dry,Google Forms,我正在开发一个表单,需要将电子表格列的内容拉50次,以尝试从列表中输入多个项目。我发现我可以通过定义几个变量和一次又一次地重做一小段脚本来做到这一点。我想看看是否有人能帮助我克服这个冗长的脚本,以更少的迭代使它更小。谢谢 function updateForm(){ // call the form and connect to the drop-down items var Form_SQ = FormApp.openById("FORM ID"); var SQ_IT01_Lis

我正在开发一个表单,需要将电子表格列的内容拉50次,以尝试从列表中输入多个项目。我发现我可以通过定义几个变量和一次又一次地重做一小段脚本来做到这一点。我想看看是否有人能帮助我克服这个冗长的脚本,以更少的迭代使它更小。谢谢

function updateForm(){
  // call the form and connect to the drop-down items
  var Form_SQ = FormApp.openById("FORM ID");
  var SQ_IT01_List = Form_SQ.getItemById("ITEM 01").asListItem();
  var SQ_IT02_List = Form_SQ.getItemById("ITEM 02").asListItem();
  //Similarly defining upto 50 dropdown lists.


  var SS01 = SpreadsheetApp.getActive();
  var SQ_IT01_Names = SS01.getSheetByName("Sheet2");
  var SQ_IT02_Names = SS01.getSheetByName("Sheet2");
  //Similarly defining upto 50 names lists.


  // Item_01 Part Number Dropdown
  var SQ_IT01_Values = SQ_IT01_Names.getRange(2, 1, SQ_IT01_Names.getMaxRows() - 1).getValues();
  var SQ_IT01_Items = [];
  for(var i = 0; i < SQ_IT01_Values.length; i++)
  if(SQ_IT01_Values[i][0] != "")
  SQ_IT01_Items[i] = SQ_IT01_Values[i][0];
  SQ_IT01_List.setChoiceValues(SQ_IT01_Items);

  // Item_02 Part Number Dropdown
var SQ_IT02_Values = SQ_IT01_Names.getRange(2, 1, SQ_IT02_Names.getMaxRows() - 1).getValues();
  var SQ_IT02_Items = [];
  for(var i = 0; i < SQ_IT02_Values.length; i++)
  if(SQ_IT02_Values[i][0] != "")
  SQ_IT02_Items[i] = SQ_IT02_Values[i][0];
  SQ_IT02_List.setChoiceValues(SQ_IT02_Items);

  //Similarly defining upto 50 lookup lists.

}
函数updateForm(){
//调用表单并连接到下拉项
var Form_SQ=FormApp.openById(“表格ID”);
var SQ_IT01_List=Form_SQ.getItemById(“项目01”).asListItem();
var SQ_IT02_List=Form_SQ.getItemById(“项目02”).asListItem();
//类似地定义多达50个下拉列表。
var SS01=SpreadsheetApp.getActive();
var SQ_IT01_Names=SS01.getSheetByName(“Sheet2”);
var SQ_IT02_Names=SS01.getSheetByName(“Sheet2”);
//类似地定义多达50个名称列表。
//项目01零件号下拉列表
var SQ_IT01_Values=SQ_IT01_Names.getRange(2,1,SQ_IT01_Names.getMaxRows()-1).getValues();
var SQ_IT01_项目=[];
对于(变量i=0;i
问题

重用代码和使用循环。脚本编写就是为了提高效率(请参见原则):尽可能少地分配任务和编写相同的功能—使用循环,将可重用的代码片段移动到可按需调用的函数中,等等

解决方案

此示例做出了以下几个假设:

  • SQ_IT01_name
    对于每个项目都是不同的(在您的示例中总是
    Sheet2
    -如果是这种情况,您不必重新分配50次,一个变量分配就可以了)
  • 您打算在值为空字符串时执行某些操作(示例只是将其过滤掉)。当您使用
    [index]
    表示法时,生成的
    数组中的那些值将是
    未定义的
    (在所选值的
    数组中,这是不需要的)
  • 所有项目都是可选项目(如果您需要id筛选,那么示例很容易扩展)


  • 注释

  • 请将闭包
    {}
    与循环和
    if
    语句一起使用,这样您就可以跟踪其中包含哪些语句,并在循环/调整多个语句时节省调试时间
  • 因为您只需要包含数据的行,所以请使用
    getLastRow()
    方法,而不是必须在脚本中执行的
    getMaxRows()-1
    calc
  • 参考

  • forEach()
    方法
  • filter()
    方法
  • map()
    方法
  • getLastRow()
    方法 试试看。
    function updateForm() {
      var form = FormApp.openById("FORM ID");
    
      //access every item;
      var items = form.getItems();
    
      var ss = SpreadsheetApp.getActive();
    
      //loop over items;
      items.forEach(function(item,i){
        var namesSheet = ss.getSheetByName('Sheet'+i); //assuming this is diff each time;
        var namesRange = namesSheet.getRange(2,1,namesSheet.getLastRow());
        var namesValues = namesRange.getValues();
    
        //map values to first column;
        namesValues = namesValues.map(function(value){
          return value[0];
        });
    
        //filter out undefined (undefined and false functional equivalence);
        namesValues = namesValues.filter(function(value){
          return value;
        });
    
        item.asListItem().setChoiceValues(namesValues);
      });
    }