Javascript Google应用程序脚本-ForEach在范围内
对于一个范围中的每一行,我想根据int的值在一行的列中向数组添加一个或多个条目。 例如,如果我的行是:Javascript Google应用程序脚本-ForEach在范围内,javascript,foreach,google-apps-script,Javascript,Foreach,Google Apps Script,对于一个范围中的每一行,我想根据int的值在一行的列中向数组添加一个或多个条目。 例如,如果我的行是: Val1 1 Val1 2 我想把一个对象{Val1,'US'}推到我的数组中。 另一方面,如果我的行是: Val1 1 Val1 2 我想将两个对象:{Val1,'FR'},{Val1,'DE'}推送到我的数组中。 我不明白为什么以下代码不起作用: var range = sheet.getRange("A2:B"); var results = range.
Val1 1
Val1 2
我想把一个对象{Val1,'US'}推到我的数组中。
另一方面,如果我的行是:
Val1 1
Val1 2
我想将两个对象:{Val1,'FR'},{Val1,'DE'}推送到我的数组中。
我不明白为什么以下代码不起作用:
var range = sheet.getRange("A2:B");
var results = range.getDisplayValues();
var array = [];
results.forEach(function(row){
switch(row[1]){
case '1' :
row[1] = "US";
array.push(row);
break;
case '2' :
row[1] = "FR";
array.push(row);
row[1] = "DE";
array.push(row);
break;
case '3' :
var entry1 = row;
var entry2 = row;
entry1[1] = "UK";
entry2[1] = "SW";
array.push(entry1);
array.push(entry2);
break;
}
});
return array;
这会返回我两次“DE”和两次“SW”。在案例三中,我尝试了一种不同的方法,以确保问题不在变量引用中,但同样的情况也会发生。这可能是因为我在价值观上循环的方式吗?为什么会这样
谢谢你的帮助 这是因为JS推送一个随后被修改的变量,所以该值被替换到所有地方 尝试像这样直接推送,而不存储:
var range = sheet.getRange("A2:B");
var results = range.getDisplayValues();
var array = [];
results.forEach(function(row){
switch(row[1]){
case '1' :
array.push([row[0],"US"]);
break;
case '2' :
array.push([row[0],"FR"]);
array.push([row[0],"DE"]);
break;
case '3' :
array.push([row[0],"UK"]);
array.push([row[0],"SW"]);
break;
}
});
return array;
您正在原地修改“行”,而不制作副本。也就是说,您将对“row”(同一数组)的引用放入多个位置,然后再次修改“row”——从而覆盖您原来的更改
为了避免此问题,可以使用Array.slice()创建行的副本,如下所示:
var range = sheet.getRange("A2:B");
var results = range.getDisplayValues();
var array = [];
results.forEach(function(row) {
switch(row[1]) {
case '1' :
// No copy necessary, since you're only using it once
row[1] = "US";
array.push(row);
break;
case '2' :
// Copy not necessary for the first use
row[1] = "FR";
array.push(row);
// Copy here, since you will modify it again
row = row.slice();
row[1] = "DE";
array.push(row);
break;
case '3' :
// Make one extra copy
var entry1 = row;
var entry2 = row.slice();
entry1[1] = "UK";
entry2[1] = "SW";
array.push(entry1);
array.push(entry2);
break;
}
});
return array;
请注意,对于在推送的数组中只有两个元素的情况,为每种情况构建新的数组(如另一个答案所示)可能更好。若我打算在性能不是很关键的生产代码中使用它,我可能会为每次修改制作一个副本,而不是在您需要上面的变体时。我上面所写的方式演示了必要的副本(以便更容易理解这一点),但通过更改使其不正确要比防御性地复制所有内容容易得多。您能为输入/输出添加示例值吗?现在还不太清楚您希望输出是什么,所以这意味着当您将变量推送到数组时,变量仍在作用域中?啊哈Js。。。