Google Apps Script的sendEmails函数失效,调试显示局部变量未定义
Google Apps Script 邮件发送函数修复方案
问题描述
本人编程及JavaScript经验有限,代码来自网络示例。sendEmails函数原本用于电子表格第7列被编辑时,发送主题为「样本已退回」的回执邮件,邮件需包含学生姓名、提交时间戳、第7列的驳回备注、提交文件列表,发送至第2列的提交者邮箱。此前运行正常,近期突然失效,调试显示局部变量未定义。
原代码如下:
function sendEmails(e){ if (e.range.columnStart != 8 || e.source.getActiveSheet().getRange(e.range.rowStart, 7).getValue() == "") return; const rData = e.source.getActiveSheet().getRange(e.range.rowStart, 1,1,15).getValues(); let studentName = rData[0][2]; let timeStamp = rData[0][0]; let email = rData[0][1]; let notes = rData[0][7]; let file1 = rData[0][8]; let file2 = rData[0][9]; let file3 = rData[0][10]; let file4 = rData[0][11]; let file5 = rData[0][12]; let file6 = rData[0][13]; let msg = `Your sample submission for ` + studentName + ` on ` + timeStamp + ` has been returned for the following reason: ` + ` ` + notes + ` Please make the changes needed and resubmit. Thank you! Files for this submission: 1: ` + file1 + ` 2: ` + file2 + ` 3: ` + file3 + ` 4: ` + file4 + ` 5: ` + file5 + ` 6: ` + file6 MailApp.sendEmail(email, "Returned Sample", msg) }
错误原因
- 触发逻辑错误:原代码判断
columnStart !=8(第8列编辑时触发),但需求是第7列编辑时触发,逻辑完全相反。 - 缺少参数校验:手动运行函数时,
e参数不会被传入,导致e.range未定义,触发局部变量错误。 - 空值未处理:若表格中某些字段为空,邮件内容会出现
undefined,影响可读性。
修复后的代码
function sendEmails(e) { // 校验触发条件:必须是第7列编辑,且e参数存在 if (!e || !e.range || e.range.columnStart !== 7) return; const sheet = e.source.getActiveSheet(); const row = e.range.rowStart; const notes = sheet.getRange(row, 7).getValue(); // 若驳回备注为空,直接退出 if (!notes) return; // 获取当前行第1-15列的数据,解构赋值简化代码 const [timeStamp, email, studentName, , , , , , file1, file2, file3, file4, file5, file6] = sheet.getRange(row, 1, 1, 15).getValues()[0]; // 处理空值,避免邮件出现undefined const formattedName = studentName || "未填写姓名"; const formattedTime = timeStamp || "无提交时间"; // 整理文件列表,过滤空项 const fileList = [file1, file2, file3, file4, file5, file6] .filter(file => file) .map((file, idx) => `${idx + 1}: ${file}`) .join("\n"); // 构建中文邮件内容 const emailContent = `你的学生${formattedName}的样本提交(提交时间:${formattedTime})已被退回,原因如下: ${notes} 请修改后重新提交,谢谢! 本次提交的文件: ${fileList || "无附件文件"}`; // 确保邮箱有效再发送 if (email) { MailApp.sendEmail(email, "样本已退回", emailContent); } }
关键修复点
- 修正触发列判断,改为检测第7列编辑事件。
- 增加
e参数存在性校验,避免手动运行时报错。 - 用解构赋值简化数据获取,代码更简洁。
- 对空字段做默认值处理,优化邮件内容可读性。
- 过滤空文件项,避免邮件出现空行。
- 增加邮箱有效性检查,防止无效地址导致发送失败。
内容的提问来源于stack exchange,提问作者fabulousyeti
相关产品推荐
相关产品推荐

