【问题标题】:Script to label emails if it contains specific words in the subject or body on Gmail如果电子邮件在 Gmail 的主题或正文中包含特定字词,则使用脚本标记电子邮件
【发布时间】:2021-01-10 16:19:19
【问题描述】:

更新: 非常感谢 endothermic_dragon!你真聪明!现在一切正常。

我以前创建过脚本,但从未为 Gmail 创建过脚本。我很难创建一个脚本来过滤传入的电子邮件,如果它们有特定的单词,则对其进行标记和归档。我们每天会收到大约 100 封来自与一组公司相关的不同发件人的电子邮件。每个公司都有自己的标签。通常公司名称在电子邮件的主题或正文中。我正在尝试构建一个获取每封电子邮件的脚本,检查带有主题的数组或带有plainBody的数组是否包含来自getUserLabels的标签数组中的一个或多个标签的名称(每个标签都是公司的名称)( ),如果是,则为其分配相应的标签。我已经尝试了一切,从 filter() 到 forEach() 到 indexOf() 但似乎没有任何效果。我觉得 getUserLabels() 和 getInoboxThreads() 的数组是 2D 的,我正在努力使用它们。我已经多次重写代码,但它让我无处可去。我真的希望你们中的某个人能对此有所了解。

示例: 假设我们与 Apple、Amazon 和 Netflix 合作。这些公司中的每一个都有自己的标签。 如果收到一封电子邮件并在主题或正文中包含“Apple”,则为其添加标签“Apple”并将其存档。如果主题或正文中有“Amazon”和“Netflix”,则添加标签 Amazon 和 Netflix。

最终代码:

function labelEmails() {
  var labels=[]
  GmailApp.getUserLabels().forEach(function(label){labels.push(label.getName())})
  var threads = GmailApp.search('is:unread').forEach(function(email){
    email.getMessages().forEach(function(thread){
      //Filter - https://developers.google.com/apps-script/reference/gmail/gmail-message
      //Example used - if body contains 'hi', mark as read.
      labels.forEach(function(label){
        if (thread.getBody().toLowerCase().includes(label.toLowerCase())){
          labelToAssign = GmailApp.getUserLabelByName(label);
          labelToAssign.addToThread(email)
        } else if (thread.getSubject().toLowerCase().includes(label.toLowerCase())) { 
           labelToAssign = GmailApp.getUserLabelByName(label);
          labelToAssign.addToThread(email)
          } 
      })
    })
    });
}

我们的一些标签是公司名称的缩写,所以我还需要一个函数来处理这些。您也可以在下面查看: (代码中的公司是随机公司,不是真实的)

function labelExceptions() {
  var exceptions = [{exc:'apple', labeln: 'APPL'}, {exc: 'amazon', labeln: 'AMZ'}, {exc: 'Bank of America', labeln: 'BOFA'}]
  var threads = GmailApp.search('is:unread').forEach(function (thread){
    thread.getMessages().forEach(function(message){
      exceptions.forEach(function(exception){
        if (message.getBody().toLowerCase().includes(exception.exc)){
          labeltoAssign = GmailApp.getUserLabelByName(exception.labeln);
          labeltoAssign.addToThread(thread)
        } else if (message.getSubject().toLowerCase().includes(exception.exc)){
          labeltoAssign = GmailApp.getUserLabelByName(exception.labeln);
          labeltoAssign.addToThread(thread)
        }
      
      })
    
    })}
 );
  } 

非常感谢!

【问题讨论】:

  • 您能分享您当前的代码吗?这样帮助你会更容易。
  • @Endothermic_Dragon 我一遍又一遍地编写我的代码,但我觉得我走错了方向。我没有分享它,因为我认为它会让你对我的目标感到困惑。
  • 当您使用诸如获取收件箱线程之类的方法时,您不必怀疑返回的对象类型,只需查看它告诉您返回什么的文档即可。您可以转到该课程页面并查看所有方法并使用它们来获取您想要的信息,这并不复杂。

标签: javascript arrays google-apps-script gmail


【解决方案1】:

用我的 gmail 检查过,可以!

function myFunction() {
  var labels=[]
  GmailApp.getUserLabels().forEach(function(label){labels.push(label.getName())})
  var threads = GmailApp.search('is:unread').forEach(function(email){
    email.getMessages().forEach(function(thread){
      //Filter - https://developers.google.com/apps-script/reference/gmail/gmail-message
      //Example used - if body contains 'hi', mark as read.
      labels.forEach(function(label){
        if (thread.getBody().toLowerCase().includes(label.toLowerCase())){
          email.markRead()
        }
      })
    })
    });
}

【讨论】:

  • 嗨@Endothemic_Dragon,你的建议非常有效。我只是想让代码与所有标签进行比较。由于某种原因,它不起作用。你介意看看吗?代码已在我的问题中更新。
  • 它运行但什么也不做。
  • 更新 - 已编辑以使比较不区分大小写。
  • @VictorFirmino 你应该考虑接受答案然后
  • @Tibebes M 谢谢你让我知道。我是新来的,对此一无所知。
猜你喜欢
  • 2021-09-27
  • 1970-01-01
  • 2013-02-21
  • 2018-02-17
  • 2010-11-20
  • 2021-10-04
  • 2016-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多