使用Google Apps Script发带PDF附件邮件时getAs未定义错误如何解决
报错排查与解决方案
核心报错原因
你代码中出现TypeError: Cannot read property 'getAs' of undefined的直接触发点是:DriveApp.getFileById(link)返回的是单个Google Drive文件实例对象,不是数组,你调用file[0].getAs()时,file[0]本身就是undefined,自然无法读取其getAs属性。
其他连带错误修正
除了上述核心问题,你的代码还有3处逻辑错误需要同步修正,否则即使解决了当前报错依然无法正常运行:
MailApp.sendEmail传参格式错误:官方方法的参数结构为MailApp.sendEmail(收件人, 主题, 纯文本正文, 配置项对象),你将htmlBody和attachments拆成两个独立对象传入是错误的,需要合并到同一个配置项对象中- HTML正文获取逻辑错误:你直接将Drive文件实例赋值给
htmlBody,不会返回HTML文本内容,需要先读取文件的blob再转成字符串 - 缺少无效值兼容逻辑:如果某一行的邮箱、文件ID为空或者无效,会直接导致整个循环中断
修正后可用代码
function sendEmails() { var sheet = SpreadsheetApp.getActiveSheet(); var startRow = 2; var numRows = sheet.getRange('I1').getValue(); var dataRange = sheet.getRange(startRow, 1, numRows, 2); var data = dataRange.getValues(); // 提前读取公共HTML正文,避免循环中重复请求Drive接口 var htmlContent = DriveApp.getFileById("14KhceDa2lg7ojnwzFwpfiJCCx-xldPPj").getBlob().getDataAsString(); for (var i = 0; i < data.length; i++) { var row = data[i]; var emailAddress = row[0]; var fileId = row[1]; // 空值校验,跳过无效行 if (!emailAddress || !fileId) continue; try { var file = DriveApp.getFileById(fileId); var subject = 'Sending emails from a Spreadsheet'; MailApp.sendEmail( emailAddress, subject, "请使用支持HTML的邮箱客户端查看邮件", // 纯文本兜底内容 { htmlBody: htmlContent, attachments: [file.getAs(MimeType.PDF)] } ) } catch (e) { // 单条发送失败时打印日志,不会中断整个循环 console.log(`第${i+startRow}行发送失败,错误信息:${e.message}`); } } }
内容的提问来源于stack exchange,提问作者Yogesh Olla
相关产品推荐
相关产品推荐

