根据数组中的值多次Concat数组。

时间:2018-11-18 13:43:04

标签: javascript google-apps-script google-sheets

我正在尝试为工作场所中的重复任务设计一些时间表。为了进行设置,我遍历数据以在第2列中找到“季度”值,在第3列中找到“重复发生”值。

如果确实找到这些值,则将行数据推入数组。然后,我根据数组中的第4个值(称为timesrecurring),对数组进行多次连接(为此,我使用了下面代码中未显示的其他函数)。

最后,我使用.setvalues()将数组复制到另一张纸上。代码如下:

function myFunction() {
 var ss = SpreadsheetApp.getActiveSpreadsheet(); 
 var sheet = ss.getSheetByName("Input Table"); 
 var targetsheet = ss.getSheetByName("Summary Calendar");
 var lastrow = sheet.getLastRow();
 var datarange = sheet.getRange(8, 2, lastrow-1 , 10).getValues();
 var x = [];

for(i=0; i<datarange.length; i++){

 if (datarange[i][1] == "Recurring" && datarange[i][2] == "Quarterly" ){

  x.push([datarange[i][0],datarange[i][1],datarange[i][2],datarange[i] 
  [3],datarange[i][4],datarange[i][7],datarange[i][8],datarange[i] 
  [9],datarange[i][5],datarange[i][6])


  var timesrecurring = datarange[i][3] 
  var y = replicateArray(x,timesrecurring)

  targetsheet.getRange(targetsheet.getLastRow()+1, 2, 
  y.length,y[0].length).setValues(y);
  }
 }

}

正如您在这里看到的那样,我正在查找具有“季度”和“重复发生”的行,并将相关行推入数组。然后,根据timesrecurring的值连接数组。

如果在我应用for循环的原始数据范围中只有一行“季度”和“重复发生”的脚本运行良好。但是,一旦添加第二行,就会发生以下情况:enter image description here

第一栏FTE报告应该有6行,而Ad-hoc应该有3行。但是,该脚本首先从原始数据中复制FTE报告6次,然后花费FTE报告和Ad-hoc 3次(尽管仅假设是3x)。似乎是第二次在阵列中存储了FTE报告行和Ad-hoc行,而不仅仅是Ad-hoc行。

我尝试了一些方法来解决此问题,并在网上查看,但找不到任何有效的方法。任何帮助,将不胜感激。

1 个答案:

答案 0 :(得分:0)

每发出一次x电话,您就会x.push。因此,如果x在调用要复制时有四个不同的行,那么结果将是8。

可能您只想多次将特定的datarange行添加到x。您可以使用push.apply语法来避免键入datarange[i]的内部元素:

const x = [];
datarange.forEach(function (row, i) {
  if (row[1] === "Recurring" && row[2] === "Quarterly") {
    var timesRepl = row[3];
    for(var n = 0; n < timesRepl; ++n) {
      Array.prototype.push.apply(x, row);
    }
    ... // Do other stuff with a quarterly recurring row
  }
  ...// Do other stuff with any row
});
...