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

Google表格脚本发邮件报错Failed to send email: no recipient

问题根因

sheet.getLastRow()会将带有格式残留、编辑痕迹的空白行计入统计,导致代码读取到空的收件人地址,触发Failed to send email: no recipient报错。

修复方案(仅给最后一条有效记录发邮件)

从A列(邮箱列)底部向上遍历,定位到第一个存在有效邮箱地址的行后再读取数据发件,直接替换原有主逻辑代码即可:

function sender_mail(adress, name, chpri, chteh, chch, chzsis, chho) {
  MailApp.sendEmail({
    to: adress, 
    subject: "Результат по опросу на профориентацию для " + name, 
    htmlBody:  
    "Здравствуйте предлагаем вам результат опроса на профориентацию" + "<br><br>" +
      "Человек-природа: " + chpri + "<br>" +
      "Человек-техника: " + chteh + "<br>" +
      "Человек-человек: " + chch + "<br>" +
      "Человек-знаковая система:  " + chzsis + "<br>" +
      "Человек-художественный образ: " + chho + "<br>" +
      "- «Человек-Природа» - все профессии, связанные с растениеводством,животноводством, лесным хозяйством, с охраной окружающей среды." + "<br>" +
      "- «Человек-Техника» - все профессии, связанные с техникой." + "<br>" +
      "- «Человек-Человек» - все профессии, связанные с обслуживанием людей." + "<br>" +
      "- «Человек-Знаковая система» - все профессии, связанные с подсчетами, цифровыми и буквенными знаками." + "<br>" +
      "- «Человек-Художественный образ» - все творческие специальности." + "<br>"
  });
}

function sendLastValidMail() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('mail');
  const lastRow = sheet.getLastRow();
  let validRowIndex = 0;

  // 从最后一行往上查找有效邮箱行,i初始值为2代表跳过第1行表头,无表头可改为i=1
  for (let i = lastRow; i >= 2; i--) {
    const addr = sheet.getRange(i, 1).getValue().toString().trim();
    // 校验非空且包含@符号,过滤无效内容
    if (addr && addr.includes('@')) {
      validRowIndex = i;
      break;
    }
  }

  // 未找到有效收件人直接终止运行
  if (!validRowIndex) return;

  // 读取有效行数据发件
  const rowData = sheet.getRange(validRowIndex, 1, 1, 7).getValues()[0];
  sender_mail(rowData[0], rowData[1], rowData[2], rowData[3], rowData[4], rowData[5], rowData[6]);
}
扩展方案(批量给所有有效行发邮件)

如果需要给表格内所有有效记录批量发邮件,可一次性读取整段数据后逐行校验收件人有效性,跳过空白/无效行,执行效率更高:

function sendBatchValidMails() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('mail');
  const lastRow = sheet.getLastRow();
  // 从第2行开始读取7列数据,跳过表头
  const allData = sheet.getRange(2, 1, lastRow - 1, 7).getValues();

  allData.forEach(row => {
    const addr = row[0].toString().trim();
    // 收件人无效直接跳过当前行
    if (!addr || !addr.includes('@')) return;
    sender_mail(row[0], row[1], row[2], row[3], row[4], row[5], row[6]);
  })
}

注意:如果你的表格没有表头,把代码里遍历起始行i >= 2、读取范围的起始行2改成对应起始行号即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 02:21:15