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
相关产品推荐
相关产品推荐

