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

如何将含图片的Google Docs模板以HTML格式原样通过邮件发送

问题背景

现有需求为将包含品牌logo、多张图片、文字说明的Google Docs模板,以与Docs内预览完全一致的效果通过邮件发送。目前已实现纯文本内容的邮件发送,无法完成带图片、带格式模板的邮件推送。
初始纯文本发送代码如下:

var body = doc.getBody().getText();
var message = body;
var subject = "subject line";
MailApp.sendEmail(user.primaryEmail, subject, message)

参考方案调整后的脚本存在显示异常、图片无法加载的问题,代码如下:

function getDocAsHtml(docId){ 
var doc = DocumentApp.getActiveDocument()
var url = "https://docs.google.com/feeds/download/documents/export/Export?exportFormat=html&id=" + doc.getId();
var html = UrlFetchApp.fetch(url, { headers: { authorization: "Bearer " + ScriptApp.getOAuthToken() } }).getContentText();
var body = doc.getBody().getText();
var message = body;
var subject = "subject line";
MailApp.sendEmail('abc@xyz.com', subject, message, { htmlBody: html });
}
原因分析

直接导出的Docs原生HTML无法直接用于邮件发送,核心问题有三点:

  • 导出代码中的图片源地址为Google Docs带权限校验的内部链接,收件人无文档访问权限时会直接显示裂图
  • 原生导出HTML携带大量Docs专属冗余样式,和多数邮件客户端的渲染规则不兼容,会出现排版错位、格式丢失的问题
  • 原调整后的脚本未对导出内容做适配处理,无法保证渲染一致性
可直接运行的修正代码
function sendFormattedDocEmail() {
  const doc = DocumentApp.getActiveDocument();
  const docId = doc.getId();
  // 导出文档为HTML格式
  let htmlContent = UrlFetchApp.fetch(
    `https://docs.google.com/feeds/download/documents/export/Export?exportFormat=html&id=${docId}`,
    { headers: { authorization: `Bearer ${ScriptApp.getOAuthToken()}` } }
  ).getContentText();

  // 内嵌所有图片为base64格式,无需权限即可加载
  const imgMatchRegex = /<img[^>]+src="(https:\/\/[^">]+)"/g;
  let imgMatchRes;
  while ((imgMatchRes = imgMatchRegex.exec(htmlContent)) !== null) {
    const imgSrc = imgMatchRes[1];
    try {
      const imgBlob = UrlFetchApp.fetch(imgSrc, {
        headers: { authorization: `Bearer ${ScriptApp.getOAuthToken()}` }
      }).getBlob();
      const base64Str = Utilities.base64Encode(imgBlob.getBytes());
      const mimeType = imgBlob.getContentType();
      htmlContent = htmlContent.replace(imgSrc, `data:${mimeType};base64,${base64Str}`);
    } catch (err) {
      console.log(`单张图片处理失败,已跳过:${err.message}`);
    }
  }

  // 清理冗余样式,适配邮件客户端渲染规则
  htmlContent = htmlContent
    .replace(/<style[^>]*>[\s\S]*?<\/style>/g, '')
    .replace(/class="[^"]*"/g, '')
    .replace(/id="[^"]*"/g, '');

  // 邮件参数配置
  const receiveAddr = 'abc@xyz.com'; // 替换为实际收件人邮箱
  const mailSubject = 'subject line'; // 替换为实际邮件主题
  const plainTextFallback = doc.getBody().getText(); // 纯文本兜底,兼容不支持HTML的邮件场景

  // 发送邮件
  MailApp.sendEmail(receiveAddr, mailSubject, plainTextFallback, {
    htmlBody: htmlContent,
    name: '发件人显示名称' // 可按需修改
  });
}
使用说明
  • 首次运行脚本时,根据弹窗提示完成权限授权即可,需要授权的范围包括文档访问、邮件发送、外部资源请求
  • 如果文档内图片总体积过大,超过邮件服务商的单封邮件大小限制会导致发送失败,可提前压缩文档内图片
  • 处理后的邮件会保留原文档的字体、段落、图片、排版格式,和Docs内预览效果一致,兼容主流邮箱客户端

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 09:16:10