Javascript GmailApp、getDate和Sort

Javascript GmailApp、getDate和Sort,javascript,sorting,google-apps-script,gmail-api,Javascript,Sorting,Google Apps Script,Gmail Api,我有一个脚本,可以在Gmail中提取未读邮件的日期(想法是我想获取最早未读邮件的日期) 但是它不喜欢它,因为getDate返回的值不能很好地处理sort。有人有什么想法吗 编辑---------------------------------------------------------- 已更新以显示当前脚本和输出: for (var inc = 0; inc < oldThread.length; inc++) { oldThread.forEach(function(m

我有一个脚本,可以在Gmail中提取未读邮件的日期(想法是我想获取最早未读邮件的日期)

但是它不喜欢它,因为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)
      });
for(var inc=0;inc
产出如下:

[18-06-21 13:49:42:549 BST][Wed Jun 20 02:08:24 GMT+01:00 2018]
[18-06-21 13:49:42:729 BST][6月19日星期二16:15:19 GMT+2018年1:00]
[18-06-21 13:49:42:734 BST][Wed Jun 20 02:08:24 GMT+01:00 2018]
[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][6月19日星期二16:15:19 GMT+2018年1:00]
[18-06-21 13:49:42:734 BST][Wed Jun 20 02:08:24 GMT+01:00 2018]
[18-06-21 13:49:42:739 BST][6月19日星期二16:15:19 GMT+2018年1:00]
[18-06-21 13:49:42:734 BST][Wed Jun 20 02:08:24 GMT+01:00 2018]


另外,不知道为什么它会在每封邮件中返回两批日期,看起来就像它自己在复制一样?

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

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); 
});
它将给出以下输出:

[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]

此输出是按升序进行的。只需交换ab即可按降序获得结果。您可以通过
Logger.log(sortedDateList)查看输出;

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

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); 
});
它将给出以下输出:

[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]

此输出按升序排列。只需交换ab即可按降序获得结果。您可以通过
Logger.log(sortedDateList)查看输出;

这并不是对您的问题的完整解决方案,而是演示如何使用
数组
函数从消息中获取信息

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();
}
请注意,有一个隐含的假设,即您所做的查询不是无法管理的大(如果是,Gmail将抛出一个错误)。我还假设至少有一个线程与查询匹配。我建议不要依赖这些假设:)

参考资料:


这不是对您的问题的完整解决方案,而是演示如何使用
数组
函数从消息中获取信息

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();
}
请注意,有一个隐含的假设,即您所做的查询不是无法管理的大(如果是,Gmail将抛出一个错误)。我还假设至少有一个线程与查询匹配。我建议不要依赖这些假设:)

参考资料:


您建议如何对
日期
对象进行排序?排序是针对集合的。请注意,线程中最早的消息将是第一条消息。线程顺序可能会根据最近的消息(或谷歌的实现细节)而改变因此,检查每个返回的线程可能仍然是明智的。您建议如何对
日期
对象进行排序?排序是针对集合的。请注意,线程中最早的消息将是第一条消息。线程顺序可能会根据最近的消息(或谷歌的实现细节)而改变因此,检查每个返回的线程可能仍然是明智的。感谢您的回复!这就是我所做的。我创建了一个空白数组(
var empty=[]
),并将日期变量推到该数组(tehhowch指出排序是用于集合的)。我尝试在新填充的数组上使用排序和反转,以及使用上面的方法。但它似乎没有按照我认为应该的方式工作。问题是什么?请您演示一下您所做的操作。首先将所有消息日期放入数组,然后对其应用排序。您同时在推送和排序。将日期排序部分作为一部分在内部的
forEach
方法中,您将日期推送到空[]数组中,并将其放入外部的
forEach
,它会工作的。感谢您的回复!这就是我所做的。我创建了一个空数组(
var empty=[]
),并将日期变量推到该数组中(tehhowch指出排序是针对集合的)。我尝试在新填充的数组上使用排序和反转,以及使用上面的方法。但它似乎没有按照我认为应该的方式工作。问题是什么?请您演示一下您所做的操作。首先将所有消息日期放入数组,然后对其应用排序。您同时在推送和排序。将日期排序部分作为一部分在内部的
forEach
方法中,您将日期推送到空[]数组中,并将其放入外部的
forEach
,它将工作。这非常有用。谢谢,tehhowch!这非常有用。谢谢,tehhowch!