Google Apps Script循环后复制行setValues参数签名不匹配问题求助
问题原因
SpreadsheetApp.Range.setValues() 方法要求传入的参数必须是二维数组,结构为[[第一行值1, 第一行值2,...], [第二行值1, 第二行值2,...]],哪怕只写入单行数据,也需要用外层数组包裹。
你代码里的row = dataSetValues[i]是从getValues()返回的二维数组里取的单条行数据,本身是一维数组[列1值, 列2值...],直接传给setValues()就会触发参数不匹配的报错。
解决方案
1. 基础修复(解决报错)
只需要把传入setValues()的单行数据外层套一层数组即可,同时注意写入范围的列数要和你写入的列数一致,避免范围不匹配报错:
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(); // 提前获取目标表,不要放在循环里重复调用,提升性能 var ssDest = spreadsheet.getSheetByName('ws2'); 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]; // 单行数据套一层数组变成二维数组 let outputData = [row]; // 写入范围要和数据的行列数匹配:行数1,列数等于row的长度 var rngDest = ssDest.getRange(ssDest.getLastRow()+1,1, 1, row.length); rngDest.setValues(outputData); } }
2. 自定义指定复制列
如果不需要复制整行,只想复制指定列,可以提前定义需要保留的列索引(从0开始计数),然后过滤行数据即可,示例如下:
// 自定义要复制的列:比如要复制第1、3、6列,对应索引为0、2、5 const copyColumns = [0,2,5]; // 循环内过滤行数据的部分 if (sum > 115) { let row = dataSetValues[i]; // 按指定列过滤数据 let filteredRow = copyColumns.map(colIndex => row[colIndex]); let outputData = [filteredRow]; var rngDest = ssDest.getRange(ssDest.getLastRow()+1,1, 1, filteredRow.length); rngDest.setValues(outputData); }
额外优化建议
不要把目标表获取、目标范围获取这类不需要重复执行的逻辑放在循环内部,重复调用SpreadsheetApp的接口会大幅降低代码运行速度,提前在循环外处理即可。
内容的提问来源于stack exchange,提问作者Zimox
相关产品推荐
相关产品推荐

