【发布时间】:2018-10-21 08:41:59
【问题描述】:
我的目标是:
- 收到一封符合放置在标签 A 文件夹中的条件的电子邮件。
- 收到一封新电子邮件。
- 这封新电子邮件的正文与收到的第一封电子邮件相同。
- 这封新电子邮件会跳过收件箱并转到标签 B 文件夹。
这是我的实现方式:
- 所有新电子邮件都标记为“原始”
- 脚本运行时,会将电子邮件正文与之前的所有正文进行比较。
- 如果正文是重复的,则将其标记为“重复”,移至“存档”,并删除“原始”标签。
代码如下:
function emailLabeling() {
var DUPLICATE = _getLabel();
var labels = GmailApp.getUserLabelByName("Original");
if(labels != null){
var threads = labels.getThreads();
for (var i = 0; i < threads.length; i++){
var messages = threads[i].getMessages();
for (var j = 0; j < messages.length; j++){
var message = messages[j];
for (var k = i; k < threads.length; k++){
var messages_check = threads[k].getMessages();
for (var l = j; l < messages_check.length; l++){
var message_check = messages_check[l];
if(message_check.getPlainBody() == message.getPlainBody()){
if(i != k || j != l){
Logger.log(i +""+ j +""+ k +""+ l);
DUPLICATE.addToThread(threads[i]);
labels.removeFromThread(threads[i]);
GmailApp.moveThreadToArchive(threads[i]);
}
}
}
}
}
}
}
else{
Logger.log("Label Not Found!");
}
}
function _getLabel() {
var label_text = "Duplicates";
var label = GmailApp.getUserLabelByName(label_text);
if (label == null) {
var label = GmailApp.createLabel(label_text);
}
return label;
}
代码运行良好。问题在于 4 个嵌套循环,随着“原始”电子邮件数量的增加,运行时间呈指数增长。
有没有办法优化这段代码? 是否有更聪明的逻辑来实现这个想法?
任何帮助将不胜感激。
【问题讨论】:
-
请注意,即使在您开始查看新线程后,您仍会在该线程中的
jth 消息之后继续启动 message_checks,而不是 0。这意味着您正在跳过电子邮件检查。此外,当你发现一个重复的身体时,你会做什么并不很清楚 - 我会保留早期的线程 -i- 在标签中并将后面的线程 -k- 移动到"duplicate"标签(您必须以某种方式检查标签是否仍然存在于非零i)。 -
你是对的,它应该从 0 开始。目的是移动最新的线程。我猜这段代码有问题。 :|
标签: for-loop google-apps-script gmail-api