Google Apps Script转Doc为HTML发邮件遇大小超限及图片丢失问题
问题分析与解决方案
一、邮件体大小超限问题
可能原因
- Google Docs的HTML导出逻辑近期发生了更新,导出的HTML新增了冗余代码(如额外的内联样式、注释、编辑用脚本),导致体积超出MailApp的邮件体大小限制(MailApp单邮件大小上限为20MB,HTML字符数或内嵌资源会直接影响整体体积)。
- 即使文档内容未改动,Google Docs内部的格式优化或规则调整,也可能让导出的HTML字节数大幅增加。
排查与解决
- 对比当前导出的HTML与之前正常运行时的文件大小,查看差异点(比如是否新增大量重复CSS规则、无用脚本标签)。
- 精简HTML内容:
- 移除HTML中的
<script>标签(Google Docs导出的编辑用脚本对邮件无意义)。 - 删除HTML注释、冗余的样式规则,只保留邮件客户端兼容的核心样式。
- 若文档包含图片,检查是否被转为base64内嵌(这会大幅增加体积),改为外部链接引用。
- 移除HTML中的
二、邮件中图片丢失问题
根本原因
Google Docs导出的HTML里,图片src是需要OAuth令牌授权的内部链接,邮件客户端无法获取该授权,因此无法加载图片。而浏览器编辑器中你处于登录状态,能正常访问这些链接,导致测试时显示正常但邮件中丢失。
解决方法
方案1:替换为公开可访问链接
- 将文档中的图片上传至Google Drive,设置为「任何人可查看」的公开权限。
- 获取图片的直接访问URL(需转换分享链接为可嵌入的直链格式)。
- 遍历导出的HTML,替换所有图片的
src为公开链接。
方案2:转为base64内嵌HTML
- 通过UrlFetchApp携带OAuth令牌获取图片内容,转换为base64编码。
- 将HTML中图片的
src替换为data:image/[格式];base64,[编码内容]格式的字符串。
代码修改示例
function getDocAsEmailHtml(id_doc) { var url = "https://docs.google.com/feeds/download/documents/export/Export?id=" + id_doc + "&exportFormat=html"; var param = { method: "get", headers: { "Authorization": "Bearer " + ScriptApp.getOAuthToken() }, muteHttpExceptions: true, }; var doc_html = UrlFetchApp.fetch(url, param).getContentText(); // 精简HTML:移除无用脚本与注释 doc_html = doc_html.replace(/<script[^>]*>[\s\S]*?<\/script>/gi, ''); doc_html = doc_html.replace(/<!--[\s\S]*?-->/gi, ''); // 处理图片:将Google Docs内部链接转为base64内嵌 var imgRegex = /<img[^>]+src="([^"]+)"/gi; doc_html = doc_html.replace(imgRegex, function(match, src) { if (src.startsWith('https://docs.google.com')) { var imgParam = { headers: { "Authorization": "Bearer " + ScriptApp.getOAuthToken() }, muteHttpExceptions: true }; var imgBlob = UrlFetchApp.fetch(src, imgParam).getBlob(); var base64 = Utilities.base64Encode(imgBlob.getBytes()); return '<img src="data:' + imgBlob.getContentType() + ';base64,' + base64 + '"'; } return match; }); return doc_html; }
额外注意事项
- 优先使用公开链接方案,过多base64内嵌图片会快速增加邮件体体积,容易再次触发大小限制。
- 定期关注Google Workspace服务更新,Docs导出API可能随版本迭代调整,需及时适配逻辑。
内容的提问来源于stack exchange,提问作者Greg_apps_script
相关产品推荐
相关产品推荐

