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

突然出现GmailApp.sendEmail报错:Service unavailable: Gmail求助

解决Google App Script发送带附件邮件报"Service unavailable: Gmail"的问题

问题分析

你的代码核心问题在于附件参数格式错误,再加上手动构造导出URL的潜在不稳定因素,导致Gmail服务处理请求时抛出异常。以下是具体解决方案:

1. 修正附件参数格式

GmailApp.sendEmail的attachments参数要求传入Blob对象数组,而非单个拆分的对象。直接传入Blob对象更简洁且不易出错。

2. 优化表格导出方式

避免手动拼接导出URL,改用Spreadsheet原生API直接导出Sheet为xlsx格式的Blob,减少外部请求的风险:

修正后的完整代码

let spreadsheet = SpreadsheetApp.getActive();
let sheetName = spreadsheet.getActiveSheet().getName();
let targetSheet = spreadsheet.getSheetByName(sheetName);

// 用原生API直接导出Sheet为xlsx格式的Blob
let attachmentBlob = targetSheet.getAs('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
  .setName('filename.xlsx');

let email = "myname@mydomain.com";

// 修正attachments为数组格式
GmailApp.sendEmail(email, 'subject', '', {
  attachments: [attachmentBlob]
});

3. 额外排查方案

  • 替换为MailApp尝试:如果GmailApp服务存在临时波动,改用更轻量的MailApp,用法完全一致:
    MailApp.sendEmail(email, 'subject', '', { attachments: [attachmentBlob] });
    
  • 检查权限范围:打开脚本编辑器的「项目设置」,勾选「显示"appsscript.json"清单文件」,确保oauthScopes包含以下权限:
    "oauthScopes": [
      "https://www.googleapis.com/auth/gmail.send",
      "https://www.googleapis.com/auth/spreadsheets"
    ]
    
  • 添加重试逻辑:如果是临时服务不可用,可添加简单的重试机制避开高峰:
    function sendWithRetry(email, subject, blob, maxRetries = 3) {
      for (let i = 0; i < maxRetries; i++) {
        try {
          GmailApp.sendEmail(email, subject, '', { attachments: [blob] });
          return;
        } catch (e) {
          if (i === maxRetries - 1) throw e;
          Utilities.sleep(1000 * 60); // 重试前等待1分钟
        }
      }
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 13:26:00