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

如何将电子表格指定区域转为图片嵌入自动发送的邮件正文

解决方法

核心修改逻辑

  • 导出格式从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>&nbsp;</p>
<p>A continuacion, los numeros de tu tienda en la ultima semana: </p>
<p>&nbsp;</p>
<img src="cid:rangeImg" style="max-width: 100%; border: none;" />
<p>&nbsp;</p>
<p>Ante cualquier duda o consulta, puedes contactarte con tu ejecutivo de cuentas a la siguiente direccion de correo: ${kam}</p>
<p>&nbsp;</p>
<p>¡Si tenes Rappi, tenes todo!&nbsp;</p>
<p>&nbsp;</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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 00:24:03