Как получить тело отдельных электронных писем на основе метки из Gmail на листы Google - PullRequest
1 голос
/ 20 июня 2019

Каждый день я получаю 0-20 писем, которые выглядят примерно так:

Имя: Имя Фамилия

Номер телефона: 555-867-5309

Адрес электронной почты: Fake@email.com

Местоположение: NameOfPreferedBranch

Запрос: ThingPersonWants

Я пытаюсь отправить основную часть этих писем на разные листы Google в зависимости от указанного местоположения. Поэтому, если человек, заполняющий форму, говорит, что Location1 работает для них, я бы хотел, чтобы тело сообщения было отправлено на лист Location1. Если человек говорит Location2, то тело сообщения должно перейти на лист location2 и так далее. Каждый раз, когда приходит одно из этих писем, я заставляю Gmail накладывать разные ярлыки в зависимости от местоположения. В идеале я хотел бы настроить триггер, который запускается каждые 15 минут и не дублирует результаты, которые уже были выполнены в процессе.

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

    function myFunction() {

      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.getSheetByName('NameOfSheet');

      var label = GmailApp.getUserLabelByName("MyLabel");
      var threads = label.getThreads();

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

        for (var j=0; j<messages.length; j++)
        {
          if (messages[j].isUnread())
              {
                var msg = messages[j].getBody();      
                sheet.appendRow([msg]);
                messages[j].markRead();
              }
        }
          threads[i].removeLabel(label);
      }
    }

Я надеялся, что сочетание получит темы по метке и

    if (messages[j].isUnread())
Секция

получит только те сообщения, которые имеют метку и еще не прочитаны, но все равно возвращают все сообщения во всей цепочке. Кроме того, он помечает все сообщения в потоке как прочитанные, что означает, что если Location1 и Location2 оба имеют сообщение в потоке, когда скрипт выполняется для листа Location1, он помечает все сообщения как прочитанные, а когда скрипт выполняется для листа Location2, он ничего не тянет, потому что все сообщения уже помечены как прочитанные.

Как сейчас, наверное, очевидно, я действительно новичок в скриптах Google Apps и кодировании в целом. Если бы вы могли использовать короткие слова и мучительно подробные объяснения в своих ответах, это бы очень помогло.

Спасибо.

Редактировать: я пытался использовать GmailApp.search(), но все еще получаю те же результаты. Он извлекает тело из каждого письма в ветке и помечает их как непрочитанные. Вот как выглядит код в данный момент:

function myFunction() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('NameOfSheet');

  var label = GmailApp.getUserLabelByName("Location1Label");
  var threads = GmailApp.search('label:"Location1Label" is:Unread');

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

    for (var j=0; j<messages.length; j++)
    {
      if (messages[j].isUnread())
          {
            var msg = messages[j].getBody();      
            sheet.appendRow([msg]);
            messages[j].markRead();
          }
    }
      threads[i].removeLabel(Location1Label);
  }
}

1 Ответ

0 голосов
/ 21 июня 2019

Требование:

Найти все электронные письма внутри ярлыка, которые непрочитаны и добавить на лист.


Решение:

Использовать запрос, переданный GmailApp.search()чтобы найти все непрочитанные сообщения внутри метки.

Вот скрипт:

function myFunction() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('NameOfSheet');

  var label = GmailApp.getUserLabelByName("Location1Label");
  var threads = GmailApp.search('label:"Location1Label" is:Unread');

  for (var i=0; i<threads.length; i++) 
  {
    var messages = GmailApp.getMessagesForThread(threads[i]);
    for (var j=0; j<messages.length; j++) 
    {
      if (messages[j].isUnread())
      {
        var msg = messages[j].getBody();      
        sheet.appendRow([msg]);
        messages[j].markRead();
      }
    }
    threads[i].removeLabel(label);
  }
}

Объяснение:

Теперь мы используем GmailApp.search() длянайти все электронные письма, затем пройти цикл через массив результатов и передать каждый объект в GmailApp.getMessagesForThread().

Остальная часть кода не изменилась, за исключением вашего removeLabel(), так как он не смотрел на переменную, определенную вами ранее в скрипте.


Ссылки:

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