Google Apps Script发送指定工作表为Excel附件报错如何解决?
错误原因说明
- 首次报错是因为
getSheetByName("EMAIL")返回的是单个工作表(Sheet类)对象,该类没有getAs()方法,只有整个电子表格(Spreadsheet类)才支持getAs()方法导出为文件,直接调用会报方法不存在的错误。 - 第二次报错一是因为MimeType的枚举值写法错误,正确的Excel格式枚举是大写的
MimeType.XLSX;二是就算写法正确,此时导出的是整个电子表格的所有工作表,不符合你仅导出EMAIL工作表的需求。
修复方案
要导出单个工作表为Excel附件,需要构造指定工作表的导出链接,通过UrlFetchApp拉取文件流后作为附件发送,完整修复代码如下:
function sendReport() { // 隐藏Data工作表(如果不需要可以删除这行) SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Data").hideSheet(); // 1. 获取必要的ID参数 const ss = SpreadsheetApp.getActiveSpreadsheet(); const ssId = ss.getId(); const targetSheet = ss.getSheetByName("EMAIL"); const sheetGid = targetSheet.getSheetId(); // 获取EMAIL工作表的唯一ID // 2. 构造单个工作表的xlsx导出链接 const exportUrl = `https://docs.google.com/spreadsheets/d/${ssId}/export?format=xlsx&gid=${sheetGid}`; // 3. 带权限请求导出文件,获取文件blob const token = ScriptApp.getOAuthToken(); const response = UrlFetchApp.fetch(exportUrl, { headers: { 'Authorization': 'Bearer ' + token } }); const excelBlob = response.getBlob().setName("Weekly Report.xlsx"); // 4. 发送邮件 const message = { to: "email@domain.com", subject: "Weekly Reports", body: "Hi Team,\n\nPlease find attached summary reports, Thanks!\n\nThank you,\nMyNameHere", name: "MyNameHere", attachments: [excelBlob] } MailApp.sendEmail(message); // 恢复激活EMAIL工作表(如果需要可以保留) targetSheet.activate(); // 如果之前隐藏了Data工作表需要恢复的话可以加这行: // ss.getSheetByName("Data").showSheet(); }
注意事项
- 首次运行需要授权脚本的访问权限,包含访问电子表格、发送邮件、访问外部链接的权限
- 如果需要导出的文件包含隐藏列/行,导出时会保留原工作表的显示配置,不需要额外处理
内容的提问来源于stack exchange,提问作者Atif Qayyum
相关产品推荐
相关产品推荐

