【问题标题】:Inconsistencies between app scripts GmailApp.search and the search in gmail interface应用脚本 GmailApp.search 和 gmail 界面中的搜索不一致
【发布时间】:2015-07-07 06:17:35
【问题描述】:

我正在尝试构建一个谷歌应用脚​​本,以将从在线表单收到的邮件导入电子表格。

我正在使用两个标签:一个“to_process”是由 gmail 过滤器添加的,另一个“已处理”是在电子邮件添加到工作表后由该脚本添加的。
我正在使用搜索查询 'label:to_process !label:processed in:all' 搜索所有具有“to_process”但未“处理”的电子邮件

我让它部分工作(请参阅下面的脚本核心)
我正在使用脚本编辑器运行功能运行脚本。

问题是在 gmail 界面中使用相同的查询我收到了 100 多封电子邮件,但在脚本的日志中我收到了 6 封电子邮件,并且它们都被处理了。 我错过了什么吗?

function extractInfo() {
  var step = 30;
  var max = 500;
  var currentStep = 0;
  while(max--) {
    var threads = GmailApp.search('label:to_process !label:processed in:all', currentStep++ * step, step);
    if(threads.length == 0) break;
    Logger.log("-------- found threads: " + threads.length);
    var threadId = threads.length;

    while(threadId--) {
      var thread = threads[threadId];
      thread.refresh();
      if(hasLabel(thread, "processed")) {
        Logger.log("was processed: " + thread.getPermalink())
        continue;
      }
      if(!hasLabel(thread, "to_process")) {
        Logger.log("isn't mark to process: " + thread.getPermalink())
        continue;
      }
      var messages = thread.getMessages(); 
      var messageId = messages.length;
      while(messageId--) {
        var message = messages[messageId];
        var row = extractMessageData(message);
        sheet.appendRow(row);
        GmailApp.markMessageRead(message);
      }
      threads[threadId].addLabel(processedLabel);
    }
  }
}

function hasLabel(thread, name) {
  var labels = thread.getLabels();
  var l = labels.length;
  while(l--) {
    if(labels[l].getName() == name) {
      return true;
    }
  }
  return false;
}

【问题讨论】:

    标签: google-apps-script gmail


    【解决方案1】:

    经过多次尝试和错误,我部分想通了。

    我在 gmail ui 中看到的实际上是消息,而不是线程。但是处理标签是每个线程的事情。 我只是从给定标签中提取所有线程的所有消息,然后处理这些论文。

    如果一个线程具有“已处理”标签,这并不意味着它的所有消息都已处理,这是一个问题。

    我在 UI 中看到的消息数量和我使用 API 得到的信息仍然不一致。

    【讨论】:

    • UI 还显示线程,当您打开线程时,您可以看到消息。使用搜索功能,我能够获得与 UI 相同数量的线程。您看到的差异是什么?
    • 我尝试了很多变化。问题中描述的那个记录了紧随其后的线程数(我得到了 8 个)。如果我在 UI 中输入相同的搜索,然后单击复选框以选择所有消息(包括其他页面),我会得到一个更大的数字(大约 200 条)。但是如果我把我得到的所有线程对象(8 个线程)聚合在一起,我得到大约 300 个。
    • 在查询中仅使用“label:to_process”时,是否仍然得到不一致的线程数?
    • 是的,搜索在 ui 和脚本中返回的项目数量不同
    • 另一种方法(只是为了检查为什么你得到不同数量的线程)你可以获取标签并从该标签获取线程:GmailApp.getUserLabels()['index of to_process label']。 getThreads().length 试试这个,看看你是否仍然得到不同数量的线程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多