GmailApp,getDate和Sort

时间:2018-06-20 09:53:35

标签: javascript sorting google-apps-script gmail-api

我有这个脚本可以为Gmail中未读邮件提取日期(想法是我想获取最早的未读电子邮件的日期)

function someFunction () {
    var oldSearchQuery = "in:Inbox is:Unread"
    var oldThread = GmailApp.search(oldSearchQuery, 0, 500);
    for (var inc = 0; inc < oldThread.length; inc++) {
    oldThread.forEach(function(messages){
    messages.getMessages().forEach(function(msg){
    var date = msg.getDate()
    Logger.log(date)
    });

但是,我想对日期进行排序以获取最旧的日期(或者,如果有人知道更好的方法,只需获取最旧的未读电子邮件)。我尝试使用排序和反向:

    Script as above but with ----
    var date = msg.getDate()
    date.sort();
    date.reverse();
    Logger.log(date)
    });

但是它不喜欢它,因为getDate返回的值不能很好地与sort一起使用。任何人有任何想法吗?

编辑---------------------------------------------- ------------

已更新以显示当前脚本和输出:

  for (var inc = 0; inc < oldThread.length; inc++) {
    oldThread.forEach(function(messages) {
      messages.getMessages()
      .forEach(function(msg) {
        var dates = msg.getDate()
        var empty = []
        empty.push(dates);
        var sortedDateList = empty.sort(function(a,b){
          return new Date(a) - new Date(b); 
        });
        Logger.log(sortedDateList)
      });

输出为:

  

[18-06-21 13:49:42:549 BST] [2018年6月20日星期三02:08:24 GMT + 01:00]
  [18-06-21 13:49:42:729 BST] [星期二6月19日16:15:19 GMT + 01:00 2018]
  [BST 18-18-21 13:49:42:734] [2018年6月20日星期三02:08:24 GMT + 01:00]
  [18-06-21 13:49:42:739 BST] [星期二6月19日16:15:19 GMT + 01:00 2018]

我希望看到:

  

[18-06-21 13:49:42:729 BST] [2018年6月19日星期二16:15:19 GMT + 01:00]
  [BST 18-18-21 13:49:42:734] [2018年6月20日星期三02:08:24 GMT + 01:00]
  [18-06-21 13:49:42:739 BST] [2018年6月19日星期二16:15:19 GMT + 01:00]
  [BST 18-18-21 13:49:42:734] [2018年6月20日星期三02:08:24 GMT + 01:00]

还不知道为什么每个邮件都返回2个日期,看起来像是在重复吗?

2 个答案:

答案 0 :(得分:1)

您可以将未读邮件的日期列表放入数组中,然后可以在其上运行firstname方法。例如, 我有一个这样的日期数组,与代码中显示的msg.getDate()相同。我已经更改了日期,月份,年份和时间,以确保它适用于所有人。

sort

现在您可以在此数组上应用var dateList = [ 'Tue Dec 18 22:14:59 GMT-11:00 2018', 'Wed Jul 18 22:14:59 GMT-11:00 2017', 'Tue Jun 12 02:14:59 GMT-11:00 2018', 'Thu Apr 12 21:14:59 GMT-11:00 2019', 'Thu Jun 14 22:14:00 GMT-11:00 2018', 'Fri Jan 12 22:14:59 GMT-11:00 2018' ]

sort

它将给出以下输出:

var sortedDateList = dateList.sort(function(a,b){
  return new Date(a) - new Date(b); 
});

此输出按升序排列。只需交换 a b 以获得降序的结果。您可以通过[Wed Jul 18 22:14:59 GMT-11:00 2017, Fri Jan 12 22:14:59 GMT-11:00 2018, Tue Jun 12 02:14:59 GMT-11:00 2018, Thu Jun 14 22:14:00 GMT-11:00 2018, Tue Dec 18 22:14:59 GMT-11:00 2018, Thu Apr 12 21:14:59 GMT-11:00 2019] 查看输出。

答案 1 :(得分:1)

这并不是要完全解决您的问题,而是要演示使用Array函数从消息中获取信息。

function getThreadStartDate_(thread) {
  const messages = thread.getMessages();

  var now = new Date();
  var start = messages.reduce(function (earliest, msg) {
    var msgStart = msg.getDate();
    return (msgStart < earliest) ? msgStart : earliest;
  }, now);
  return start;
}

function getEarliestMatchingThread_(query) {
  const threads = GmailApp.search(query);
  // Sort descending, so we can call pop() to access the earliest one.
  threads.sort(function (a, b) {
    return getThreadStartDate_(b) - getThreadStartDate_(a);
  });
  return threads.pop();
}

上述用法的示例:

function foo() {
  const oldest = getEarliestMatchingThread_("your query here");
  Logger.log(oldest.getFirstMessageSubject());
}

请注意,有一个隐含的假设,即您进行的查询不会过大(如果这样,Gmail会抛出错误)。我还假设至少有一个线程与查询匹配。我建议不要依赖这些假设:)

参考文献: