【问题标题】:Filter gmails using timestamp使用时间戳过滤 gmail
【发布时间】:2021-03-10 03:32:46
【问题描述】:

我刚开始涉足 Google Apps 脚本;想问一下我的方向是否正确,以及如何在脚本中操纵时间。

我正在努力尝试在 Google App Script 中操作时间值,基本上我可以提取每封已发送电子邮件的时间戳,但我只想将最近的电子表格电子邮件信息粘贴到电子表格中,例如从脚本运行时间开始 30 分钟内。这是为了避免拉取重复信息。

不确定这里是否有 currentTime() 函数,或者我必须创建一个新的 Date() 对象并从那里进行一些计算。尝试了一些变体,但似乎没有任何效果。

非常感谢您帮助我们朝着正确的方向前进,谢谢!

function getDetails(){
  var DEST_URL = "SHEET_URL"; //redacted for sensitivity
  var DEST_SHEETNAME = "Test";
  
  var destss = SpreadsheetApp.openByUrl(DEST_URL);
  var destSheet = destss.getSheetByName(DEST_SHEETNAME);
  
  var threads = GmailApp.search("FILTERS"); //filter settings redacted for sensitivity

  for(var i = 0; i < threads.length; i++){
    var messages=threads[i].getMessages();  
    for(var j =0; j < 1; j++){ //only take first message in thread
      var message = messages[j];
      var subject = message.getSubject() ;
      var sentTimeStamp = message.getDate();

      if(sentTimeStamp is within last 30minutes as of script run time){ //this is where i need help
          var delimitString = subject.split("is sent");
          var detailName = delimitString[0];

          var lastRow = destSheet.getLastRow();
          destSheet.getRange(lastRow + 1,1).setValue(detailName);
          destSheet.getRange(lastRow + 1,2),setValue(sentTimeStamp);
      }
    }
  }
}

【问题讨论】:

    标签: google-apps-script google-sheets gmail-api


    【解决方案1】:

    您可以将timeStamp转换成ms秒,然后与“30 s ago”的值进行比较

    示例:

          var sentTimeStamp = message.getDate();
          var now = new Date();
          var ThirtyMinutesAgo = now-30*60*1000;
          if(sentTimeStamp.getTime() < ThirtyMinutesAgo){
            ...
          }
    

    参考资料:

    【讨论】:

      【解决方案2】:

      另一个想法是查询您在过去 30 分钟内收到的电子邮件。

      说明:

      您可以在 GmailApp.search 函数中获取最近 30 分钟前收到的电子邮件作为查询。请参阅此link 以了解您可以使用哪些过滤器。

      这将获取您在过去 30 分钟内收到的最后一封带有关键字“过滤器”的电子邮件。

      var ThirtyMinutesAgo = new Date(); 
      ThirtyMinutesAgo.setMinutes(ThirtyMinutesAgo.getMinutes() - 30);
      const queryString = `"FILTERS" newer:${Math.round(ThirtyMinutesAgo.getTime()/1000)}`
      const threads = GmailApp.search(queryString); // threads the last 30 minutes
      

      这种方法更有效有两个原因:

      1. 使用for 循环可以迭代的数据(线程)更少。

      2. 您不需要在每个线程上都应用和if 声明。

      解决方案:

      function getDetails(){
        var DEST_URL = "SHEET_URL"; //redacted for sensitivity
        var DEST_SHEETNAME = "Test";
        
        var destss = SpreadsheetApp.openByUrl(DEST_URL);
        var destSheet = destss.getSheetByName(DEST_SHEETNAME);
        
      //  var threads = GmailApp.search("FILTERS"); //filter settings redacted for sensitivity
        
        // new code
        var ThirtyMinutesAgo = new Date(); 
        ThirtyMinutesAgo.setMinutes(ThirtyMinutesAgo.getMinutes() - 30);
        const queryString = `"FILTERS" newer:${Math.round(ThirtyMinutesAgo.getTime()/1000)}`
        const threads = GmailApp.search(queryString); // threads the last 30 minutes
        //
      
        for(var i = 0; i < threads.length; i++){
          var messages=threads[i].getMessages();  
          for(var j =0; j < 1; j++){ //only take first message in thread
            var message = messages[j];
            var subject = message.getSubject() ;
            var sentTimeStamp = message.getDate();
      
                var delimitString = subject.split("is sent");
                var detailName = delimitString[0];
      
                var lastRow = destSheet.getLastRow();
                destSheet.getRange(lastRow + 1,1).setValue(detailName);
                destSheet.getRange(lastRow + 1,2),setValue(sentTimeStamp);
            }
          }
        }
      }
      

      【讨论】:

      • 嗨,Marios 感谢分享更有效的方法!目前,我的查询字符串有一个针对发件人和主题中的文本的过滤器(例如“来自:abc@gmail.com 和主题:电子邮件检查”)。我随着时间的推移读到了,我必须在其中添加一个“之后:”语法。这仍然适用于您共享的内容吗?
      • 是的!它会百分百有效。您可以输入您当前的选择,然后使用我提到的 @lyk 的添加。
      • 您可以执行以下操作: const queryString = old + `newer:${Math.round(ThirtyMinutesAgo.getTime()/1000)}` 其中old 是您当前的选择@lyk跨度>
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-18
      • 1970-01-01
      • 2021-12-25
      • 2021-04-28
      • 1970-01-01
      相关资源
      最近更新 更多