谷歌表格跨工作簿复制数据脚本报错:Cannot read properties of null
问题分析与修复方案
报错翻译
第6行出现错误
TypeError: 无法读取null的属性(读取'getRange') dataLog @ Untitled.gs:6
问题根源
- 变量重复覆盖:代码里多次用
ss作为变量名,先后指代当前工作簿、源工作表、目标工作表,逻辑彻底混乱。如果目标工作簿里找不到名为"Copy Of DataInput"的工作表,ss会变成null,调用getRange必然报错。 - 未定义核心变量:直接使用
lastRow却没声明或赋值,根本没法确定目标表的最后一行位置。 - 数据逻辑颠倒:最后一行的
ss.getRange('A2:K')实际是从目标工作表取数据,而非原本要复制的源工作表,完全搞反了操作对象。
修正后的代码
function dataLog() { // 获取当前工作簿的源工作表 const sourceSpreadsheet = SpreadsheetApp.getActive(); const sourceSheet = sourceSpreadsheet.getSheetByName('Data Sheet'); if (!sourceSheet) { throw new Error("未找到名为'Data Sheet'的源工作表"); } // 获取目标工作簿的目标工作表 const targetSpreadsheet = SpreadsheetApp.openById('xxxxxx'); const targetSheet = targetSpreadsheet.getSheetByName("Copy Of DataInput"); if (!targetSheet) { throw new Error("未找到名为'Copy Of DataInput'的目标工作表"); } // 获取源表A2:K的有效数据(过滤空行) const sourceData = sourceSheet.getRange('A2:K').getValues().filter(row => row.some(cell => cell !== "")); // 获取目标表有数据的最后一行 const lastRow = targetSheet.getLastRow(); // 将数据粘贴到目标表的下一行 if (sourceData.length > 0) { targetSheet.getRange(lastRow + 1, 1, sourceData.length, sourceData[0].length).setValues(sourceData); } }
关键修正说明
- 用不同变量名区分源/目标工作簿、工作表,彻底避免变量覆盖问题。
- 增加工作表存在性检查,提前抛出明确错误,方便快速排查问题。
- 过滤源数据中的空行,避免粘贴无效的空白内容。
- 正确获取目标表的最后一行位置,确保每次都把数据追加到已有内容的下方。
- 理顺数据流向:从源工作表取数据,再写入目标工作表,符合需求逻辑。
内容的提问来源于stack exchange,提问作者Louie Asquith
相关产品推荐
相关产品推荐

