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

Google表格自动发邮件报错:Failed to send email: no recipient

问题修复:处理空白/无效邮箱避免发送失败

你遇到的Failed to send email: no recipient错误确实是因为脚本尝试发送到空白邮箱地址导致的——GmailApp.sendEmail不允许空字符串作为收件人参数。下面是修复后的代码,同时优化了性能并添加了邮箱有效性验证:

function sendemails() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const emailSheet = ss.getSheetByName("Emails");
  const templateText = ss.getSheetByName("Template").getRange(1,1).getValue();
  const lr = emailSheet.getLastRow();

  // 邮箱列的索引(从1开始)
  const emailColumns = [6,8,10,12,14,16,18,20,22,24];

  for (let i = 3; i <= lr; i++) {
    // 一次性获取整行数据,提升性能
    const rowData = emailSheet.getRange(i, 1, 1, 24).getValues()[0];
    const Student = rowData[1]; // 第2列(数组索引从0开始)
    const ParentName = rowData[2]; // 第3列

    const messageBody = templateText.replace("{StudentName}", Student).replace("{Parent}", ParentName);
    const subjectLine = "Sweetwater Elementary Light It Up! Fundraiser from " + Student;

    // 遍历所有邮箱列
    for (const col of emailColumns) {
      const email = rowData[col - 1]; // 列索引转数组索引(减1)
      // 验证邮箱非空且格式有效
      if (validateEmail(email)) {
        GmailApp.sendEmail(email, subjectLine, messageBody);
      }
    }
  }
}

// 邮箱格式验证函数
function validateEmail(email) {
  // 非空且符合基本邮箱格式规则
  return email && /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
}

关键改进说明

  • 拦截无效收件人:通过validateEmail函数先检查邮箱是否非空、格式合法,只有通过验证的邮箱才会执行发送操作,从根源避免“no recipient”错误
  • 优化执行效率:用一次性获取整行数据的方式,替代原代码中多次单独调用getRange,大幅减少Spreadsheet API请求次数,运行速度更快
  • 简化代码结构:把分散的邮箱变量改成数组循环,避免重复的发送代码,后续新增/调整邮箱列只需修改数组即可,更易维护

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 15:07:32