【问题标题】:Gmail script only pull from first email of each thread. Need return data from each messageGmail 脚本仅从每个线程的第一封电子邮件中提取。需要从每条消息中返回数据
【发布时间】:2020-01-20 23:21:03
【问题描述】:

我正在尝试使用使用正则表达式的脚本从 g-mail 消息中解析提取数据。让脚本的其余主要功能正常工作,但是有一个非常大的问题。

脚本仅从每个线程的第一条消息返回数据。我希望它从每个线程中的每条消息中返回数据,我一直在玩它,但到目前为止还没有运气。

任何帮助将不胜感激。

谢谢!

//var threads = GmailApp.getInboxThreads();
  // Have to get data separate to avoid google app script limit!
  var start = 0;
  var threads = GmailApp.search("is:unread AND label:desc",0,100); 
  var sheet = SpreadsheetApp.getActiveSheet();
  var result = [];

  for (var i = 0; i < threads.length; i++) {
    var messages = threads[i].getMessages();

    var content = messages[0].getPlainBody();
    messages[0].markRead();

    // implement your own parsing rule inside
    if (content) {
      var tmp;
      tmp = content.match(/\b([A-B\d][A-B\d]{4})\b/);
      var cod = (tmp && tmp[1]) ? tmp[1].trim() : 'Error';

      tmp = content.match(/\b(\d+[R])/);
      var prom = (tmp && tmp[1]) ? tmp[1].trim() : 'Error';

      tmp = content.match(/\b(\d{2}\.\d{2}\)\b/);
      var exp = (tmp && tmp[1]) ? tmp[1].trim() : 'Error';

      sheet.appendRow([cod, prom, exp]);

      Utilities.sleep(500);
    }


  }
}

【问题讨论】:

  • 如果您不了解当前脚本的逻辑,则需要重新学习它。例如,您认为您的代码的这个 sn-p 是做什么的? for (var i = 0; i &lt; threads.length; i++) { var messages = threads[i].getMessages();你读过官方文档推导出你使用的变量相关的类型和类吗?
  • 感谢@tehhowch 的回复对不起,我对此非常业余。这个脚本只为我编辑,但第一个代码不是为我创建的。我阅读了官方文档并多次更改了代码,但没有运气正常工作。这是我尝试过但没有运气的其他代码:codepile.net/pile/D2OG702E

标签: multithreading google-apps-script


【解决方案1】:

正如您在documentation 中看到的,资源Users.threads 具有以下结构:

{
  "id": string,
  "snippet": string,
  "historyId": unsigned long,
  "messages": [
    users.messages Resource
  ]
}

注意“messages”属性,它是如何包含一个 list(或数组)的 users.messages.


在您的代码中:

 var messages = threads[i].getMessages();

每次循环完成一个循环时,您将这些列表中的每一个存储在messages 变量中。这就是i 的用途,代表users.messages 数组的每个位置。你可以阅读更多关于循环的信息here


您的代码的问题是您应该执行与 threads 相同的循环,但使用 messages,就像在 Gmail 中一样,每个 thread 可以有多个 messages,正如我在上面的黄色框:)。

 var content = messages[0].getPlainBody();
 messages[0].markRead();

您只获得每个线程的第一条消息的原因是您只访问消息的0 索引位置(在array 中,它是第一个位置)消息。


因此,您需要另一个 for 循环来遍历每个线程的所有消息:

for (var i = 0; i < threads.length; i++) {
    var messages = threads[i].getMessages();

    for (var j = 0; j < messages.length; j++){ //You can't repeat i, so we use j, for example
        var content = messages[j].getPlainBody();
        messages[j].markRead();

        // implement your own parsing rule inside
        if (content) {
        ... etc

另外,记得添加另一个} 以关闭循环之后 Utilities.sleep

希望这会有所帮助!不要犹豫,提出任何其他疑问。

【讨论】:

  • 真棒@Jescanellas !非常感谢!完美的解释,现在完美!我对 javascript 和 google 应用程序脚本非常陌生。我已阅读文档,但无法理解某些内容。
  • 不客气!我建议您查看 Apps 脚本的不同 Quickstarts,因为它们已准备好运行并提供了很好的示例来学习。
猜你喜欢
  • 2016-01-09
  • 2014-05-30
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 2021-10-11
  • 2015-03-12
  • 1970-01-01
  • 2017-06-26
相关资源
最近更新 更多