无需文件ID,GmailApp.sendEmail添加生成PDF附件的问题
修复邮件附件添加失败的问题
原代码中添加PDF附件的逻辑存在两处关键错误,导致邮件无法正确携带附件:
- 调用
getFilesByName时,传入的nameMtnSheet是函数名而非函数返回值,必须添加()执行函数获取文件名 getFilesByName()方法返回的是FileIterator对象,不能直接作为附件传入,需要从中提取实际的File对象
修复后的完整代码
function mtnPdfExport() { var ss = SpreadsheetApp.getActive(); var sheets = ss.getSheets(); var sheet = ss.getSheetByName("MTN"); var exportNameMtn = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("X").getRange("BH11").getValue(); // 隐藏非MTN的工作表 for (var i = 0; i < sheets.length; i++) { if (sheets[i].getSheetName() !== "MTN") { sheets[i].hideSheet(); } } var newFile = DriveApp.createFile(ss.getBlob()); // 恢复指定工作表的显示 for (var i = 0; i < sheets.length; i++) { var sheetName = sheets[i].getSheetName(); if (sheetName !== "MTN" && sheetName !== "CB2" && sheetName !== "X") { sheets[i].showSheet(); } } var fileName = nameMtnSheet(); newFile.setName(fileName); newFile.moveTo(DriveApp.getFolderById("1JFOod0Su8GwcPayntejRWpjCSwoHVWhy")); // 修复:调用函数获取文件名,并从迭代器中取出文件对象 let fileIterator = DriveApp.getFolderById("1JFOod0Su8GwcPayntejRWpjCSwoHVWhy").getFilesByName(fileName); let attachPdf = fileIterator.hasNext() ? fileIterator.next() : null; if (attachPdf) { GmailApp.sendEmail( "leorion20@gmail.com", "Mtnland customer job sheet", "Hi guys attached is a new customer account, thanks!", { attachments: [attachPdf] } ); } else { Logger.log("未找到指定的PDF文件"); } } function nameMtnSheet() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheetX = ss.getSheetByName("X"); var mtnExportName = sheetX.getRange("BH11").getValue(); return mtnExportName; }
关键修改说明
- 函数调用修正:将
getFilesByName(nameMtnSheet)改为getFilesByName(fileName),其中fileName是提前调用nameMtnSheet()获取的文件名,避免重复调用函数 - 处理FileIterator:通过
hasNext()判断迭代器中是否有文件,再用next()取出File对象,确保传入附件的是有效的文件实例 - 增加错误判断:添加文件存在性检查,避免因文件找不到导致的报错
- 高效优化方案:其实可以直接使用创建好的
newFile作为附件,无需从Drive中重新查询,这样更高效也能避免文件名冲突,修改后的邮件发送代码可简化为:GmailApp.sendEmail( "leorion20@gmail.com", "Mtnland customer job sheet", "Hi guys attached is a new customer account, thanks!", { attachments: [newFile] } );
内容的提问来源于stack exchange,提问作者horsefish
相关产品推荐
相关产品推荐

