Google Sheets技术问题:如何将工作表图表插入邮件附件PDF
解决方案:将工作表图表嵌入PDF附件的HTML中
要在HTML转PDF的过程中插入图表,不能使用邮件内联图片的cid:协议——因为HTML转PDF工具无法识别邮件专属的cid引用规则。正确的做法是将图表转换为Base64 Data URL,直接嵌入HTML的img标签中,PDF转换器可以直接解析这种格式的图片。
以下是修改后的完整代码:
function pdfSend() { const id = "<sheet id>"; const ss = SpreadsheetApp.openById(id); const sheet = ss.getSheetByName('Employee Report'); const data = sheet.getDataRange().getValues().slice(1); const gs = ss.getSheetByName('Graph'); var chart = gs.getCharts(); var imgBlob = chart[0].getAs("image/png"); // 将图表Blob转换为Base64 Data URL const imgBase64 = `data:image/png;base64,${imgBlob.getBytes().toString('base64')}`; data.forEach((row, i) => { let email = row[1]; if (email !== "") { let html = `<h1>Hello ${row[0]}</h1>`; html += `<div>Is your email correct? ${row[1]}</div>`; // 直接使用Base64 Data URL作为图片源,同时修正原代码的标签拼写错误 html += "<br><p align='center'><img src='" + imgBase64 + "'></p><br><br>"; const blob = Utilities.newBlob(html, MimeType.HTML); blob.setName(`${row[0]}.pdf`); const subject = 'Example PDF'; MailApp.sendEmail({ to: email, subject: subject, htmlBody: html, attachments: [blob.getAs(MimeType.PDF)] }); sheet.getRange(i+2,4).setValue('Sent'); } }); }
关键修改说明
- Base64转换:通过
imgBlob.getBytes().toString('base64')将图表的Blob对象转为Base64编码字符串,再拼接data:image/png;base64,前缀,生成PDF转换器可识别的图片地址。 - 修正标签错误:原代码中
<imgsrc是拼写错误,改为标准的<img src确保HTML格式合法。 - 兼容邮件正文:如果需要在邮件正文也显示图表,仍可保留原有的
inlineImages+cid:方式,两种引用方式互不冲突。
内容的提问来源于stack exchange,提问作者Jim E Russel
相关产品推荐
相关产品推荐

