[英]Google Apps Script - ForEach in Range
对于范围中的每一行,我想在一个行的列中添加一个或多个条目,具体取决于int的值。 例如,如果我的行是:
Val1 1
我想将一个对象{Val1,'US'}推送到我的数组中。 另一方面,如果我的行是:
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;
您正在修改“行”,而不进行复制。 即,您将“行”(相同的数组)的引用放入多个位置,然后再次修改“行” - 从而覆盖原始更改。
要避免此问题,可以使用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;
请注意,对于您推送的阵列中只有两个元素的情况,为每个案例构建新数组(如另一个答案中所示)可能更好。 如果我要在性能不是很关键的生产代码中使用它,我可能会为每个修改制作一个副本,而不是上面那个只在你需要的时候。 我上面写的方式演示了必要的副本(以便更容易理解这一点),但是如果你只是在防御性地复制所有内容,那么使更改更容易变得更容易。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.