【问题标题】:How to get the body of individual emails based on a label from gmail to google sheets如何根据从 gmail 到 google 表格的标签获取单个电子邮件的正文
【发布时间】:2019-11-03 16:47:21
【问题描述】:

每天我都会收到 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);
  }
}

【问题讨论】:

  • 您是否尝试过上一个问题中使用GmailApp.search() 的建议?
  • 我试过了。我会在参数列表之后收到一条错误消息,上面写着“缺少)”,当我添加一个时它会说同样的事情,或者如果我让它运行它似乎没有做任何事情。显然我做错了什么,但我无法追踪它是什么......主要是因为当我通过搜索找到答案时,我无法理解他们在解释什么,因为我知道的不够多。
  • 能否将GmailApp.search() 的示例添加到您的问题中,以便我们解决问题?
  • 我认为可以让我到达那里的版本是var messages = GmailApp.search('label:"Location1Label" &amp;&amp; is:Unread');,但是当我运行时似乎什么也没发生。如果我省略了'',我会在参数列表后收到错误消息“Missing )”
  • 您的问题是因为您在搜索字符串中使用了 &&。您应该像在 Gmail 顶部的搜索栏中那样构建它。 var messages = GmailApp.search('label:"Location1Label" is:unread');

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


【解决方案1】:

要求:

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


解决办法:

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

【讨论】:

  • 我想我明白你在做什么,我怀疑我没有充分解释我的意图。我不想在标签内找到所有未读并添加到工作表的电子邮件。我正在尝试查找所有具有特定标签的电子邮件并将它们添加到工作表中,然后使用它们的已读或未读状态来确保当程序再次运行时它不会返回已添加到的结果床单。您的解决方案从包含相关标签的任何线程返回所有未读电子邮件,但我只想要带有标签的电子邮件。我希望这是有道理的。
  • 是的 - 不太确定我是否理解您的要求。您的意思是您只想返回应用了标签的单个电子邮件,而不是整个电子邮件线程?
  • 是的。因此,如果我有 5 封新电子邮件,其中两封被标记为“Location1Label”,另外两封被标记为“Location2Label”,最后一封被标记为“Location3Label”并且它们都在同一个线程中,我希望程序只获取标记的电子邮件正文Location1 并且仅将带有 Location1 标签的电子邮件标记为已读,以便我稍后可以为 Location2 运行类似的程序并在另一张表中从该位置获取电子邮件。
  • 我不确定我是否理解 - 你不能给线程内的单个消息自己的标签 - 标签应用于整个线程本身,因此为什么没有 getLabel() 方法 @ 987654323@。你能通过给线程中的每封电子邮件一个不同的标签来说明你的意思吗?
  • Picture of the part of the Inbox I'm working with 也许我正在尝试以一种它们不起作用的方式使用标签。是否可以根据电子邮件的内容将电子邮件正文放入工作表中?
猜你喜欢
  • 1970-01-01
  • 2021-08-14
  • 2018-11-03
  • 2018-11-02
  • 2019-06-04
  • 2021-07-04
  • 2023-03-09
  • 2023-03-04
  • 1970-01-01
相关资源
最近更新 更多