使用Google Apps脚本,如何从电子邮件中删除内置的Gmail类别标签?

时间:2019-12-09 21:03:41

标签: google-apps-script gmail typeerror

我想完全撤消任何类别标签中内置的Gmail。这是我的尝试。

function removeBuiltInLabels() {
  var updatesLabel = GmailApp.getUserLabelByName("updates");
  var socialLabel = GmailApp.getUserLabelByName("social");
  var forumsLabel = GmailApp.getUserLabelByName("forums");
  var promotionsLabel = GmailApp.getUserLabelByName("promotions");

  var inboxThreads = GmailApp.search('in:inbox');
  for (var i = 0; i < inboxThreads.length; i++) {
    updatesLabel.removeFromThreads(inboxThreads[i]);
    socialLabel.removeFromThreads(inboxThreads[i]);
    forumsLabel.removeFromThreads(inboxThreads[i]);
    promotionsLabel.removeFromThreads(inboxThreads[i]);
  }

}

但是,这会抛出。...

  

TypeError:无法调用null的方法“ removeFromThreads”。

即使您可以在Gmail搜索框中成功搜索label:updates并获得正确的结果,似乎也无法以这种方式访问​​内置标签。

问题...

如何访问Google Apps脚本中的内置Gmail类别标签并将其从电子邮件/线程/线程中删除?

谢谢。

2 个答案:

答案 0 :(得分:3)

“ INBOX”和其他系统标签(例如“ CATEGORY_SOCIAL”)可以使用高级Gmail服务删除。在脚本编辑器中,转到资源->高级Google服务,然后启用Gmail服务。 可以在Gmail API - Managing Labels

中找到有关Gmail中系统标签命名约定的更多详细信息。

通过调用线程集合的list()方法来检索标记为“ CATEGORY_SOCIAL”的线程:

 var threads = Gmail.Users.Threads.list("me", {labels: ["CATEGORY_SOCIAL"]});
 var threads = threads.threads;
 var nextPageToken  = threads.nextPageToken;

请注意,您将需要存储“ nextPageToken”以遍历整个线程集合。参见this answer。 当获得所有线程ID时,可以对其调用Threads集合的'modify()'方法:

 threads.forEach(function(thread){
         var resource = {
        "addLabelIds": [],
        "removeLabelIds":["CATEGORY_SOCIAL"]
      };
      Gmail.Users.Threads.modify(resource, "me", threadId);
});

如果收件箱中有很多线程,则可能仍需要多次调用'modify()'方法并保存两次调用之间的状态。

答案 1 :(得分:0)

安东的答案很好。我将其标记为已接受,因为它会直接导致我使用的版本。

此功能可让您定义任何有效的gmail搜索以隔离邮件并启用批量删除标签。

function removeLabelsFromMessages(query, labelsToRemove) {
  var foundThreads = Gmail.Users.Threads.list('me', {'q': query}).threads
  if (foundThreads) {
    foundThreads.forEach(function (thread) {
      Gmail.Users.Threads.modify({removeLabelIds: labelsToRemove}, 'me', thread.id);
    });
  }
}

我通过这样的一分钟脚本触发器来调用它。

function ProcessInbox() {
  removeLabelsFromMessages(
    'label:updates OR label:social OR label:forums OR label:promotions',
    ['CATEGORY_UPDATES', 'CATEGORY_SOCIAL', 'CATEGORY_FORUMS', 'CATEGORY_PROMOTIONS']
  )

  <...other_stuff_to_process...>
}