Скрипт Gmail извлекает только из первого письма каждой темы. Нужно вернуть данные из каждого сообщения - PullRequest
0 голосов
/ 20 января 2020

Я пытаюсь разобрать извлечение данных из сообщений электронной почты с помощью сценария, использующего регулярные выражения. Остальные основные функции скрипта работают, но есть одна довольно большая проблема.

Скрипт возвращает данные только из первого сообщения каждого потока. Я хотел бы, чтобы он возвращал данные из каждого сообщения в каждой ветке, я поиграл с этим, но пока безуспешно.

Любая помощь будет принята с благодарностью.

Спасибо!

//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);
    }


  }
}

1 Ответ

0 голосов
/ 20 января 2020

Как вы можете прочитать в документации , ресурс Users.threads имеет следующую структуру:

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

Обратите внимание на свойство messages, как оно содержит список (или массив) из users.messages.


В вашем коде:

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

Вы сохраняете каждый из этих списков в messages переменная каждый раз, когда l oop завершает цикл. Вот для чего i представляет каждую позицию массива users.messages. Вы можете прочитать больше о циклах здесь .


Проблема с вашим кодом заключается в том, что вы должны делать то же самое l oop, что вы делали с threads, но с messages, как в Gmail, каждый thread может иметь несколько messages, как я сказал в желтом поле выше :).

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

Причина, по которой вы получаете только первое сообщение от каждого потока, заключается в том, что вы получаете доступ только к индексной позиции 0 (которая в массиве , это первая позиция) messages.


Следовательно, вам нужно еще for l oop для перебора всех сообщений каждого потока:

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

Кроме того, не забудьте добавить еще один } чтобы закрыть l oop после Utilities.sleep

Надеюсь, это поможет! Не стесняйтесь задавать любые другие сомнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...