Один из способов повышения производительности в ситуациях с вложенными циклами, особенно с дублированием идентификации, заключается в сохранении записи пройденного контента, а не в многократном сравнении.Например, вы можете хэш тело сообщения (с учетом правильной хэш-функции) и сохранять хеши как свойства объекта.Обратите внимание, что формального ограничения на длину свойства объекта не существует, поэтому вы можете пропустить его хеширование самостоятельно (для получения свойства фиксированной длины) и просто позволить Google Apps Script сделать это за вас.Естественно, целесообразно проверить, насколько большим может быть сообщение, прежде чем использовать такое предположение в процессе производства.
function updateEmailLabels() {
// Use an Object to associate a message's plaintext body with the
// associated thread/message IDs (or other data as desired).
var seenBodies = {}, // When a message is read, its plaintext body is stored.
DUPLICATE = _getLabel("SO_Duplicates"),
ORIGINAL = _getLabel("SO_Original");
// getThreads() returns newest first. Start with the oldest by reversing it.
ORIGINAL.getThreads().reverse().forEach(function (thread) {
thread.getMessages().forEach(function (message, messageIndex) {
// Use this message's body for fast lookups.
// Assumption: Apps Script has no reachable limit on Object property length.
var body = message.getPlainBody();
// Compare this message to all previously seen messages:
if (!seenBodies[body]) {
seenBodies[body] = {
count: 1,
msgIndices: [ messageIndex ],
threads: [ thread ],
threadIds: [ thread.getId() ]
};
} else {
// This exact message body has been observed previously.
// Update information about where the body has been seen (or perform
// more intricate checks, i.e. compare threadIds and message indices,
// before treating this thread and message as a duplicate).
seenBodies[body].count += 1;
seenBodies[body].msgIndices.push(messageIndex);
seenBodies[body].threads.push(thread);
seenBodies[body].threadIds.push(thread.getId());
}
}); // End for-each-message.
}); // End for-each-thread.
// All messages in all threads have now been read and checked against each other.
// Determine the unique threads to be modified.
var threadsToChange = {};
for (var body in seenBodies) {
if (seenBodies[body].count === 1)
continue;
var data = seenBodies[body];
for (var threadIndex = 1; threadIndex < data.threads.length; ++threadIndex)
threadsToChange[data.threadIds[threadIndex]] = data.threads[threadIndex];
}
// Update their labels and archive status.
for (var id in threadsToChange) {
var thread = threadsToChange[id];
DUPLICATE.addToThread(thread);
ORIGINAL.removeFromThread(thread);
GmailApp.moveThreadToArchive(thread);
}
}
function _getLabel(labelText) {
var label = GmailApp.getUserLabelByName(labelText);
return label ? label : GmailApp.createLabel(labelText);
}
Вы определенно захотите настроить биты обнаружения дубликатов, поскольку у меня точно нет квалификацииэлектронные письма просто лежат вокруг;) Я подозреваю, что написанное мной классифицирует поток как дубликат, если хотя бы 2 сообщения совпадают, даже если этот поток является единственным потоком с этим конкретным телом сообщения.