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

Google Sheets Apps Script弹窗选否仍触发邮件发送问题求助

问题排查

梳理脚本逻辑后,核心问题点如下:

  • 逻辑运算符使用错误:你在sendMailEdit的外层条件判断中使用了单个&(按位与运算符)而非JavaScript标准的逻辑与运算符&&。两者的区别是&&会短路执行,前半段条件不满足时后半段代码不会运行;而&会执行所有条件段的代码再做运算,容易出现判断结果不符合预期的问题,极端场景下会跳过弹窗判断直接执行后续邮件发送逻辑。
  • 函数参数冗余覆盖:sendEmail函数第一行声明了和入参同名的email变量并赋值为1,虽然你后续没有使用传入的收件人列表,而是重新读取了Email工作表的全量数据,但这个声明会覆盖传入的参数,极易引发后续逻辑混乱。
  • 循环逻辑冗余:你在sendEmail的forEach循环体末尾加了return,只会执行第一次循环就退出,和你注释里提到的「要获取逗号分隔的收件人列表」的需求不符,如果需要给所有收件人发邮件,需要删除这个return语句。

你提到修复rData变量问题后脚本已经正常运行,大概率是之前rData取值异常导致脚本报错触发了Google Apps Script的异常重试机制,重试时跳过了弹窗交互逻辑直接触发了邮件发送。


优化后代码参考
function sendMailEdit(e) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const ui = SpreadsheetApp.getUi();
  const activeSheet = ss.getActiveSheet();
  const activeCell = ss.getActiveCell();

  // 替换为逻辑与&&
  if (activeSheet.getSheetName() == 'Project List' &&
    activeCell.getColumn() == 3 &&
    activeCell.getValue() == "_Complete") {

    const alertPromptText = '你确认要标记为完成吗?该操作会通知下一流程所有相关人员该工作已准备好进行加工。';
    const promptResponse = ui.alert(alertPromptText, ui.ButtonSet.YES_NO);

    if (promptResponse == ui.Button.YES) {
      const rData = activeSheet.getRange(e.range.rowStart,1,1,12).getValues();
      sendEmail(rData);
    } else {
      fix(e);
    }
  }
}

function sendEmail(rData) {
  const first = 0;
  const emailCol = 1; // 重命名避免和参数冲突

  const emailTemp = HtmlService.createTemplateFromFile("send");
  const ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Email");
  const data = ws.getRange("A1:B" + ws.getLastRow()).getValues();
  const lj = rData[0][1];
  const j = rData[0][5];
  const d = rData[0][3];
  const p = rData[0][4];
  const m = rData[0][7];
  const desc = rData[0][11];
  const now = new Date().toLocaleString("zh-CN");
  const msg1 = "激光工作编号: " + lj + " (" + now + ")" +
    "\n项目工作编号: " + j +
    "\n设计师: " + d +
    "\n项目提交编程日期: " + p +
    "\n使用材料: " + m +
    "\n描述: " + desc;
  const subject = "项目已准备好加工";
  
  data.forEach(function(row){
    emailTemp.fn = row[first];
    emailTemp.msg = msg1;
    emailTemp.j = j;
    emailTemp.d = d;
    emailTemp.lj = lj;
    emailTemp.p = p;
    emailTemp.m = m;
    emailTemp.desc = desc;

    const htmlMessage = emailTemp.evaluate().getContent();
    GmailApp.sendEmail(row[emailCol], subject, "请使用支持HTML的邮件客户端查看",
    {htmlBody: htmlMessage});
  });
}

function fix(e) {
  e.range.setNote(e.oldValue);
  e.range.setValue(e.range.getNote());
  e.range.clearNote();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 09:27:07