Google Sheets脚本报错:TypeError: Cannot read property 'source' of undefined
修复Google表格复选框移动行脚本的报错问题
报错原因解析
TypeError: Cannot read property 'source' of undefined 这个错误出现在onEdit函数第9行,核心原因有两个:
- 手动运行
onEdit函数时未传入event参数,导致event为undefined,调用event.source自然报错; onCheck不是Google Apps Script的内置简单触发函数,勾选复选框不会自动触发它,且它内部用SpreadsheetApp.getActiveRange()的方式不够可靠。
另外代码还存在几个细节问题:
- 工作表名拼写错误:你提到的工作表是
Submitted,但代码里写的是Submited Routes(多了一个m); - 重复获取表格对象:
var ss和var s都是获取当前活动表格,属于冗余代码; - 布尔值大小写不规范:JavaScript里应使用小写的
true/false,而非大写的TRUE/FALSE。
修复后的完整代码
function onEdit(event) { // 先判断event是否存在,避免手动运行脚本报错 if (!event) return; var ss = SpreadsheetApp.getActiveSpreadsheet(); var activeRange = event.range; var activeSheet = activeRange.getSheet(); var cellValue = activeRange.getValue(); // 处理Working on和Submitted Routes之间的行移动(第9列复选框) if (activeSheet.getName() === "Working on" && activeRange.getColumn() === 9 && cellValue === true) { var targetSheet = ss.getSheetByName("Submitted Routes"); moveRow(activeSheet, activeRange.getRow(), targetSheet); } else if (activeSheet.getName() === "Submitted Routes" && activeRange.getColumn() === 9 && cellValue === false) { var targetSheet = ss.getSheetByName("Working on"); moveRow(activeSheet, activeRange.getRow(), targetSheet); } // 处理Working on和Missed之间的行移动(第11列复选框) if (activeSheet.getName() === "Working on" && activeRange.getColumn() === 11 && cellValue === true) { var targetSheet = ss.getSheetByName("Missed"); moveRow(activeSheet, activeRange.getRow(), targetSheet); } else if (activeSheet.getName() === "Missed" && activeRange.getColumn() === 11 && cellValue === false) { var targetSheet = ss.getSheetByName("Working on"); moveRow(activeSheet, activeRange.getRow(), targetSheet); } } // 封装行移动逻辑,减少代码冗余 function moveRow(sourceSheet, rowNum, targetSheet) { var numColumns = sourceSheet.getLastColumn(); var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1); sourceSheet.getRange(rowNum, 1, 1, numColumns).moveTo(targetRange); sourceSheet.deleteRow(rowNum); }
关键优化点
- 增加
event存在性判断,避免手动运行脚本时触发错误; - 将原来的
onCheck逻辑合并到onEdit中,无需额外创建触发器; - 封装
moveRow函数,减少重复代码,提升维护性; - 修正工作表名拼写错误,统一布尔值为小写规范写法;
- 直接从
event.range获取编辑单元格,比getActiveRange()更可靠,避免其他操作干扰。
注意事项
- 确保你的工作表名和代码里的完全一致:
Working on、Missed、Submitted Routes; - 复选框所在列需对应代码里的第9列(I列)和第11列(K列),若列位置不同,修改对应的
getColumn()判断值即可; - 修改后的
onEdit是内置简单触发函数,无需手动创建触发器,勾选复选框会自动触发执行。
内容的提问来源于stack exchange,提问作者zbayle
相关产品推荐
相关产品推荐

