即使 Apps 脚本取消星标,Web Gmail 也会将邮件显示为加星标

wea*_*ker 6 gmail google-apps-script

好吧,我认为网络版 Gmail 很奇怪。我运行一个 Google 应用程序脚本,该脚本部分将我的“待办事项”标签添加到我手动加星标的任何线程中,然后对其进行存档和取消加星标。下面是一个片段。我将不胜感激任何帮助。

运行脚本后,线程获得标签并取消加星标,但网页版 Gmail 中线程/消息旁边的星号图标仍显示为选中状态。如果我转到加星标的消息标签/文件夹,则不会显示任何内容。如果我立即重新运行脚本,它不会找到任何加星标的线程。这似乎表明脚本运行正常。问题似乎是网络 Gmail 仍然希望将其显示为已加星标,尽管事实并非如此。Gmail Android 应用程序不显示应用于线程的星标。图片更值钱...

脚本运行后我的收件箱是什么样子。注意星星: 脚本运行后的样子

但还没有加星标的消息: 还没有加星标的消息

function addStarred2ToDo() {
  var threads = GmailApp.search('is:starred');
  for (var h in threads) {
    var messages = threads[h].getMessages();
    for (var i in messages) {
      if (messages[i].isStarred()) {
        messages[i].unstar();
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

编辑:我也尝试过这个,但都没有产生预期的结果。

function thisOne() {
  var threads = GmailApp.search('is:starred');
  for (var h in threads) {
    var messages = threads[h].getMessages();
    for (var i in messages) {
      if (messages[i].isStarred()) {
        messages[i].unstar().refresh();
      }
    }
  }
}

function andThisOne() {
  var threads = GmailApp.search('is:starred');
  var toUnstar = [];
  threads.forEach(function (thread) {
    thread.getMessages().forEach(function (message) {
      if (message.isStarred()) {
        toUnstar.push(message);
      }
    });
  });
  GmailApp.unstarMessages(toUnstar);
}
Run Code Online (Sandbox Code Playgroud)

teh*_*wch 0

refresh()导致此显示问题的原因是您在调用 后没有强制 Gmail 通过调用 来更新邮件unstar()

根据文档GmailMessage#refresh()

从 Gmail 重新加载此邮件和关联状态(在标签、阅读状态等发生更改时很有用)。

messages[i].unstar().refresh();
Run Code Online (Sandbox Code Playgroud)

应足以通知 Gmail 新的加星标状态。

或者,批量调用来修改消息在配额使用方面会更有效:

var toUnstar = [];
threads.forEach(function (thread) {
  thread.getMessages().forEach(function (message) {
    if (message.isStarred()) {
      toUnstar.push(message);
      ...
    }
  });
});
GmailApp.unstarMessages(toUnstar);
Run Code Online (Sandbox Code Playgroud)

在我的示例中,我避免了这样的假设:使用for .. in..迭代数组是安全的,并使用更具表现力的内容Array.forEach()来表明我们希望将代码应用于每个线程以及该线程中的每个消息。

GmailApp.unstarMessages关于()的文档:

从这些消息中删除星星并强制刷新消息。