You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Google Script发送带PDF附件邮件遇服务器错误求助

解决Google Script发送带PDF附件邮件的服务器错误问题

我之前帮朋友排查过几乎一模一样的问题——不带附件邮件能正常发送,一加附件就报模糊的服务器错误,大概率是触发器权限限制或者文件访问权限的问题,给你几个具体的排查和解决步骤:

1. 核心问题:简单触发器onEdit的权限不足

你用的onEdit是Google Script的简单触发器,它有严格的权限限制:只能访问当前电子表格内的资源,无法调用需要额外授权的服务(比如访问Drive里的外部文件)。虽然不带附件时MailApp能运行,但一旦涉及从Drive获取文件并作为附件发送,就会触发权限校验失败,导致服务器错误。

解决方法:换成可安装触发器

把触发逻辑改成可安装触发器,它能获取完整授权,正常访问Drive和Mail服务:

  • 先把函数重命名(避免和简单触发器冲突),比如改成sendEmailWithAttachment
  • 打开脚本编辑器左侧的「触发器」面板,点击「添加触发器」
  • 配置选项:
    • 选择函数:sendEmailWithAttachment
    • 事件来源:「从电子表格」
    • 事件类型:「编辑时」
  • 保存后按照提示完成授权,要允许脚本访问你的Drive和邮件服务

2. 优化代码,增加错误排查能力

给代码加上try-catch捕获具体错误,能帮你快速定位问题(比如文件找不到、权限不够等),修改后的代码如下:

function sendEmailWithAttachment(e) {
  try {
    var responceSheet = SpreadsheetApp.getActiveSheet();
    var rows = responceSheet.getLastRow();
    var namesRange = responceSheet.getRange(rows, 3, 1, 1);
    var emailsRange = responceSheet.getRange(rows, 1, 1, 1);
    var nameSender = namesRange.getValue();
    var emailSender = emailsRange.getValue();
    var emailReplyTo = "2teachingsecrets@gmail.com";
    var subject = "subject example";
    var body = "test body";

    // 检查文件是否存在
    var file = DriveApp.getFileById('你的Google Drive文件ID');
    if (!file) {
      throw new Error("无法找到指定ID的文件,请检查ID是否正确");
    }

    // 用对象参数形式发送邮件,更清晰规范
    MailApp.sendEmail({
      to: emailSender,
      subject: subject,
      body: body,
      replyTo: emailReplyTo,
      attachments: [file.getAs(MimeType.PDF)]
    });
    
    // 把成功状态写到表格,方便查看
    responceSheet.getRange(rows, 4).setValue("邮件发送成功");
  } catch (error) {
    // 记录错误信息到日志和表格,精准排查问题
    Logger.log("发送失败:" + error.toString());
    responceSheet.getRange(rows, 4).setValue("发送失败:" + error.toString());
  }
}

3. 额外排查点

  • 文件权限:确保脚本所在的Google账号是该Drive文件的所有者,或者至少有「编辑」权限;如果是共享文件,要确认共享权限允许访问
  • 文件大小:Google Script发送邮件的附件不能超过25MB,检查你的PDF文件大小是否超出限制
  • MimeType写法:如果用file.getAs('application/pdf')替代MimeType.PDF,有时候能避免类型识别问题,可以试试

按照上面的步骤改完,基本就能解决这个服务器错误了;要是还有问题,看日志里的具体错误信息就能精准定位~

内容的提问来源于stack exchange,提问作者user11475661

火山引擎 最新活动