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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 11:21:04