Я использую скрипт для пересылки длинного списка писем (под одной меткой) в новую учетную запись. Тем не менее, я нажимаю на превышенную максимальную ошибку времени выполнения, даже четверть. Мне было интересно, если есть обходной путь, возможно, возможность хранить переменные на листе и возобновить после определенного времени? Я не слишком хорошо разбираюсь в кодировании, поэтому любая помощь в этом будет оценена.
function forwardMail() {
var data = SpreadsheetApp.getActiveSheet().getRange("A2:B11").getValues();
for (i in data) {
var row = data[i];
var name = row[0].toString();
var email = row[1].toString();
var label = GmailApp.getUserLabelByName(name);
if (label && (email != "")) {
var threads = label.getThreads();
for (var x in threads) {
var messages = threads[x].getMessages();
for (var y in messages) {
var subject = messages[y].getSubject();
messages[y].forward(email, {
subject: subject});
}
threads[x].removeLabel(label);
}
}
}
}
Этот скрипт должен обрабатывать одну строку в вашей электронной таблице во время выполнения. При следующем выполнении он будет запускать следующую строку и так далее. Он все еще может использовать какую-то работу, но это хорошее начало и, надеюсь, передает идею, которую я имею для того, чтобы обойти максимальное время выполнения.
Идея здесь заключается в том, что вы устанавливаете значение в столбце C, чтобы указать, что запись уже обработана. Когда сценарий запускается снова, он затем продолжается со следующей записи. Все еще нуждается в некоторой функциональности, чтобы остановить его от попыток запуска пустых строк. Но я уверен, что вы сможете это сделать.
После того, как вы устраните эти мелкие проблемы, вы можете поместить это на триггер, чтобы запускать каждые 1 или 5 минут. (В зависимости от продолжительности времени выполнения.)
Вот как я избил время исполнения в прошлом. Как всегда, надеюсь, что это поможет.
function forwardMail() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var rowsToProcess = sheet.getRange("C2:C").getValues();
var rowCounter = rowsToProcess.filter(String).length +1;
for (var index = rowCounter; index = rowCounter +1; index++){
var data = sheet.getRange(index, 1, 1, 2).getValues();
var name = data[0].toString();
var email = data[1].toString();
var label = GmailApp.getUserLabelByName(name);
if (label && (email != "")) {
var threads = label.getThreads();
for (var x in threads) {
var messages = threads[x].getMessages();
for (var y in messages) {
var subject = messages[y].getSubject();
messages[y].forward(email, {subject: subject});
} //End of Y for loop
threads[x].removeLabel(label);
} //End of X for loop
} //End of IF statement
} //End of INDEX for loop
sheet.getRange(index, 3, 1, 1).setValue("Mails Processed");
} //End of Function
messages[y].forward
не асинхронны! Кроме того, это немного сложно, хотя сthreads[x].removeLabel(label);
после циклаy in
... Я думаю, что этот pastebin - очень асинхронное решение, которое все еще вызываетmessage.forward
в последовательности