You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需文件ID,GmailApp.sendEmail添加生成PDF附件的问题

修复邮件附件添加失败的问题

原代码中添加PDF附件的逻辑存在两处关键错误,导致邮件无法正确携带附件:

  1. 调用getFilesByName时,传入的nameMtnSheet是函数名而非函数返回值,必须添加()执行函数获取文件名
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 03:16:12