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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 18:45:10