gpt4 book ai didi

javascript - Google Apps 脚本 - 范围内的 ForEach

转载 作者:行者123 更新时间:2023-11-29 10:08:03 25 4
gpt4 key购买 nike

对于一个范围内的每一行,我想将一个或多个条目添加到数组中,具体取决于行的其中一列中的 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”。我在案例三中尝试了不同的方法,以确保问题不在于变量引用,但同样的事情发生了。可能是因为我循环使用值的方式吗?为什么会这样?

感谢您的帮助。

最佳答案

您正在就地修改“行”,而没有制作副本。也就是说,您将对“行”(同一个数组)的引用放到几个地方,然后再次修改“行”——从而覆盖您的原始更改。

为避免该问题,您可以使用 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;

请注意,对于您推送的数组中只有两个元素的情况,为每种情况构建新数组(如另一个答案所示)可能会更好。而且,如果我要在性能不是很关键的生产代码中使用它,我可能会为每次修改制作一个副本,而不是上面的 just-when-when-you-need-it 变体。我在上面编写它的方式演示了必要的副本(以便更容易理解这一点),但是通过更改使其变得不正确比仅仅防御性地复制所有内容要容易得多。

关于javascript - Google Apps 脚本 - 范围内的 ForEach,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39298063/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com