Google Apps 脚本/正则表达式仅显示电子邮件中的最新消息"train"

Google Apps Script / Regular expression to show only latest message in an email "train"

email train = 一封电子邮件的全部内容,包括以前的消息

电子邮件 线程 = Google Apps 脚本消息数组

问题:在 Google Apps 脚本中,我如何才能仅从电子邮件序列中导入最新的电子邮件?

我有一个基于 GmailApp class 的简单 Google Apps 脚本。最终,这会将所有发往和发自给定地址的电子邮件(使用搜索查询)导入电子表格:

  var threads = GmailApp.search('from: test@gmail.com OR to: test@gmail.com');
  Logger.log("Thread count: " + threads.length);
  for (var i = 0; i < threads.length; i++) {
    Logger.log("Subject:" + threads[i].getFirstMessageSubject());
    Logger.log("ID:" + threads[i].getId());
    var messages = threads[i].getMessages();
    for (var j = 0; j < messages.length; j++) {
      Logger.log(messages[j].getPlainBody());
    }
  }

电子邮件的一般问题是,当有人回复电子邮件时,它会包含原始文本。回复 5 或 6 次后,每封邮件都会变得很长,并且在如上所述导入 Gmail 线程中的所有邮件时,会出现大量重复。

gmail.com 网络界面通过使用省略号按钮解决了这个问题:

如何复制这个黑魔法?

我知道任何给定的解决方案都不是完美的。

我的第一个想法是使用某种正则表达式,但我不知道从哪里开始。

的确,正则表达式可以为这个问题提供一个不完美的解决方案。对于 U.S。时间和日期标准,以下匹配引用邮件前面的 Gmail 日期时间字符串:

var prev = /On (?:Sun|Mon|Tue|Wed|Thu|Fri|Sat), (?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d{1,2}, \d{4} at \d{1,2}:\d{2} [AP]M,/;

然后在循环中,可以截断从该日期时间开始的每条消息。

for (var j = 0; j < messages.length; j++) {
  var text = messages[j].getPlainBody();
  var match = text.match(prev);
  if (match) {
    text = text.slice(0, match.index);
  }
  Logger.log(text);
}

如果一些参与者对 Gmail 使用不同的区域设置,这将失败。当然,可以尝试调整这一点,例如,将星期几和 [AP]M 设为可选。