如何在Google Apps Script中从单元格范围生成邮件所需的任务列表
Google Apps Script 同收件人任务合并发邮件实现方案
首先调整实现逻辑:先遍历所有行归集同收件人的任务,再统一生成合并邮件发送,无需声明固定行数的范围变量,使用动态对象+数组即可实现可变长度的任务列表拼接。
实现步骤
- 第一步:声明对象存储分组数据,以收件人邮箱为键,值对应当前用户的姓名和所有任务列表
- 第二步:准备两套模板,一套是邮件整体模板,包含
{Name}、{TaskList}两个核心占位符;一套是单条任务的列表项模板,用来渲染每条任务的详情 - 第三步:先遍历所有任务行,把数据按邮箱归集到对应数组中
- 第四步:遍历分组后的数据,逐个拼接任务列表,替换模板占位符后发送邮件
优化后完整代码示例
// 1. 读取基础配置和模板 const ss = SpreadsheetApp.getActiveSpreadsheet(); // 邮件整体模板,你可以根据自己的需求修改内容,{TaskList}就是合并后的任务列表占位符 const emailTemplate = ss.getSheetByName("Code and Functions").getRange(1,1).getValue(); // 单条任务列表项模板,可根据需要调整格式,支持纯文本或者HTML格式 const taskItemTemplate = `- 任务组:{Task Group} 任务描述:{Task Descrip} 备注:{Task Notes} 创建日期:{Create Date} 状态:{Status} 参考链接:{Reference} `; // 一次性读取所有任务行的数据(比循环调用getRange效率高很多,你可以根据自己的实际行数调整范围) const allTaskRows = ss.getSheetByName("你的任务sheet名").getRange(4, 1, lr-3, 11).getValues(); // 2. 初始化分组存储对象 const userTaskMap = {}; // 3. 遍历所有行归集任务 allTaskRows.forEach(row => { // 按索引取对应列的值,注意getValues返回的数组索引从0开始,原来的第4列对应索引3,第5列对应索引4,以此类推 const currentDate = row[3]; const currentGroup = row[4]; const currentDescrip = row[5]; const currentNote = row[6]; const currentName = row[7]; const currentEmail = row[8]; const currentRef = row[9]; const currentStatus = row[10]; // 如果当前邮箱没有在分组里,初始化数据 if(!userTaskMap[currentEmail]) { userTaskMap[currentEmail] = { userName: currentName, tasks: [] } } // 把当前任务推入对应用户的任务列表 userTaskMap[currentEmail].tasks.push({ currentGroup, currentDescrip, currentNote, currentDate, currentStatus, currentRef }) }) // 4. 遍历每个用户生成合并邮件发送 Object.keys(userTaskMap).forEach(email => { const userData = userTaskMap[email]; // 拼接当前用户的所有任务列表 let taskListStr = ''; userData.tasks.forEach(task => { // 替换单条任务模板的占位符 const itemStr = taskItemTemplate.replace("{Task Group}", task.currentGroup) .replace("{Task Descrip}", task.currentDescrip) .replace("{Task Notes}", task.currentNote) .replace("{Create Date}", task.currentDate) .replace("{Status}", task.currentStatus) .replace("{Reference}", task.currentRef); taskListStr += itemStr + '\n'; }) // 替换整体邮件模板的占位符 const messageBody = emailTemplate.replace("{Name}", userData.userName) .replace("{TaskList}", taskListStr); const subjectLine = "你有新的任务分配"; // 调用发邮件接口 MailApp.sendEmail(email, subjectLine, messageBody); })
注意事项
- 如果你需要发送HTML格式的邮件,把模板改成HTML标签即可,任务列表可以用
<ul><li>标签实现 - 代码里的
你的任务sheet名需要替换成你实际存储任务的工作表名称 - 代码中默认你已经提前定义了
lr变量(即任务的最后一行行号),如果没有定义可以用ss.getSheetByName("你的任务sheet名").getLastRow()获取
内容的提问来源于stack exchange,提问作者53value
相关产品推荐
相关产品推荐

