【问题标题】:Read all message in Gmail Label with Google App Script使用 Google App Script 阅读 Gmail 标签中的所有邮件
【发布时间】:2020-01-15 12:49:43
【问题描述】:

我是 Google App Script 的业余爱好者。

拯救了这个对我有用但不正确的脚本。 现在只为线程的第一条消息而不是所有消息读取和 phsarse 信息。

我需要阅读、检查和表达标签的所有消息,而不仅仅是线程的第一个。 我需要脚本读取并解析所有单独的消息 位于标签上。 然后将所有内容标记为已读。

有人可以帮助我并更改代码来执行此操作吗? 我查看了 Google APP 脚本手册,我尝试了不同的方法,但我无法让它工作。

谢谢!

  //var threads = GmailApp.getInboxThreads();
  // Have to get data separate to avoid google app script limit!
  var start = 0;
  var threads = GmailApp.search("newer_than:1d AND is:unread AND label:eur OR 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);
    }


  }
}; ```

【问题讨论】:

    标签: google-apps-script


    【解决方案1】:

    为了将消息标记为已读,您必须迭代每个线程的消息。

    你只得到线程的第一条消息,所以你必须替换

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

    到这样的事情:

    function readMails (){
    
      var threads = GmailApp.search("newer_than:1d AND is:unread AND label:eur OR label:desc",0,100);
    
      //Iterate threads
      for (var i=0; i < threads.length; i++){
    
        var messages = threads[i].getMessages();
    
        //Iterate messages of each thread
        for (var k=0; k < messages.length; k++){
          var content = messages[k].getPlainBody();
          messages[k].markRead();
    
          .....
        }
      }
    }
    

    【讨论】:

    • 谢谢胡安!我试图在代码中实现它,但不是在谷歌表中它没有显示任何结果。这就是我将它插入主代码的方式。有什么问题吗? codepile.net/pile/D2OG702E
    【解决方案2】:

    由于您已经有了一个线程列表,您可以使用markThreadsRead 方法一次性将它们标记为已读。

    var threads = GmailApp.search("newer_than:1d AND is:unread AND label:eur OR label:desc",0,100); 
    GmailApp.markThreadsRead(threads);
    

    或者,您可以在线程中处理单个消息,如下所示:

    var messages = threads[i].getMessages();
    messages.forEach(function(message) {
      message.markRead();
      // processs the message here and save to sheets
    })
    

    【讨论】:

    • 谢谢阿米特。不太明白我需要在哪里放置您的“替代代码来处理单个消息。您可以向我发送一个链接,其中包含集成在主代码中的完整代码?谢谢。我已经尝试如下,但它对我不起作用。将所有消息标记为已读,但仅将短语信息标记为循环中的一个:codepile.net/pile/lQDZy73z
    猜你喜欢
    • 2015-12-10
    • 1970-01-01
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 2019-05-24
    相关资源
    最近更新 更多