如何在Apps Script中使用sendMail函数附加Google Drive中的pdfName文件?
解决Google Apps Script中sendMail无法附加Drive文件的问题
嘿,我来帮你搞定这个附件的问题!既然你说其他功能都正常,那大概率是在获取Drive文件或者传递附件的环节出了小差错,咱们一步步排查:
最常见的问题:直接用文件名而非文件对象/Blob
Google Apps Script的MailApp.sendEmail()或GmailApp.sendEmail()并不接受直接传文件名作为附件,你需要先从Drive中获取到文件的Blob对象或者直接传入文件对象。
举个修正后的示例代码:
function sendMailWithAttachment() { const pdfName = "你的PDF文件名.pdf"; // 替换成你的目标文件名 const recipient = "收件人邮箱@example.com"; const subject = "带PDF附件的邮件"; const body = "这是你需要的PDF文件"; // 1. 根据文件名查找Drive中的文件 const fileIterator = DriveApp.getFilesByName(pdfName); if (fileIterator.hasNext()) { // 2. 获取文件并转成Blob(邮件附件需要Blob格式) const pdfFile = fileIterator.next(); const pdfBlob = pdfFile.getBlob().setName(pdfName); // 确保附件显示正确的文件名 // 3. 发送邮件并附加Blob MailApp.sendEmail({ to: recipient, subject: subject, body: body, attachments: [pdfBlob] // 附件参数是数组,每个元素是Blob或文件对象 }); } else { // 如果找不到文件,抛出错误提示 console.error(`无法在Drive中找到名为 "${pdfName}" 的文件,请检查文件名或路径!`); } }
其他可能的原因及解决方法
- 重名文件问题:如果Drive中有多个同名的PDF,
getFilesByName()只会返回第一个匹配的文件。这种情况下,最好直接用文件ID来获取,更可靠:const pdfFile = DriveApp.getFileById("你的PDF文件ID"); const pdfBlob = pdfFile.getBlob(); - 权限不足:确保运行脚本的用户拥有该Drive文件的查看/编辑权限。如果文件在共享驱动器中,需要先定位到共享驱动器的文件夹再获取文件:
const sharedFolder = DriveApp.getFolderById("共享驱动器文件夹ID"); const fileIterator = sharedFolder.getFilesByName(pdfName); - 附件参数格式错误:确认
attachments是一个数组,哪怕只有一个附件也要用[]包裹。比如不要写成attachments: pdfBlob,必须是attachments: [pdfBlob]。 - 文件名拼写错误:仔细检查
pdfName的拼写,包括大小写、空格、特殊字符,虽然Drive不严格区分大小写,但完全匹配能避免不必要的问题。
内容的提问来源于stack exchange,提问作者Eric K.
相关产品推荐
相关产品推荐

