Gmail指定日期范围收件计数偏高问题及解决方案
统计指定时间段内Gmail独立收件数量的脚本问题
我想编写一个简单脚本,统计Gmail在特定时间段内收到的**独立邮件(非邮件线程内的所有邮件)**数量,目前使用已知正确计数的固定日期做测试。
最初使用的代码如下:
function emailCount() { var receivedCount = 0; var threads = GmailApp.search("to:(\"my email\") after:2023/02/01 before:2023/02/02"); Logger.log(threads.length); for (var i = 0; i < threads.length; i++) { receivedCount = receivedCount + threads[i].getMessageCount(); } Logger.log(receivedCount); }
这段代码返回的邮件线程数是正确的,但邮件计数偏高——因为它会统计线程中的所有邮件,哪怕部分邮件不在指定的日期范围内。
请问如何实现指定日期范围内的独立邮件计数,以获取准确的收件数量?
已解决
感谢@Tedinoz的建议,我微调了他们的代码,实现了一个每日生成邮件计数并保存到表格的函数:
// 代码参考自@Tedinoz及其他相关贡献者 function emailCount() { var sheet = SpreadsheetApp.getActive().getSheetByName('Sheet1') var startDate = sheet.getRange('C1').getValue(); // 搜索起始日期 var endDate = sheet.getRange('E1').getValue(); // 搜索结束日期 Logger.log("DEBUG: 搜索起始日期 = "+startDate+",\n搜索结束日期 = "+endDate) var startDateFormated = formatDate(startDate); // 格式化为Gmail搜索支持的yyyy/mm/dd格式 Logger.log ("DEBUG: 格式化后的起始日期 = "+startDateFormated); var endDateFormated = formatDate(endDate);// 格式化为Gmail搜索支持的yyyy/mm/dd格式 Logger.log ("DEBUG: 格式化后的结束日期 = "+endDateFormated); Logger.log("to:(henry.ward@york.ac.uk) after:"+startDateFormated+" before:"+endDateFormated); // 打印即将执行的Gmail搜索语句 var threads = GmailApp.search("to:(henry.ward@york.ac.uk) after:"+startDateFormated+" before:"+endDateFormated); // 执行Gmail搜索 var threadCount = threads.length // 获取线程数量 var messsageCounter = 0 // 初始化邮件计数器 for (var i=0;i<threadCount;i++){ // 遍历所有线程 var messages = threads[i].getMessages() var messageCount = messages.length Logger.log("DEBUG: 当前线程邮件数量: "+messageCount) for (var m=0;m<messageCount;m++){ // 遍历线程内的每一封邮件 var messageDate = messages[m].getDate() var subject = messages[m].getSubject() // 获取邮件主题用于调试 var sender =messages[m].getFrom() // 获取发件人,用于排除自己发送的邮件 // 对比邮件日期是否在指定范围内,同时排除自己发送的邮件(这类邮件会被线程统计包含进来) if (startDate.valueOf() <= messageDate.valueOf() && messageDate.valueOf() <= endDate.valueOf() && sender.valueOf()!="My name <my email address>"){ Logger.log("DEBUG: 有效邮件: 日期 = "+messageDate+" 主题 = "+subject+" 发件人 = "+sender) messsageCounter++ } else{ Logger.log("DEBUG: 无效邮件: 日期 = "+messageDate) } } } Logger.log("有效邮件总数 = "+messsageCounter) // 将统计结果保存到表格最后一行的指定列(我设置了每日触发,自动记录每日计数) // 这段代码参考自其他来源,原出处已遗忘 var columnIndex = 8 ; // 第H列,用于保存邮件计数 var values = sheet.getRange(1, columnIndex, sheet.getMaxRows()).getValues(); for (var t = 0; t < values.length; t++) { if (values[t] == "") { var emptyCellIndex = t + 1; break; } } sheet.getRange(emptyCellIndex, columnIndex).setValue(messsageCounter); }
用于将日期格式化为Gmail搜索支持格式的formatDate函数,参考自@user3470953的代码:
function formatDate(date) { var d = new Date(date), month = '' + (d.getMonth() + 1), day = '' + d.getDate(), year = d.getFullYear(); if (month.length < 2) month = '0' + month; if (day.length < 2) day = '0' + day; return [year, month, day].join('/'); }
内容的提问来源于stack exchange,提问作者Henry Ward
相关产品推荐
相关产品推荐

