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('录入人邮箱为空,无法发送邮件'); } }
关键修改说明:
- 移除无效代码:删除第一行的无效片段,修复语法错误。
- 行号校验:将输入的行号转为数字,并添加有效性校验,避免非数字输入导致的异常。
- 批量读取数据:通过
getRange一次性读取整行相关数据,减少API调用次数,提升效率。 - 补全变量定义:添加
Link变量的赋值,修复未定义错误。 - 修正邮件范围:调整行数参数,确保只读取K3到最后一行的有效数据。
- 优化地址处理:用
flat()将二维数组转为一维,再过滤空值,保证收件人格式符合要求。 - 添加异常提示:对空邮件列表、无效行号等场景添加弹窗提示,提升用户体验。
- 调整日志位置:将日志打印移到过滤完成后,仅输出有效邮件地址,便于调试。
内容的提问来源于stack exchange,提问作者Elise
相关产品推荐
相关产品推荐

