Loops 在表单中,我需要将同一电子表格列的内容填充50次。有没有一种方法可以用更少的迭代来编写这个逻辑
我正在开发一个表单,需要将电子表格列的内容拉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
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]
表示法时,生成的数组中的那些值将是未定义的
(在所选值的数组中,这是不需要的)
注释
{}
与循环和if
语句一起使用,这样您就可以跟踪其中包含哪些语句,并在循环/调整多个语句时节省调试时间getLastRow()
方法,而不是必须在脚本中执行的getMaxRows()-1
calcforEach()
方法李>
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);
});
}