Google Sheets脚本异常:onEdit无日志、addTimeStamp报TypeError
问题修复方案
问题梳理
onEdit函数无日志、无报错,但勾选D列复选框后G列未生成时间戳- 直接执行
addTimeStamp函数触发错误:TypeError: Cannot read properties of undefined (reading 'source') - 核心需求:D列第6行及以下的复选框勾选时,对应行G列写入当前时间戳
错误原因分析
addTimeStamp手动执行报错:该函数依赖onEdit触发时传入的事件对象e,手动运行时e为undefined,自然无法读取e.source。- 逻辑判断失效:原代码通过查找"Done"单元格定位列和起始行,不仅冗余,还可能因找不到目标单元格导致后续代码崩溃;同时判断条件写反,导致符合要求的操作被提前拦截返回。
- 复选框值判断错误:复选框勾选时的
e.value是布尔值true,而非字符串"TRUE",原判断条件永远不成立。
修复后的代码
function onEdit(e) { addTimeStamp(e); } function addTimeStamp(e) { // 跳过无事件对象的情况(比如手动运行函数) if (!e) return; const activeSheet = e.source.getActiveSheet(); const modifiedCell = e.range; const targetCol = 4; // D列的列索引 const startRow = 6; // 起始行第6行 const offsetCol = 3; // 偏移到G列(D+3) // 仅处理D列第6行及以下的单元格变更 if (modifiedCell.getColumn() !== targetCol || modifiedCell.getRow() < startRow) { return; } // 复选框勾选时写入时间戳 if (e.value === true) { modifiedCell.offset(0, offsetCol).setValue(new Date()); console.log(`已为第${modifiedCell.getRow()}行写入时间戳`); } else { // 可选:取消勾选时清空时间戳 modifiedCell.offset(0, offsetCol).clearContent(); } }
关键说明
- 直接运行
addTimeStamp不会生效,必须通过编辑表格(勾选D列复选框)触发onEdit函数来调用它。 - 代码直接指定D列(索引4)和起始行6,逻辑更简洁稳定,无需依赖"Done"单元格定位。
- 适配复选框的布尔值判断,确保勾选时正确触发时间戳写入。
- 新增了取消勾选时清空时间戳的逻辑,可根据需求删除该部分。
内容的提问来源于stack exchange,提问作者LPCPTest
相关产品推荐
相关产品推荐

