You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
    }
  }
}

修复要点

  1. 修正range获取方式:将addTimestamp.range改为e.range,从事件对象中正确获取被编辑的单元格范围
  2. 优化性能:缓存currentSheet对象,避免重复调用e.source.getActiveSheet();直接用editedRange.getValue()获取编辑单元格的值,无需重复定位单元格
  3. 逻辑优化:将两个独立if改为else if,减少不必要的判断逻辑

内容的提问来源于stack exchange,提问作者NelsoN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 02:47:43