如何在Google Apps脚本中使用For循环将数据存储在数组中-按值传递数组

时间:2019-06-04 19:00:28

标签: google-apps-script google-sheets

编辑:在底部回答

我在使用Google脚本时遇到了一些奇怪的行为。 我有一个二维数组,我使用for循环将数据插入其中。 我注意到如果使用     appendRow(someArray [i])  在for循环中,一切正常。

但是,如果尝试访问数据或在for循环之外使用appendRow,则它总是为我提供在for循环中运行的最后一行的数据。 所以:

appendRow(someArray[1])

得到与

相同的结果
appendRow(someArray[2]),appendRow(someArray[3])

使用for循环的OUTSIDE时。

谁能告诉我是什么原因引起的? 当我在2d数组上使用setValue时,也可以在循环外使用它,或者所有行都相同。

我在这个简单的小事情上花了2个小时,终于了解了导致问题的原因,但是我仍然不知道该如何解决。 我附上了一个简单的代码来说明问题所在,请关注第二个FOR循环。

function myFunctionAppendRowInside() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var data = sheet.getDataRange().getValues();
  var newRow = data[5];
  var arr = new Array(100,100);
  var currentId = 20000;
  var productSku = data[5][2];

  for (var i = 0; i < 99; i++){
    arr[i] = newRow
  }
  for (var i = 0; i < 99; i++){
     target.getRange(targetRow,1).setValue(evento[i]);
      arr[i][0] = currentId + i;
      arr[i][2] =  productSku + i;
      sheet.appendRow(arr[i]);
  }

//All of them gives the same row, which is the one created in the last run of the FOR loop arr[98]
     sheet.appendRow(arr[1]); 
     sheet.appendRow(arr[2]);
     sheet.appendRow(arr[3]);

 }

请向我解释是什么原因以及如何克服它。

编辑:添加了我的代码,该代码使用“ setValues”,但是仍然遇到相同的问题。我的数组仅填充有“ for循环”创建的LAST行

function myFunction() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var newSheet = activeSpreadsheet.insertSheet();
  newSheet.setName("newSheet");
  var data = sheet.getDataRange().getValues();

  //Taking the 5th row, using it as a template for rest of rows
  var newRow = data[5];

  //2d Array
  var arr = new Array(100,100);

  //data for the only 2 columns who are going to change between rows
  var currentId = 20000;
  var productSku = data[5][2];


  for (var i = 0; i < 99; i++){
      newRow[0] = currentId + i;
      newRow[2] =  productSku + i;
      arr[i] = newRow;
  }

  newSheet.getRange(2, 1, arr.length, arr[0].length).setValues(arr);

}

第二次修改:

所以问题是“ getValues()”返回一个我需要使用的数组。 但是Array是通过引用传递的,而不是通过值传递的,因此,我对代码进行的所有更改都会更改从“ getValues”获得的原始数组。

解决方案: 迭代从“ getValues”接收到的数组,并将值一个接一个地复制到新数组中,然后再对其进行操作。

我还创建了一个2d数组,这也需要运行“ for循环”

我附上了以下工作代码: 1.复制第13行,其中包括我原始工作表中的51列。 2.创建一个空的二维数组(9999x51)。 3.进入第13行,并根据当前迭代操作其列(即行“ 1”将包含原始数据+“ 1”

代码:

function myFunction() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();

  var data = sheet.getDataRange().getValues();


  //create Array
  var arr = []; 

  //turn it to a 2 dimension array
  for (var i=0;i<10000;i++) {
     arr[i] = [];
  }

  //starting point for our new id which will run from 30000-39999
  var currentId = 30000;

  //run on our 2 dimension array and manipulate data cell by cell
  for (var i=0; i <= 9999; i++){
    for (var j=0; j<= data[13].length - 1; j++){
      if (j == 0){
      var obj = currentId + i;
        arr[i][j] = obj;
      }else{
        if (j == 2){
        arr[i][j] = data[13][j] + i;
        }else{
          arr[i][j] = data[13][j];
        }
      }  
   }
  }

  //copy to new sheet
  var newSheet = activeSpreadsheet.insertSheet();
  newSheet.setName("newSheet466");
  newSheet.getRange(1, 1,10000, 51).setValues(arr);


}

1 个答案:

答案 0 :(得分:1)

我不确定是什么原因导致了您的问题。但是,与其附加每行(它可能会变得很慢),不如附加一个范围并设置其值,它会更快。例如:

sheet.getRange(1, 1, arr.length, arr[0].length).setValues(arr);

两个1是您要使用的起始位置。有关更多信息,请查看getRange上的文档。