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

如何通过Google Apps Script将谷歌表格可变行数表格嵌入邮件?

解决方案

问题原因

你之前的代码里,sheet.getRange('B8')只获取了单个单元格对象,直接拼接进邮件会输出对象的字符串(比如Range),而非实际数据。另外你需要的是动态行数的2列表格,得先获取完整的数据范围,再转换成适合纯文本邮件的格式。

修正后的完整代码

function ClosedPOsEmail() {
  // version 1.2, written by --Hyde, 13 January 2021
  //  - add |range| in |e.range.rowStart|
  // version 1.1, written by --Hyde, 13 January 2021
  //  - see https://support.google.com/docs/thread/93209480
  // version 1.0, written by --Hyde, 26 September 2020
  //  - initial version
  //  - see https://support.google.com/docs/thread/73381933?msgid=73395384

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Cancelled POs");
  var cancelledPOs = sheet.getRange("B6").getValue();
  var eaches = sheet.getRange("D6").getValue();
  var date = sheet.getRange("A1").getValue(); // 变量名避开内置对象Date,避免冲突

  // 获取动态2列表格数据(从B8开始,覆盖2列到最后一行有内容的行)
  var lastRow = sheet.getRange("B:B").getValues().filter(String).length; // 定位B列最后一行有数据的行号
  var poBreakdownData = sheet.getRange(8, 2, lastRow - 7, 2).getValues(); // 取B8到C列的完整数据范围

  // 将二维数组转换成纯文本表格格式
  let poBreakdownText = "";
  if (poBreakdownData.length > 0) {
    // 添加表头(可根据实际表格结构调整)
    poBreakdownText += "PO编号\t数量\n"; // 用制表符分隔列,纯文本中对齐效果清晰
    poBreakdownText += "--------\t--------\n";
    // 遍历每行数据拼接成文本
    poBreakdownData.forEach(row => {
      poBreakdownText += `${row[0]}\t${row[1]}\n`;
    });
  } else {
    poBreakdownText = "暂无取消的PO明细\n";
  }

  const emailAddress = 'toby.berry@email.com';
  const emailSubject = 'CONFIRMATION OF CLOSED PURCHASE ORDERS - '+ date;
  let emailContents = 'Dear all,\n';
  emailContents += 'This is to confirm that ' + cancelledPOs + ' POs have been cancelled which consisted of ' + eaches+ ' eaches.\n\n';
  emailContents += "PO明细:\n";
  emailContents += poBreakdownText + '\n\n';
  emailContents += 'Kind regards,\n';
  emailContents += 'Toby';
  
  MailApp.sendEmail(emailAddress, emailSubject, emailContents);
  Browser.msgBox("The Cancelled POs email has now been sent. Thank you!");
}

关键修改说明

  • 动态获取数据范围:通过筛选B列非空值的数量得到最后一行行号,再用getRange(行号, 列号, 行数, 列数)精准获取2列完整数据。
  • 纯文本表格转换:用制表符(\t)分隔列,搭配表头和分隔线,让纯文本邮件里的内容呈现清晰的表格结构。
  • 变量名优化:将Date改为date,避免与JavaScript内置的Date对象冲突。

可选:发送HTML格式邮件(更美观的表格)

如果想要更规整的表格样式,可以改用HTML格式发送邮件,替换原代码中MailApp.sendEmail相关部分:

// 转换为HTML表格
let poBreakdownHtml = "";
if (poBreakdownData.length > 0) {
  poBreakdownHtml += "<table border='1' cellpadding='4' cellspacing='0'>";
  poBreakdownHtml += "<tr><th>PO编号</th><th>数量</th></tr>";
  poBreakdownData.forEach(row => {
    poBreakdownHtml += `<tr><td>${row[0]}</td><td>${row[1]}</td></tr>`;
  });
  poBreakdownHtml += "</table>";
} else {
  poBreakdownHtml = "<p>暂无取消的PO明细</p>";
}

// 构造HTML邮件内容
let emailHtml = `<p>Dear all,</p>
<p>This is to confirm that ${cancelledPOs} POs have been cancelled which consisted of ${eaches} eaches.</p>
<h4>PO明细:</h4>
${poBreakdownHtml}
<p>Kind regards,</p>
<p>Toby</p>`;

// 发送HTML邮件(同时保留纯文本备用)
MailApp.sendEmail({
  to: emailAddress,
  subject: emailSubject,
  htmlBody: emailHtml,
  body: emailContents
});

内容的提问来源于stack exchange,提问作者Toby Berry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 01:13:32