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

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

错误原因

  1. 触发逻辑错误:原代码判断columnStart !=8(第8列编辑时触发),但需求是第7列编辑时触发,逻辑完全相反。
  2. 缺少参数校验:手动运行函数时,e参数不会被传入,导致e.range未定义,触发局部变量错误。
  3. 空值未处理:若表格中某些字段为空,邮件内容会出现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 23:00:01