【问题标题】:Using Google Apps Script, how do you remove built in Gmail category labels from an email?使用 Google Apps 脚本,您如何从电子邮件中删除内置的 Gmail 类别标签?
【发布时间】:2019-12-09 21:03:41
【问题描述】:

我想完全撤消任何内置类别标签的 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 类别标签并将它们从电子邮件/线程/线程中删除?

谢谢。

【问题讨论】:

    标签: google-apps-script gmail typeerror


    【解决方案1】:

    可以使用高级 Gmail 服务删除“收件箱”和“CATEGORY_SOCIAL”等其他系统标签。在脚本编辑器中,转到资源 -> 高级 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”以遍历整个线程集合。见this answer。 当你得到所有线程 id 后,你可以在它们上调用 Threads 集合的 'modify()' 方法:

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

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

    【讨论】:

    • 我想知道是否可以使用线程执行类似的过程,这可能需要更少的时间。
    • @Cooper 您可以调用 var threads = GmailApp.search("in: social") 并检索所有邮件 ID
    • @Cooper 好点。我忽略了 Gmail API 也有线程类的事实
    • 谢谢!直接引到我下面的版本。 ?
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-08
      • 2020-12-28
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 2017-07-27
      • 2013-04-06
      • 2012-07-25
      相关资源
      最近更新 更多