Google Apps Script发送Sheet指定范围邮件无法保留表格格式
Google Apps Script 发送Sheet表格邮件保留原格式方案
问题描述
现有脚本可正常从Google Sheet的Summary工作表提取B2:AA49范围内容发送邮件,但邮件内的表格内容未保留原表格排版,仅显示无格式的拼接文本。
当前使用的代码如下:
function B2B() { var summary = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Summary"); var subject = "B2B - Delivery Status on"; var recipient = "******@***.in"; var dataRange = summary.getRange('B2:AA49'); var data = dataRange.getValues(); summary.getRange(2, 2, 25, 25).getValue; var body = "I just discovered Apps Script and it's so cool!" + data; MailApp.sendEmail(recipient, subject, body); }
问题原因
- 通过
getValues()拿到的data是二维数组结构,直接和字符串拼接时,JS会自动把数组转成逗号分隔的纯文本,不会生成表格结构 - 原代码调用
MailApp.sendEmail时仅传入了纯文本正文参数,没有传入可渲染排版的HTML格式正文,无法展示表格样式 - 代码中
summary.getRange(2, 2, 25, 25).getValue;是无效语句,既没有赋值也没有实际作用,属于冗余代码
修改后代码
核心逻辑是将提取到的二维数组拼接为标准HTML表格结构,发信时传入htmlBody参数渲染表格,同时保留纯文本正文兼容不支持HTML的邮件客户端:
function B2B() { var summary = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Summary"); // 主题补充发件当天日期,方便邮件归档区分 var subject = "B2B - Delivery Status on " + Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "yyyy-MM-dd"); var recipient = "******@***.in"; // 提取指定范围数据,删除原冗余取值代码 var dataRange = summary.getRange('B2:AA49'); var data = dataRange.getValues(); // 拼接HTML正文 var htmlContent = "<p>I just discovered Apps Script and it's so cool!</p>"; // 定义基础表格样式,边框合并、单元格内边距调整,和Sheet默认样式接近 htmlContent += "<table border='1' cellpadding='6' cellspacing='0' style='border-collapse: collapse;width:100%;'>"; // 逐行逐单元格拼接表格内容 for (var i = 0; i < data.length; i++) { htmlContent += "<tr>"; for (var j = 0; j < data[i].length; j++) { // 第一行作为表头用th标签,加粗显示 var cellTag = i === 0 ? "th" : "td"; htmlContent += `<${cellTag} style='border:1px solid #ccc;padding:6px;'>${data[i][j]}</${cellTag}>`; } htmlContent += "</tr>"; } htmlContent += "</table>"; // 纯文本备用正文,兼容不支持HTML的邮件客户端 var plainText = "I just discovered Apps Script and it's so cool!\n本邮件包含表格内容,请使用支持HTML格式的邮件客户端查看完整排版。"; // 发送邮件 MailApp.sendEmail({ to: recipient, subject: subject, body: plainText, htmlBody: htmlContent }); }
可选优化
- 如果需要1:1还原Sheet内的单元格样式(背景色、字体、对齐方式等),可以同步调用
getBackgrounds()、getFontWeights()、getHorizontalAlignments()等方法获取对应单元格的样式参数,拼接时写入对应标签的style属性即可 - 如果单元格包含日期、货币等特殊格式内容,可以在拼接单元格时单独做格式化处理,避免显示为Sheet内部存储的原始序列值
- 可以给表头行添加背景色、调整列宽,进一步提升邮件内表格的可读性
内容的提问来源于stack exchange,提问作者Tejas Chipre
相关产品推荐
相关产品推荐

