Google Sheets脚本调用MailApp.sendEmail添加附件时报参数不匹配异常
报错原因分析
- 核心原因是
MailApp.sendEmail传入的第一个收件人参数类型不匹配:你传入的patientEmails[i]是number[](数字数组)类型,不符合接口要求的「字符串/字符串数组」格式。仅传前三个参数时接口存在隐式类型兼容逻辑可以正常执行,新增第四个配置参数后接口参数校验规则更严格,类型不匹配就会直接抛出方法签名不匹配的异常。 - 次要潜在问题:代码没有校验
DriveApp.getFilesByName的返回结果是否存在匹配文件,直接调用next()方法,如果云盘内不存在对应名称的PDF,后续会抛出没有可迭代元素的运行时错误。
修复步骤
- 修正收件人参数的取值逻辑:
patientEmails是getValues()返回的二维数组,patientEmails[i]取到的是第i行的整行数组,需要取对应列的单个值再转为字符串格式,示例:
// 假设邮箱存储在每行的第一列,取第一个元素再转字符串 var emailAddress = patientEmails[i][0].toString();
- 补充文件存在性校验:
var file1 = DriveApp.getFilesByName("why abilix.PDF"); // 校验是否存在匹配文件 if (!file1.hasNext()) { throw new Error("云盘内未找到指定名称的PDF文件"); } var pdfAttachment = file1.next().getAs(MimeType.PDF);
- 完整可运行的修改后代码:
var file1 = DriveApp.getFilesByName("why abilix.PDF"); if (!file1.hasNext()) { throw new Error("云盘内未找到指定名称的PDF文件"); } var pdfAttachment = file1.next().getAs(MimeType.PDF); var emailBody = textTemplate[0][0].replace("{patient.name}",patientNames[i][0]) .replace("{stage}",phase[j]); // 修正收件人取值 var emailAddress = patientEmails[i][0].toString(); MailApp.sendEmail(emailAddress, subject, emailBody, { name: 'Automatic Emailer Script', attachments: [pdfAttachment] });
内容的提问来源于stack exchange,提问作者Amir Kaassamany
相关产品推荐
相关产品推荐

