如何修复Google Apps Script复制表格数据时行数量不匹配的报错
修复方案
核心报错原因
你的代码存在两个问题共同触发报错:
- 循环边界错误:数组下标从0开始,
i<=files.length的写法会在最后一次循环尝试访问不存在的files[3],引发逻辑异常 - 写入范围不匹配:
setValues方法要求写入的单元格范围的行数、列数,必须和待写入的二维数组的行列数完全一致,你原写法直接指定A+lastRow+":AZ"的范围行数和源数据实际行数不匹配,就会触发你遇到的行不匹配报错。
修正后可直接运行的代码
// 获取当前活动工作表 var s = SpreadsheetApp.getActive().getActiveSheet(); // 读取三个源文件 var file1 = SpreadsheetApp.openById(DriveApp.getFilesByName("test1").next().getId()); var file2 = SpreadsheetApp.openById(DriveApp.getFilesByName("test2").next().getId()); var file3 = SpreadsheetApp.openById(DriveApp.getFilesByName("test3").next().getId()); var files = [file1, file2, file3]; // 记录当前写入的起始行,默认从第1行开始 var writeStartRow = 1; // 修正循环条件,仅遍历存在的文件 for (var i = 0; i < files.length; i++) { // 取当前源文件的第一个工作表,如需指定工作表可改为getSheetByName("你的工作表名") var sourceSheet = files[i].getSheets()[0]; // 只读取源文件里有数据的范围,避免读取大量空行 var sourceDataRowCount = sourceSheet.getLastRow(); var sourceDataColCount = sourceSheet.getLastColumn(); var sourceData = sourceSheet.getRange(1, 1, sourceDataRowCount, sourceDataColCount).getValues(); // 写入时严格按照源数据的行列数指定写入范围,完全匹配避免报错 s.getRange(writeStartRow, 1, sourceDataRowCount, sourceDataColCount).setValues(sourceData); // 更新下一次写入的起始行 writeStartRow = writeStartRow + sourceDataRowCount; }
说明
- 该方案不需要修改源数据,也无需使用IMPORTRANGE公式,完全符合你的要求
- 优化了读取逻辑,只读取源文件内有数据的区域,执行速度比原写法快很多
- 如果源文件需要取指定工作表,替换
getSheets()[0]为getSheetByName("目标工作表名称")即可
内容的提问来源于stack exchange,提问作者BigBenne
相关产品推荐
相关产品推荐

