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

Google Scripts批量发邮件报错求助:基于谷歌表格的邮件脚本问题

问题分析与修复方案

代码中的主要错误点:

  • 第一行存在无效代码片段[enter link description here][1],直接触发语法错误。
  • Link变量未定义,邮件内容中引用该变量会抛出未定义异常。
  • 邮件范围获取逻辑错误:getRange(3,11,lastRow, 1)的行数参数设置错误,应改为lastRow - 2(从第3行到最后一行的总行数),否则会读取超出实际数据范围的空行。
  • 邮件地址数组处理不当:getValues()返回二维数组,直接join(",")会生成格式错误的收件人字符串(如["a@example.com"],["b@example.com"]),需先转换为一维数组。
  • 多次单独调用getRange读取单元格数据,效率低下,可通过一次性读取整行数据优化性能。
  • 循环内的日志打印位置错误,会重复输出日志,且未正确处理空值过滤后的数组。

修复后的完整代码:

function RDCsendEmail() {
  // 获取订单列表工作表,移除无效代码片段
  var RawMaterialSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Order List");
  
  var ui = SpreadsheetApp.getUi();
  var response = ui.prompt('设置已收货行号', '输入工作表左侧对应已收货记录的行号', ui.ButtonSet.OK_CANCEL);
  
  // 将输入的行号转为数字类型并校验有效性
  var RowNumber = parseInt(response.getResponseText());
  if (isNaN(RowNumber)) {
    ui.alert('请输入有效的数字行号');
    return;
  }

  // 一次性读取整行数据,提升脚本运行效率
  var rowData = RawMaterialSheet.getRange(RowNumber, 2, 1, 13).getValues()[0];
  var EnteredBy = rowData[0];
  var Plant = rowData[1];
  var HM_number = rowData[2];
  var HM_Description = rowData[3];
  var PurchaseOrder = rowData[4];
  var PurchaseOrderQTY = rowData[6];
  var PO_DUEDATE = rowData[7];
  var Carrier = rowData[8];
  var TrackingNumber = rowData[9];
  var Reason = rowData[10];
  var PComments = rowData[11];
  var WHComments = rowData[12];

  // 定义Link变量(替换为实际需要的链接,此处用当前表格链接示例)
  var Link = SpreadsheetApp.getActiveSpreadsheet().getUrl();

  var Message= "录入人:  " + EnteredBy +
    "\n\n工厂:  " + Plant +
    "\n\n物料编号:  " + HM_number +
    "\n\n物料描述:  " + HM_Description +
    "\n\n采购订单号:  " + PurchaseOrder+
    "\n\n数量:  " + PurchaseOrderQTY + " KGs" +
    "\n\n采购订单到期日:  " + PO_DUEDATE +
    "\n\n承运人:  " + Carrier +
    "\n\n追踪号:  " + TrackingNumber +
    "\n\n加急原因:  " + Reason +
    "\n\n计划员备注:  " + PComments +
    "\n\n仓库备注:  " + WHComments +
    "\n\n链接: " + Link;   

  // 获取邮件列表工作表
  var Sheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Emails");
  var lastRow = Sheet2.getLastRow();
  // 修正范围:从第3行第11列(K列)开始,读取有效行数
  var emailRange = Sheet2.getRange(3, 11, lastRow - 2, 1);
  var EmailAddresses = emailRange.getValues();

  // 过滤空值并转换为一维数组,确保收件人格式正确
  var validEmails = EmailAddresses.flat().filter(email => email.trim() !== "");
  Logger.log("有效邮件地址: " + validEmails);

  var Subject = "CA/DV RDC - 加急物料到货通知: PO " + PurchaseOrder + " 对应 " + HM_number + " " + HM_Description;
  
  // 发送邮件给邮件列表中的所有收件人
  if (validEmails.length > 0) {
    MailApp.sendEmail(validEmails.join(","), Subject, Message);
  } else {
    ui.alert('未找到有效邮件地址');
  }
  
  // 发送邮件给录入人(B列的邮箱)
  if (EnteredBy.trim() !== "") {
    MailApp.sendEmail(EnteredBy, Subject, Message);
  } else {
    ui.alert('录入人邮箱为空,无法发送邮件');
  }
}

关键修改说明:

  1. 移除无效代码:删除第一行的无效片段,修复语法错误。
  2. 行号校验:将输入的行号转为数字,并添加有效性校验,避免非数字输入导致的异常。
  3. 批量读取数据:通过getRange一次性读取整行相关数据,减少API调用次数,提升效率。
  4. 补全变量定义:添加Link变量的赋值,修复未定义错误。
  5. 修正邮件范围:调整行数参数,确保只读取K3到最后一行的有效数据。
  6. 优化地址处理:用flat()将二维数组转为一维,再过滤空值,保证收件人格式符合要求。
  7. 添加异常提示:对空邮件列表、无效行号等场景添加弹窗提示,提升用户体验。
  8. 调整日志位置:将日志打印移到过滤完成后,仅输出有效邮件地址,便于调试。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 16:57:21