Google Sheets通过CreateDraft生成Gmail草稿时内嵌图片不显示问题求助
核心问题定位
你现有代码的问题根源是GmailApp.createDraft的参数使用不当:把生成的图片Blob直接作为第四个参数传入时,这个Blob会被识别为普通邮件附件,不会内嵌到邮件正文的内容流中。因此在草稿预览时,图片不会出现在正文区域,只能在附件列表中找到文件。
优化实现方案
要实现正文内嵌截图的效果,需要做三处关键调整:
- 给生成的表格图片Blob设置专属内容ID(CID)标记,作为正文图片的引用锚点
- 用HTML格式构造邮件正文,在需要嵌入截图的位置插入
<img src="cid:对应CID值">标签 - 调用草稿创建接口时,通过高级参数传入内嵌图片的映射关系,让Gmail自动将对应CID的图片绑定到正文标签位置,同时不把这张图归类为普通附件
可直接复用的修正代码
function sendit() { const range = "A1:H10"; const [header, ...values] = SpreadsheetApp.getActiveSheet() .getRange(range) .getDisplayValues(); // 保留原逻辑:生成表格截图Blob const table = Charts.newDataTable(); header.forEach((colName) => table.addColumn(Charts.ColumnType.STRING, colName)); values.forEach((row) => table.addRow(row)); const chartBlob = Charts.newTableChart() .setDataTable(table.build()) .setDimensions(500, 500) .setOption("alternatingRowStyle", false) .build() .getBlob(); // 生成专属CID标记,绑定图片Blob const imageCid = "sheetScreenshot_" + Math.random().toString(36).slice(2); chartBlob.setContentType("image/png"); chartBlob.setName(imageCid); // 构造含内嵌图片的HTML正文 const htmlBody = ` <p>The time is....</p> <p>对应表单截图如下:</p> <img src="cid:${imageCid}" /> `; // 配置内嵌图片映射关系 const inlineImageMap = {}; inlineImageMap[imageCid] = chartBlob; // 创建草稿,参数按接口要求传入 GmailApp.createDraft( "xxxxxx", "current time", "The time is....", { htmlBody: htmlBody, inlineImages: inlineImageMap } ); }
关键注意事项
- 上述逻辑创建的是Gmail草稿而非直接发送的邮件,完全支持打开草稿后手动补充额外信息再发送,匹配你的使用场景
- 生成图片时可通过
setOption追加样式配置,调整表格边框、字体、边距,让截图效果贴近原Excel表单的视觉表现 - 必须给图片Blob显式声明
image/png的内容类型,避免Gmail因文件类型识别错误导致图片加载失败
内容的提问来源于stack exchange,提问作者user13767853
相关产品推荐
相关产品推荐

