Google App Script 突发故障:CCTV标签邮件清理脚本停止运行
修复Gmail自动清理旧邮件脚本停止运行的问题
原脚本存在的核心问题
你的脚本停止工作主要是因为几个设计缺陷:
label.getThreads()默认只返回前100条邮件线程,当标签下邮件超过100条时,后续的旧邮件根本不会被处理- 代码里定义了
batchSize和searchSize但完全没用到,等于白设置 - 遍历所有线程再判断日期的方式效率极低,线程数量大时容易触发Google Apps Script的6分钟执行超时限制
修复后的完整代码
function cleanUp() { var delayDays = 60; // 邮件超过此天数会被移至垃圾箱 var batchSize = 100; // 每次处理的线程数量 var maxDate = new Date(); maxDate.setDate(maxDate.getDate() - delayDays); var maxDateStr = Utilities.formatDate(maxDate, Session.getScriptTimeZone(), "yyyy/MM/dd"); var label = GmailApp.getUserLabelByName("CCTV"); if (!label) { console.log("未找到「CCTV」标签,请检查标签名称是否正确"); return; } // 用Gmail搜索语法直接筛选符合条件的线程,不用遍历全部 var searchQuery = `label:${label.getName()} before:${maxDateStr}`; var threads; var pageToken = null; do { // 分页获取线程,避免一次性加载过多数据 threads = GmailApp.search(searchQuery, 0, batchSize, pageToken); if (threads.length === 0) break; // 批量移至垃圾箱,比单条处理高效得多 GmailApp.moveThreadsToTrash(threads); console.log(`已处理 ${threads.length} 条旧邮件线程`); // 更新分页token,处理下一批数据 pageToken = threads.length < batchSize ? null : GmailApp.getNextPageToken(); } while (pageToken); console.log("清理完成"); }
关键修改说明
- 标签存在性校验:如果「CCTV」标签被误删或名称修改,脚本会直接提示并终止,避免无意义的报错
- 精准搜索替代全量遍历:通过
before:搜索关键字直接过滤60天前的邮件,大幅减少需要处理的数据量 - 分页处理机制:利用
pageToken实现分批加载邮件,确保能处理标签下所有符合条件的邮件,不会遗漏 - 批量操作优化:用
moveThreadsToTrash()批量处理线程,减少API调用次数,降低超时风险 - 日志输出:方便你查看执行进度,排查异常情况
额外排查步骤
- 确认「CCTV」标签名称完全匹配(注意大小写、空格,比如不要写成「cctv」或「CCTV 」)
- 检查脚本授权:新建项目后需要重新授权Gmail访问权限,确保授权流程完成
- 查看执行日志:在Google Apps Script编辑器中点击「查看」→「日志」,查看是否有具体报错信息(比如权限不足、标签不存在等)
内容的提问来源于stack exchange,提问作者Madeon
相关产品推荐
相关产品推荐

