谷歌表格Apps Script:新增收件人姓名非空校验,修复邮件误发问题
问题说明
现有Google Sheets脚本sendEmailver4功能为:当第26列(CEO审批框)、第27列(Account审批框)均勾选,且第28列(inform)值为uninformed时,发送邮件并将inform列设为informed,原有功能正常。
用户尝试新增校验逻辑:若第4列(收件人姓名)为空,则不发送邮件并弹出错误提示,但添加后无效——姓名为空时邮件仍会发送。
失效代码片段
用户新增的校验逻辑:
if(Acc_box.isChecked() && CEO_box.isChecked() && inform_cell.getValue() =="uninformed") { var subject = "Hi" + couse_col var messageBody = templateText.replace("{name}",receiverName).replace("{courseName}", couse_col) console.log("send Email to:"+ receiverEmail) try{ if (receiverName !== "") { MailApp.sendEmail(receiverEmail, subject, messageBody); inform_cell.setValue("informed"); } } catch(error) { SpreadsheetApp.getUi().alert(error) } }
问题原因
核心问题是获取收件人姓名的方式错误:
- 代码中用
receiverName = sheet.getRange(i, 4).getValues(),getValues()返回的是二维数组(即使单个单元格也会返回[[值]]),所以判断receiverName !== ""永远为true——数组和空字符串永远不相等,导致校验失效。 - 另外,try-catch的位置不合理,没有覆盖姓名为空的校验逻辑,无法触发弹窗提示。
修复方案
将获取姓名的方法改为getValue()(返回单个单元格的字符串值),并调整校验逻辑的位置,在发送邮件前先检查姓名是否为空,为空则弹窗提示,不执行发送操作。
修复后的完整代码
function sendEmailver4() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("sheet1"); const templateText = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("template").getRange(1,1).getValue(); const lastRow = sheet.getLastRow(); for(let i=2; i <= lastRow; i++) { const CEO_box = sheet.getRange(i, 26); const Acc_box = sheet.getRange(i, 27); const courseName = sheet.getRange(i, 8).getValue(); // 改用getValue()获取单个值 const receiverName = sheet.getRange(i, 4).getValue(); // 关键修复:用getValue()替代getValues() const receiverEmail = sheet.getRange(i, 19).getValue(); const inform_cell = sheet.getRange(i, 28); // 若邮箱为空,跳过当前行(原逻辑的break改为continue,避免中断整个循环) if (!receiverEmail) { continue; } if(Acc_box.isChecked() && CEO_box.isChecked() && inform_cell.getValue() === "uninformed") { // 先校验姓名是否为空 if (!receiverName) { SpreadsheetApp.getUi().alert(`第${i}行收件人姓名为空,无法发送邮件!`); continue; // 跳过发送,继续处理下一行 } const subject = "Hi" + courseName; const messageBody = templateText.replace("{name}", receiverName).replace("{courseName}", courseName); console.log("send Email to:"+ receiverEmail); try { MailApp.sendEmail(receiverEmail, subject, messageBody); inform_cell.setValue("informed"); } catch(error) { SpreadsheetApp.getUi().alert(`发送邮件失败:${error.message}`); } } } }
关键修改点
- 获取单元格值的方法修正:将
getValues()改为getValue(),确保拿到的是字符串而非数组,让空值校验生效。 - 调整校验顺序:在邮件发送逻辑前先检查姓名是否为空,为空则弹窗提示并跳过当前行。
- 循环逻辑优化:将原有的
break改为continue,避免因某一行邮箱为空就中断整个循环,改为跳过当前行继续处理后续行。 - 错误提示优化:弹窗提示明确标注行号和错误原因,方便定位问题;捕获邮件发送时的异常并给出具体错误信息。
内容的提问来源于stack exchange,提问作者Birddd
相关产品推荐
相关产品推荐

