如何在Google Sheets与Apps Script中按Hub分组并发送对应数据邮件?
Google Apps Script 按Sender分组并发送对应数据到Hub邮箱
核心逻辑实现
先搞定数据分组,再结合邮箱映射表发邮件,以下是完整可复用的代码,你可以根据自己的表格结构调整:
function sendHubDataEmails() { // 1. 获取主数据表格和Hub邮箱映射表 const ss = SpreadsheetApp.getActiveSpreadsheet(); const dataSheet = ss.getSheetByName("主数据"); // 替换成你的主数据表格名称 const hubEmailSheet = ss.getSheetByName("Hub邮箱映射"); // 替换成你的邮箱映射表名称 // 读取主数据(跳过表头,从第2行开始) const data = dataSheet.getDataRange().getValues().slice(1); // 读取Hub邮箱映射,转成对象方便查找 {Hub名称: 邮箱地址} const hubEmails = hubEmailSheet.getDataRange().getValues().reduce((obj, row) => { obj[row[0]] = row[1]; // 假设第1列是Hub名称,第2列是邮箱 return obj; }, {}); // 2. 按Sender字段分组数据 const groupedData = data.reduce((groups, row) => { const sender = row[0]; // 假设第1列是Sender字段,根据你的表格调整索引 if (!groups[sender]) { groups[sender] = []; } groups[sender].push(row); return groups; }, {}); // 3. 遍历每个Hub,生成邮件并发送 for (const hubName in groupedData) { const email = hubEmails[hubName]; if (!email) { console.log(`未找到${hubName}对应的邮箱,跳过发送`); continue; } // 把分组数据转成HTML表格(邮件里显示更清晰) const tableHtml = generateHtmlTable(groupedData[hubName], dataSheet.getDataRange().getValues()[0]); // 传入表头 const subject = `${hubName}专属数据报表`; const body = `您好,以下是${hubName}的对应数据:<br><br>${tableHtml}`; // 发送邮件 MailApp.sendEmail({ to: email, subject: subject, htmlBody: body }); console.log(`已向${hubName}(${email})发送邮件`); } } // 辅助函数:把数据转成HTML表格 function generateHtmlTable(data, headers) { let html = "<table border='1' cellpadding='5' cellspacing='0'>"; // 添加表头 html += "<tr>"; headers.forEach(header => { html += `<th style='background-color: #f0f0f0;'>${header}</th>`; }); html += "</tr>"; // 添加数据行 data.forEach(row => { html += "<tr>"; row.forEach(cell => { html += `<td>${cell}</td>`; }); html += "</tr>"; }); html += "</table>"; return html; }
关键调整点
- 替换代码中的表格名称:
"主数据"和"Hub邮箱映射"改成你实际的表格名 - 调整列索引:
- 主数据里Sender字段的列索引:
const sender = row[0],如果Sender在第3列就改成row[2](索引从0开始) - Hub邮箱映射表的列:
obj[row[0]] = row[1],如果Hub名称在第2列,邮箱在第3列,就改成obj[row[1]] = row[2]
- 主数据里Sender字段的列索引:
- 邮件主题和内容可以根据需求修改
测试建议
- 先在代码里加
console.log(groupedData),运行后查看日志确认分组是否正确 - 用
MailApp.sendEmail的测试模式(或者先给自己发测试邮件)验证表格格式是否正常
内容的提问来源于stack exchange,提问作者user3500780
相关产品推荐
相关产品推荐

