【发布时间】:2021-01-12 21:45:42
【问题描述】:
在 Gmail 中,我有两个用于接收电子邮件的过滤器:
- 过滤器 1 - 当一封带有特定主题行的电子邮件到达时(我们将其称为“主题 1”),它会将标签应用于电子邮件。
- 过滤器 2 - 当电子邮件到达时带有不同的特定主题(“主题 2”),它会将相同的标签(作为“主题 1”的标签)应用于电子邮件。
所有这些电子邮件的发件人都是同一个发件人。这些电子邮件是订单确认。因此,在“主题 1”电子邮件中(与“主题 2”相同),电子邮件格式相同,只是客户名称不同等。唯一标识符是所有电子邮件中的订单号。
然后我有一个每 x 分钟运行一次的 Google Apps 脚本脚本,查看是否有任何带有该标签的电子邮件。这是脚本的一部分:
var gmailLabelName = "GmailLabelIGaveTheEmails"
var gmailLabelObject = GmailApp.getUserLabelByName(gmailLabelName);
var threads = gmailLabelObject.getThreads();
for (var i = 0; i < threads.length; i++) {
messages = threads[i].getMessages();
for (var j = 0; j < messages.length; j++) {
message = messages[j];
emailText = message.getPlainBody();
--- Process the order ---
问题在于,当您标记收到的电子邮件时,Gmail 还会有效地标记过去(1 天?)中具有相同主题的所有电子邮件。
因此,当您循环浏览消息时(上面的j 循环),您不仅会获得刚刚下达的新订单/刚刚到达的新电子邮件,还会获得所有最近已处理的订单/电子邮件也是如此。
我一直在做的是跟踪哪些订单#s 已经被处理。如果message(变量如上所示)订单#已经被处理,那么我使用“继续”转到下一条消息[j]。
但是,这是非常低效的 - 必须查看每封电子邮件,查看已处理的订单列表,如果尚未处理,则继续处理。
这一切都源于 Gmail 将相同主题行的电子邮件组合成一个线程,因此当您标记新电子邮件时,它因此有效地标记了所有电子邮件。
有谁知道这样做的更好方法,以便只处理全新的订单电子邮件/订单,而不必查看旧的电子邮件/订单并确定它们是否已经被处理?
【问题讨论】:
-
谢谢@OlegValter。我现在正在研究是否可能在收到消息时加注星标,而不是仅使用过滤器应用标签,然后在脚本中使用 isStarred()。
-
是的,这样的事情可能是你现在最好的选择——我自己为客户做了类似的事情——工作得非常可靠。希望我们有一个
onNewMessage触发器,但是唉......
标签: google-apps-script gmail gmail-api