Google Sheets脚本发送带附件邮件时出现401认证失败故障求助
Google Sheets脚本发送PDF附件401认证错误及修复方案
问题概述
原脚本可正常发送纯文本邮件,但添加PDF/XLSX附件时触发401未授权错误;开启muteHttpExceptions后邮件可发送,但附件为空或损坏,且未修改过脚本代码。
最优解决方案(推荐)
使用Google Apps Script内置的工作表导出方法,无需手动拼接导出URL,自动处理权限与格式逻辑,代码更简洁可靠:
function sendSheetAsPDF() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const activeSheet = ss.getActiveSheet(); const sheetName = ss.getName(); const email = "test@gmail.com"; const subject = "Important Info!"; const body = "Test email."; // 直接将当前工作表导出为PDF Blob const pdfBlob = activeSheet.getAs('application/pdf') .setName(`${sheetName}.pdf`); // 发送带PDF附件的邮件 GmailApp.sendEmail(email, subject, body, { attachments: [pdfBlob] }); }
方案优势
- 内置方法自动管理OAuth权限,避免手动拼接URL导致的权限校验失败
- 无需处理Token获取、HTTP请求等底层逻辑,减少出错概率
- 直接生成符合标准的PDF Blob,不会出现附件损坏问题
原脚本问题修复(兼容原有逻辑)
如果需要保留原脚本的URL拼接逻辑,需修正以下3个关键问题:
1. 修正MIME类型错误
原代码中mimeType: "application//pdf"的双斜杠是语法错误,应改为application/pdf,否则附件无法被正确解析。
2. 移除冗余的URL参数
原URL同时包含format=pdf和exportFormat=pdf,属于重复参数,会导致服务器解析异常,需删除其中一个。
3. 确保权限范围正确
手动获取的OAuthToken可能缺少Drive读取权限,需显式声明所需权限,或重新授权脚本。
修复后的代码:
/** * @OnlyCurrentDoc * @OAuth2Scope https://www.googleapis.com/auth/drive.readonly * @OAuth2Scope https://www.googleapis.com/auth/gmail.send */ function SampleEmail() { var ss = SpreadsheetApp.getActiveSpreadsheet() var ssID = ss.getId(); var sheetgId = ss.getActiveSheet().getSheetId(); var sheetName = ss.getName(); var email = "test@gmail.com"; var subject = "Important Info!"; var body = "Test email."; // 修正URL参数,移除重复的exportFormat var url = "https://docs.google.com/spreadsheets/d/" + ssID + "/export?format=pdf&gid=" + sheetgId + "&portrait=true"; var token = ScriptApp.getOAuthToken(); var result = UrlFetchApp.fetch(url, { headers: { 'Authorization': 'Bearer ' + token }, 'muteHttpExceptions': false }); var contents = result.getContent(); // 修正MIME类型的双斜杠错误 GmailApp.sendEmail(email, subject, body, { attachments: [{ fileName: sheetName + ".pdf", content: contents, mimeType: "application/pdf" }] }); }
权限修复步骤
- 打开脚本编辑器,点击「运行」->「运行函数」->「SampleEmail」
- 按照提示重新授权脚本,确保授权界面中包含Drive和Gmail的相关权限
- 重新运行脚本即可
内容的提问来源于stack exchange,提问作者J Sizzle
相关产品推荐
相关产品推荐

