如何根据从gmail到Google表格的标签获取单个电子邮件的正文

时间:2019-06-20 20:06:49

标签: google-apps-script google-sheets gmail

每天我都会收到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的工作表中运行,则当Location1和Location2在线程中都有消息时,它将所有消息都标记为已读,而脚本在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 :(得分:0)

要求:

在标签内查找所有未读的电子邮件并将其添加到工作表中。


解决方案:

使用传递给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()