如何将电子表格指定区域转为图片嵌入自动发送的邮件正文
解决方法
核心修改逻辑
- 导出格式从PDF改为PNG:将导出请求的
format=pdf参数调整为format=png,直接获取选中区域的图片资源 - 带凭证请求导出地址:谷歌表格私有资源需要身份验证,通过
UrlFetchApp携带当前账号的OAuth凭证请求导出链接,拿到可直接使用的图片Blob对象 - 内嵌图片到邮件正文:使用Gmail发送接口的
inlineImages参数绑定图片资源,在邮件HTML中通过cid协议引用图片,无需外部链接即可直接显示
修改后完整代码
var PRINT_OPTIONS = { 'size': 7, // 纸张尺寸. 0=letter, 1=tabloid, 2=Legal, 3=statement, 4=executive, 5=folio, 6=A3, 7=A4, 8=A5, 9=B4, 10=B 'fzr': false, // 重复行表头 'portrait': true, // false=横向 'fitw': true, // 适配宽度/实际尺寸 'gridlines': false, // 显示网格线 'printtitle': false, 'sheetnames': false, 'pagenum': 'UNDEFINED', // CENTER = 显示页码 / UNDEFINED = 不显示 'attachment': false } var PDF_OPTS = objectToQueryString(PRINT_OPTIONS); function onOpen(e) { SpreadsheetApp.getUi().createMenu('打印...').addItem('打印选中区域', 'printSelectedRange').addToUi(); } function printSelectedRange() { SpreadsheetApp.flush(); var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getActiveSheet(); var range = sheet.getRange(31,2,34,7); var gid = sheet.getSheetId(); var printRange = objectToQueryString({ 'c1': range.getColumn() - 1, 'r1': range.getRow() - 1, 'c2': range.getColumn() + range.getWidth() - 1, 'r2': range.getRow() + range.getHeight() - 1 }); // 修改导出格式为png var url = ss.getUrl().replace(/edit$/, '') + 'export?format=png' + PDF_OPTS + printRange + "&gid=" + gid; // 带凭证请求导出图片,拿到Blob对象 const response = UrlFetchApp.fetch(url, { headers: { 'Authorization': 'Bearer ' + ScriptApp.getOAuthToken() }, muteHttpExceptions: true }); const imgBlob = response.getBlob().setName('tiendaDatos.png'); var htmlTemplate = HtmlService.createTemplateFromFile('js'); htmlTemplate.url = url; SpreadsheetApp.getUi().showModalDialog(htmlTemplate.evaluate().setHeight(10).setWidth(100), '打印范围'); var tienda = sheet.getRange('B29').getValue(); var asunto = '¡Estos fueron los numeros de la semana pasada en tu tienda, ' + tienda + '!'; var email = 'INSERT'; // 替换为实际收件人邮箱 var kam = sheet.getRange('J33').getValue(); // 邮件正文添加img标签引用cid资源 var mensaje = `<p>¡Hola, <em><strong>${tienda}</strong></em>!</p> <p> </p> <p>A continuacion, los numeros de tu tienda en la ultima semana: </p> <p> </p> <img src="cid:rangeImg" style="max-width: 100%; border: none;" /> <p> </p> <p>Ante cualquier duda o consulta, puedes contactarte con tu ejecutivo de cuentas a la siguiente direccion de correo: ${kam}</p> <p> </p> <p>¡Si tenes Rappi, tenes todo! </p> <p> </p>`; // 发送邮件时添加inlineImages参数绑定图片 GmailApp.sendEmail(email, asunto, mensaje,{ htmlBody: mensaje, inlineImages: { rangeImg: imgBlob } }) } function objectToQueryString(obj) { return Object.keys(obj).map(function(key) { return Utilities.formatString('&%s=%s', key, obj[key]); }).join(''); }
注意事项
- 首次运行脚本需要授权相关权限,包括访问表格、网络请求、发送邮件的权限
- 如果导出图片尺寸不符合预期,可以调整
PRINT_OPTIONS中的参数,也可以在导出URL中额外添加scale=2参数提升图片清晰度 - 原有的弹窗打印功能保留,不需要可以自行删除相关代码
内容的提问来源于stack exchange,提问作者Federico Lazarte
相关产品推荐
相关产品推荐

