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

Using Google Apps Script, how do you remove built in Gmail category labels from an email?

我想完全撤消任何内置类别标签的 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: Cannot call method "removeFromThreads" of null.

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

问题...

如何在 Google Apps 脚本中访问内置的 Gmail 类别标签并从 email/thread/threads 中删除它们?

谢谢。

'INBOX' 和 'CATEGORY_SOCIAL' 等其他系统标签可以使用高级 Gmail 服务删除。在脚本编辑器中,转到资源 -> 高级 Google 服务并启用 Gmail 服务。 有关 Gmail 中系统标签命名约定的更多详细信息,请参见此处 Gmail API - Managing Labels

通过调用线程集合的 list() 方法检索标有 'CATEGORY_SOCIAL' 的线程:

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

请注意,您将需要存储 'nextPageToken' 以迭代整个线程集合。参见 。 当你得到所有的线程id后,你可以在它们上面调用Threads集合的'modify()'方法:

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

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

Anton 的回答很棒。我将其标记为已接受,因为它直接指向我正在使用的版本。

此功能可让您定义任何有效的 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...>
}