Google Sheets单元格编辑触发邮件脚本报错:TypeError: 无法读取未定义对象的属性 'range'
问题分析与修正方案
核心错误原因
- 直接手动运行
sendEditNotification函数:这个脚本依赖Google Sheets的onEdit触发器事件对象e,手动运行时e是undefined,读取e.range自然会报错。必须通过工作表编辑触发,或者测试时手动构造e对象。 - 脚本本身存在多处语法、逻辑错误,就算触发成功也无法正常运行。
修正后的完整脚本
function sendEditNotification(e) { // 拦截手动运行,避免报错 if (!e) { console.log("请通过编辑工作表触发此函数,不要手动运行"); return; } // 限定只处理"Daily PSP List"工作表,且编辑的是第6列(F列)、值为"Checked in"的情况 const targetSheetName = "Daily PSP List"; if (e.range.getSheet().getName() !== targetSheetName || e.range.columnStart !== 6 || e.value !== "Checked in") { return; } // 获取当前编辑行的完整数据(索引从0开始,对应表格列) const targetSheet = e.source.getSheetByName(targetSheetName); const row = e.range.rowStart; const rowData = targetSheet.getRange(row, 1, 1, targetSheet.getLastColumn()).getValues()[0]; // 根据你的表格结构调整索引:比如姓名在D列是索引2,年份在E列是索引3,时长在G列是索引5 const name = rowData[2]; const year = rowData[3]; const duration = rowData[5]; const email = "Chris.DonovanBayley@swale.at"; const currentStatus = "Checked in"; // 构造邮件内容 const msg = `Hi, ${name} has been marked ${currentStatus}\n年份: ${year}\n时长: ${duration}`; // 发送邮件 MailApp.sendEmail(email, "PSP attendance", msg); }
关键修正点说明
- 新增事件对象校验:加
if (!e)判断,避免手动运行时报错,同时给出明确提示。 - 修正工作表判断逻辑:原代码
e.source.getActiveSheet().getSheetByName()逻辑混乱,改成直接判断当前编辑的工作表是否为目标表,防止其他工作表编辑触发脚本。 - 获取正确行数据:原代码
getRange()无参数会拉取整个工作表数据,效率低且固定取rData[1][3]逻辑错误,改成获取当前编辑行的数据,符合实际需求。 - 修复变量与语法错误:
- 修正
Email和email大小写不一致问题(JS大小写敏感)。 - 补充未定义的
CurrentStatus变量,改成明确的currentStatus。 - 用模板字符串替代拼接,避免语法错误,同时让内容更易读。
- 修正
- 适配列索引:JS中列索引从0开始,比如表格D列对应索引2,需要根据你的实际表格结构调整
rowData的索引值。
触发器设置步骤
- 打开目标Google Sheets,点击「扩展程序」→「Apps脚本」。
- 在脚本编辑器左侧,点击时钟形状的「触发器」图标。
- 点击「添加触发器」:
- 选择函数:
sendEditNotification - 部署类型:「从电子表格」
- 事件类型:「编辑时」
- 保存并完成权限授权。
- 选择函数:
内容的提问来源于stack exchange,提问作者Rugby2014
相关产品推荐
相关产品推荐

