Google Sheets时间戳脚本报错TypeError: Cannot read properties of undefined求助
问题排查与修复:Google Sheets脚本时间戳失效问题
需求背景
当工作表「2023」中第13行及以后的M列(COL M)被编辑时:
- 若选中“Accuracy Check”,给对应行N列(COL N)添加时间戳
- 若选中“Offer Extended”,给对应行O列(COL O)添加时间戳
脚本此前运行正常,近期突然失效,报错信息如下:
执行日志
Execution log 8:51:29 AM Notice Execution started 8:51:37 AM Error TypeError: Cannot read properties of undefined (reading 'getRow') addTimestamp @ timeStamp.gs:14 onEdit @ timeStamp.gs:3
原代码
function onEdit(e) { addTimestamp(e); } function addTimestamp(e){ //variables var startRow = 13; var targetColumn = 13; var ws = "2023"; //target row and column var row = addTimestamp.range.getRow(); var col = addTimestamp.range.getColumn(); var currentDate = new Date(); if(col === targetColumn && row>= startRow && e.source.getActiveSheet().getName()=== ws){ if(e.source.getActiveSheet().getRange(row,13).getValue() =="Accuracy Check"){ e.source.getActiveSheet().getRange(row,14).setValue(currentDate); } if(e.source.getActiveSheet().getRange(row,13).getValue() =="Offer Extended"){ e.source.getActiveSheet().getRange(row,15).setValue(currentDate); } //END IF }//END IF }//END function addTimestamp
问题根源
报错指向第14行的addTimestamp.range.getRow(),错误原因是错误地从函数本身addTimestamp获取range属性——addTimestamp是函数对象,它并没有range属性,因此addTimestamp.range返回undefined,调用getRow()自然触发“无法读取undefined的getRow属性”的错误。
正确的做法是从传入的事件参数e中获取range,因为onEdit触发器会自动将编辑事件的上下文信息(包括被编辑的单元格范围)封装到e对象中。
修复后的代码
function onEdit(e) { addTimestamp(e); } function addTimestamp(e){ // 基础配置 const startRow = 13; const targetColumn = 13; const targetSheetName = "2023"; // 从事件对象获取编辑范围与当前工作表 const editedRange = e.range; const row = editedRange.getRow(); const col = editedRange.getColumn(); const currentSheet = e.source.getActiveSheet(); const currentDate = new Date(); // 校验编辑位置是否符合规则 if(col === targetColumn && row >= startRow && currentSheet.getName() === targetSheetName){ const cellValue = editedRange.getValue(); // 根据单元格内容设置对应列的时间戳 if(cellValue === "Accuracy Check"){ currentSheet.getRange(row, 14).setValue(currentDate); } else if(cellValue === "Offer Extended"){ currentSheet.getRange(row, 15).setValue(currentDate); } } }
修复要点
- 修正range获取方式:将
addTimestamp.range改为e.range,从事件对象中正确获取被编辑的单元格范围 - 优化性能:缓存
currentSheet对象,避免重复调用e.source.getActiveSheet();直接用editedRange.getValue()获取编辑单元格的值,无需重复定位单元格 - 逻辑优化:将两个独立
if改为else if,减少不必要的判断逻辑
内容的提问来源于stack exchange,提问作者NelsoN
相关产品推荐
相关产品推荐

