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

如何用Google Apps Script遍历谷歌表格按用户筛选任务合并发邮件

Google Apps Script 任务提醒邮件优化方案

核心优化逻辑

  • 先全量遍历表格行,把未完成任务按负责人邮箱分组存储,不要每读到一条待办就直接发邮件
  • 所有任务分类完成后,再逐个给用户发送汇总了其全部待办的邮件,每个用户仅触发一次发信操作

优化后完整代码

function sendEmails() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("ITPM_Tasks");
  var lastRow = sheet.getLastRow();
  var startRow = 2; // 跳过表头,第一行数据从第2行开始
  var numRows = lastRow - 1; // 待处理的总数据行数
  var dataRange = sheet.getRange(startRow, 1, numRows, 5);
  var data = dataRange.getValues();

  // 用于按用户分组存储未完成任务的对象,键为用户邮箱,值为待办任务数组
  var userTasks = {};

  // 第一轮遍历:仅做任务筛选和分组
  for (var i = 0; i < data.length; ++i) {
    var row = data[i]; 
    var owner = row[3]; 
    var status = row[2];
    var desc = row[1];
    var due = row[4];
    
    // 仅处理未完成、且有明确负责人的任务
    if (status !== 'Complete' && owner) {
      // 若该用户首次出现,先初始化其待办数组
      if (!userTasks[owner]) {
        userTasks[owner] = [];
      }
      // 写入任务信息,兼容空日期的异常场景
      userTasks[owner].push({
        desc: desc,
        dueDate: due instanceof Date ? due.toDateString() : '未设置截止日期'
      });
    }
  }

  // 第二轮遍历:每个用户仅发送一封汇总邮件
  for (var ownerEmail in userTasks) {
    var taskList = userTasks[ownerEmail];
    // 拼接汇总版邮件内容
    var message = '提醒:你有以下待完成的ITPM任务\n\n';
    taskList.forEach(function(task, index) {
      message += `${index + 1}. 任务描述:${task.desc}\n   截止日期:${task.dueDate}\n\n`;
    });
    message += '请尽快完成任务并更新状态为已完成,如有特殊情况请同步告知ITPM团队\n\n谢谢配合';
    var subject = `每周提醒:你共有${taskList.length}项待完成ITPM任务`;
    MailApp.sendEmail(ownerEmail, subject, message);
  }
  SpreadsheetApp.flush();
}

关键改动说明

  • 新增分组存储对象userTasks,先归集所有待办任务再统一发信,从根源上避免单用户多邮件的问题
  • 新增日期异常兼容逻辑,若任务未设置截止日期不会导致脚本报错
  • 优化邮件主题和正文格式,用户可直接从主题看到待办任务总数,正文按序号列清所有任务信息,可读性更高
  • 把SpreadsheetApp.flush()从循环内移到全局末尾,仅需要执行一次即可,减少不必要的接口调用

内容的提问来源于stack exchange,提问作者Brandon Ekbatani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 08:36:03