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

如何通过Google Sheets发送包含多个表格的HTML邮件

Google Apps Script 多表格邮件发送修改方案

核心调整逻辑:

  • 将原纯文本邮件改为HTML格式,适配多表格排版需求
  • 改造数据获取函数支持复用,可一次性读取4个不同表格区域的数据
  • 新增通用HTML表格生成方法,避免重复编写表格渲染代码

完整修改后代码

function sendEmail() {
  // 按需求配置4个数据源,对应字段:工作表名、数据范围、表格显示标题
  const tableConfigs = [
    {sheetName: "Data", range: "Stocks", title: "股票持仓数据"},
    {sheetName: "Data", range: "Funds", title: "基金持仓数据"},
    {sheetName: "Data", range: "Bonds", title: "债券持仓数据"},
    {sheetName: "Data", range: "Cash", title: "现金持有数据"}
  ];
  // 批量读取所有表格数据
  const allTableData = tableConfigs.map(config => ({
    title: config.title,
    data: getData(config.sheetName, config.range)
  }));
  // 生成HTML版邮件内容,同时保留纯文本版本兼容旧邮件客户端
  const htmlBody = getEmailHtml(allTableData);
  const textBody = "请使用支持HTML渲染的邮件客户端查看本次内容";

  MailApp.sendEmail({
    to: "youremail@example.com",
    subject: "资产更新通知",
    body: textBody,
    htmlBody: htmlBody // 新增HTML内容参数
  });
}

/**
 * 通用HTML内容生成函数,自动拼接多个表格
 * @param {Array} allTableData 所有表格的标题和对应数据
 */
function getEmailHtml(allTableData) {
  // 基础样式兼容主流邮件客户端,可自行调整显示效果
  let html = `
  <html>
    <head>
      <style>
        table {border-collapse: collapse; margin: 20px 0; width: 80%;}
        th, td {border: 1px solid #ddd; padding: 8px; text-align: left;}
        th {background-color: #f2f2f2;}
        .table-title {font-weight: bold; font-size: 16px; margin-top: 30px;}
      </style>
    </head>
    <body>
      <p>您好,本次资产更新内容如下:</p>
  `;

  // 循环渲染每个表格
  allTableData.forEach(table => {
    html += `<div class="table-title">${table.title}</div>`;
    // 表头可根据实际业务字段修改
    html += `<table><tr><th>名称</th><th>代码</th><th>价格</th></tr>`;
    table.data.forEach(item => {
      // 字段映射可根据实际表格列数调整
      html += `<tr><td>${item.name}</td><td>${item.ticker}</td><td>${item.price}</td></tr>`;
    });
    html += `</table>`;
  });

  html += `
    </body>
  </html>
  `;
  return html;
}

/**
 * 改造后通用数据获取函数,支持传入表名和范围读取数据
 * @param {string} sheetName 工作表名称
 * @param {string} rangeName 数据区域名称
 * @OnlyCurrentDoc
 */
function getData(sheetName, rangeName) {
  const values = SpreadsheetApp.getActive().getSheetByName(sheetName).getRange(rangeName).getValues();
  values.shift(); // 移除原表格的表头行
  const items = [];
  values.forEach(value => {
    const item = {};
    // 字段映射可根据每个表格的实际列结构修改
    item.name = value[0];
    item.ticker = value[1];
    item.price = value[2];
    items.push(item);
  });
  return items;
}

配置说明

  • 先修改tableConfigs配置项,把4个表格对应的工作表名、数据范围、显示标题替换为实际业务内容
  • 如果不同表格的字段结构不同,可单独调整对应表格的字段映射逻辑,也可以在tableConfigs中新增字段配置项适配
  • 代码内的CSS样式可自行调整,修改表格的颜色、宽度、边框等显示效果

内容的提问来源于stack exchange,提问作者Pankaj Pandey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 22:15:01