【问题标题】:Web Gmail shows message as starred even after Apps Script unstars it即使在 Apps 脚本取消星标后,Web Gmail 仍将邮件显示为已加星标
【发布时间】:2018-09-07 12:07:14
【问题描述】:

好的,我认为网络 Gmail 有点搞砸了。我运行了一个 Google 应用程序脚本,该脚本将我的“待办事项”标签部分添加到我手动加星标的任何线程中,然后将其归档并取消星标。下面是一个sn-p。我会很感激任何帮助。

运行脚本后,线程会获得标签并取消星标,但网络 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();
      }
    }
  }
}

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

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);
}

【问题讨论】:

  • 这能持续多久? IE。它是暂时的,并且在 5 分钟内消失了吗?如果您打开一个新的浏览器会话,它会立即消失吗?
  • 它是永久性的。我在个人帐户和 gsuite 帐户中的网络 Gmail 中看到了相同的行为。我实际上必须点击星星才能让它消失。我最近发现了这个问题,但它影响了几个月前的电子邮件
  • 如果你使用GmailApp.unstarMessage(messages[i])会出现这种情况吗?或者如果您在unstar() 之后调用refresh()
  • 我很想知道是否有人可以复制。为电子邮件加注星标。运行上面的代码。在您的收件箱中或查看电子邮件时,星号是否仍显示为选中状态?电子邮件是否显示在已加星标的文件夹中?请告诉我我并不孤单。
  • 我向谷歌报告了这个错误:issuetracker.google.com/77320923

标签: google-apps-script gmail


【解决方案1】:

如果您刷新 gmail 并将鼠标悬停在星标上,您会看到弹出窗口显示它未注视。此外,当您从 gmail 中选择星标时,这似乎是一个问题,因为当我的脚本取消星标时,我的过滤器设置的星标可以正常工作。

【讨论】:

    【解决方案2】:

    此显示问题是由于您在致电 unstar() 后未强制 Gmail 通过致电 refresh() 来更新邮件。

    根据GmailMessage#refresh() 的文档:

    从 Gmail 重新加载此邮件和相关状态(在标签、阅读状态等发生变化的情况下很有用)。

    messages[i].unstar().refresh();
    

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

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

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

    在我的示例中,我避免假设使用for .. in.. 迭代数组是安全的,并使用更具表现力的Array.forEach() 来指示代码是我们想要应用于每个线程和所述线程中的每条消息的东西。

    GmailApp.unstarMessages() 上的文档:

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

    【讨论】:

    • 我在发帖前尝试了GmailApp.unstarMessages()messages[i].unstar().refresh() 没有任何效果。我也试过你的代码。所有 3 个结果相同。嗯。
    【解决方案3】:

    我遇到了类似的问题。我启用了超级明星,即绿色检查。我手动设置它们。

    我的脚本在搜索中使用“l:^ss_cg”找到相关线程。它会找到已加星标的电子邮件,将电子邮件副本发送到某处,然后取消星标。

    之后,在 web gmail 中,如果我再次搜索相同的邮件,它会在视觉上显示一个绿色星标,但如果我将鼠标悬停在星形图标上,它会显示“未加星标”。

    但是,如果我再次运行该脚本,则会使用搜索找到该线程。但是,它不会发送电子邮件的另一份副本,因为在它发送特定电子邮件的副本之前我检查了“.isStarred()”。我还可以通过在线程开始查看单个电子邮件之前向线程添加 .hasStarredEmails() 检查来减少重复检查的线程数。

    在 web 界面中搜索 has:green-check 只会显示它应该显示的电子邮件。

    我认为 .unStar() 有一些东西不能正常工作。

    我曾考虑尝试通过删除 ^ss_cg 标签来删除线程级别的星号,但这不起作用,因为无法获取 GMailLabel 对象以发送到函数。

    【讨论】:

      【解决方案4】:

      Gmail 网络应用显示星号的问题仍然存在。但刚刚有了有趣的发现。

      假设

      var threads = GmailApp.getStarredThreads()
      var thread = threads[0]
      var message = thread.getMessages()[0]
      

      GmailApp.unstarMessage(message) 会立即给出以下结果:

      var isMessageStarred = message.isStarred()
      var isThreadStarred = thread.hasStarredMessages()

      GmailApp.unstarMessage(message).refreshMessage(message) 会立即给出以下结果:
      var isMessageStarred = message.isStarred() false
      var isThreadStarred = thread.hasStarredMessages() true

      GmailApp.unstarMessage(message).refreshMessage(message).refreshThread(thread) 会立即给出以下结果:
      var isMessageStarred = message.isStarred() false
      var isThreadStarred = thread.hasStarredMessages() false

      【讨论】:

      • 使用 Gmail 的基本 HTML 视图也会产生有趣的结果。如果我在 Gmail 的常规视图或 HTML 视图中为邮件加注星标,请通过脚本删除星标,然后在基本 HTML 视图中刷新....该星标不会出现在 Gmail 的常规视图中。但是,如果您先刷新常规视图,则会发生与上述相同的行为,即使您之后刷新 HTML 视图也是如此。 (support.google.com/mail/answer/15049?hl=en)
      猜你喜欢
      • 1970-01-01
      • 2011-07-03
      • 2012-12-09
      • 1970-01-01
      • 1970-01-01
      • 2016-07-26
      • 2022-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多