突然出现GmailApp.sendEmail报错: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
相关产品推荐
相关产品推荐

