Google Sheets onEdit报'source' of undefined的TypeError错误
TypeError: Cannot read property 'source' of undefined 报错解决方法 报错核心成因
这个报错出现的逻辑非常明确:
- 代码读取的事件对象
e不存在,自然找不到它挂载的source属性 - 最常见的触发场景,是直接在GAS脚本编辑器里手动点击“运行”按钮执行
onEdit函数。作为简单触发器,e是Google Sheets在真实发生单元格编辑操作时,自动注入给函数的内置参数,手动触发执行时不会生成这个对象,运行到读取e.source的代码行就会直接抛出上述报错。 - 现有代码还存在逻辑错位问题:判断的触发编辑列是14列(N列),同时又要往同一行的14列写入当前日期,会形成编辑-触发-再写入-再触发的无限循环,极易触发脚本配额限制导致功能失效。
可直接复用的修正代码
function onEdit(e) { // 先做空值拦截,避免无事件对象时直接报错 if (!e?.range) return; const editRow = e.range.getRow(); const editCol = e.range.getColumn(); const currentSheet = e.source.getActiveSheet(); // 逻辑匹配:工作表为"Universe"、非表头行、编辑的是需要监控数据变更的列、不触发时间列本身的循环 const matchSheet = currentSheet.getName() === "Universe"; const isDataRow = editRow > 1; const isMonitoredColumn = editCol === 1; // 替换为你实际需要监控的、除时间戳列外的列号 const avoidLoop = editCol !== 14; if (matchSheet && isDataRow && isMonitoredColumn && avoidLoop) { currentSheet.getRange(editRow, 14).setValue(new Date()); } }
新手测试注意事项
- 测试这个触发器的时候,不要在脚本编辑器直接点运行:需要回到实际的Google Sheets页面,手动修改对应监控列的单元格内容,触发真实的编辑动作,脚本才会正常运行。
- 记得给时间戳列(也就是你写入日期的14列)设置单元格格式为日期/时间格式,避免写入的日期显示为一串时间戳数字。
- 如果需要监控整行所有列的变更,只需要把触发条件里的固定列号判断,改成编辑列不在14列、且行号大于1即可,不用写多列判断。
内容的提问来源于stack exchange,提问作者Márthon Marcell
相关产品推荐
相关产品推荐

