如何用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
相关产品推荐
相关产品推荐

