使用Google Apps脚本一次一行地将数据从阵列复制/推送到工作表范围内

时间:2018-02-25 14:36:02

标签: google-apps-script

我在原始表单上使用.getValues()创建了一个多维数组sheetValues [] []。我想将sheetValues数组中的值复制到目标表中。我怎么能将sheetValues数组的每一行的内容推送到目标表?

什么功能允许我一次一个地(在检查IF条件之后)将数组的每一行推到目标表的相应范围内?

以下是代码段:

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Source Sheet"); //Source sheet that has all data
var lastRow = sheet.getLastRow(); //last row number of Source sheet
var sheetValues = sheet.getRange(1, 1, lastRow, 18).getDisplayValues; //Copy Display values to an array; getDisplayValues() is used instead of getValues() to ignore formulas in the source cells such as "IMPORTRANGE"
var targetSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetbyName('Target Sheet'); //destination sheet
var currentRow = targetSheet.getLastRow(); //current last row of the destination sheet (start copying after this row)
var target = targetSheet.getRange(currentRow+1, 1); //target range where the copying of data should begin in destination sheet

loop through each row of the array (sheetValues) to check if the status (column I) is 'On Target'; if yes, copy that entire row to the target range defined above
for (var i = 0; i <= lastRow; i++) {
  if (sheetValues[i][9] == 'On Target') {
    How do I copy/push the entire row at once (column 1 - 18) directly into the target range (currentRow, columns 1-18)? What function do I use?
  }
  currentRow++;
}

1 个答案:

答案 0 :(得分:2)

永远不要一次一个地推动阵列的每一行&#34;。这是笨重的代码,启动速度极慢。设置值与获取值非常相似。您声明一个范围变量,其适当的坐标适合您的值[] []数组的维度,并将整个值数组传递给&#39; setValues()&#39; Range对象的方法。

getRange()的方法签名之一如下:

sheet.getRange(row, column, numberOfRows, numberOfColumns);

更多信息https://developers.google.com/apps-script/reference/spreadsheet/sheet#getrangerow-column-numrows-numcolumns

前两个参数用于范围中最左上角的单元格,而其他参数定义范围应跨越的行数和列数。

假设您想开始从目标表单中的第一个单元格插入值,这里是您需要的单行代码。

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

行数是数组的长度,列数是数组第一个元素(行)的长度。

<强>更新

我错过了代码中的评论。您可以在将值写入目标工作表之前对其进行过滤。

sheetValues = sheetValues.map(function(row){

if (row[9] == 'Target') { return row;  }

});