繁体   English   中英

Google Apps脚本 - ForEach in Range

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM