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

谷歌表格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}`);
      }
    }
  }
}

关键修改点

  1. 获取单元格值的方法修正:将getValues()改为getValue(),确保拿到的是字符串而非数组,让空值校验生效。
  2. 调整校验顺序:在邮件发送逻辑前先检查姓名是否为空,为空则弹窗提示并跳过当前行。
  3. 循环逻辑优化:将原有的break改为continue,避免因某一行邮箱为空就中断整个循环,改为跳过当前行继续处理后续行。
  4. 错误提示优化:弹窗提示明确标注行号和错误原因,方便定位问题;捕获邮件发送时的异常并给出具体错误信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 22:05:34