首页 > 解决方案 > 循环后复制行

问题描述

在我最后一个问题之后,我遇到了复制行的问题。

  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getSheetByName('ws1');
  var startRow = 4;
  var lastRow = sheet.getLastRow();
  var numRows = lastRow  - startRow + 1;
  var lastCol = sheet.getLastColumn();
  var dataSetValues = sheet.getRange(startRow, 1, numRows, lastCol).getValues();

  for (var i = 0; i < numRows; i++){
    let fVal =  dataSetValues[i][5];   
    let gVal = dataSetValues[i][6];
    let sum = +fVal + +gVal;
        
    if (sum > 115) {  
      let row = dataSetValues[i];
    }
  }

我期待什么?

我希望设置要复制的列

我编辑了这样的代码

  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getSheetByName('ws1');
  var startRow = 4;
  var lastRow = sheet.getLastRow();
  var numRows = lastRow  - startRow + 1;
  var lastCol = sheet.getLastColumn();
  var dataSetValues = sheet.getRange(startRow, 1, numRows, lastCol).getValues();

  for (var i = 0; i < numRows; i++){
    let aVal =  dataSetValues[i][0];
    let bVal =  dataSetValues[i][1]; // + other columns
    let fVal =  dataSetValues[i][5];   
    let gVal = dataSetValues[i][6];
    let sum = +fVal + +gVal;
        
    if (sum > 115) {  
      let row = dataSetValues[i];
            
  var ssDest = spreadsheet.getSheetByName('ws2');
  var rngDest = ssDest.getRange(ssDest.getLastRow()+1,1);

  //start copy
  rngDest.setValues(row)
    }
  }

我收到这个错误

参数 (number[]) 与 SpreadsheetApp.Range.setValues 的方法签名不匹配

谢谢

标签: javascriptgoogle-sheets

解决方案


您的脚本只需要对其进行一些更改:

1. 需要注意的是,该setValues()方法接受形式为 的二维数组作为参数Object[][]

您只是将一个一维数组传递给它,因此The parameters (number[]) don't match the method signature for SpreadsheetApp.Range.setValues您收到的错误。

为了解决这个问题,您必须转换row为二维数组并进行以下更改

rngDest.setValues(row)

rngDest.setValues([row])

2. 您必须准确指定目标范围内预期的行数和列数。

进行上述更改后,您最终会遇到The number of columns in the data does not match the number of columns in the range再次预期的错误。这是因为该getRange方法还需要行数和列数,以便在使用setValues时准确知道要设置的数据结构。

如果你看一下getRange 方法

getRange(row, column, numRows, numColumns)

返回具有给定行数和列数的给定坐标处左上角单元格的范围。

为了解决这个问题,必须进行简单的更改以准确指示行数和列数:

var rngDest = ssDest.getRange(ssDest.getLastRow()+1,1)

var rngDest = ssDest.getRange(ssDest.getLastRow() + 1, 1, 1, row.length);

如您所见,此处的行数为 1(因为您一次复制一行数据)并且列数等于row.length(因为row变量一次具有与一行对应的所有值)。

参考


推荐阅读