Я использую сценарий для пересылки длинного списка писем (под одним ярлыком) в новую учетную запись. Однако я сталкиваюсь с ошибкой превышения максимального времени выполнения даже не на четверть. Мне было интересно, есть ли обходной путь, может быть, есть возможность сохранить переменные на листе и возобновить работу через заданное время? Я не слишком хорошо разбираюсь в кодировании, поэтому любая помощь будет принята с благодарностью.
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);
}
}
}
}
Имейте в виду, что также существует квота на количество писем, которые вы можете отправлять.
Возможный дубликат Превышено максимальное время выполнения в скрипте Google Apps
Если вы обрабатываете строки из электронной таблицы, то можно установить флаг, указывающий, что строка заполнена. Затем вы можете обработать заданное количество записей, а затем продолжить с последнего флага. Опубликуйте сценарий ниже в ответе, чтобы вы могли его посмотреть.
Возможный дубликат Класс скриптов Google Apps Пакетные операции GmailApp?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Этот сценарий должен обрабатывать одну строку в вашей электронной таблице во время выполнения. При следующем выполнении будет запущена следующая строка и так далее. Он все еще может потребовать некоторой работы, но это хорошее место для начала и, надеюсь, передает мою идею обойти максимальное время выполнения.
Идея заключается в том, что вы устанавливаете значение в столбце 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... Я думаю, что этот пастебин - очень асинхронное решение, которое по-прежнему вызываетmessage.forwardпоследовательно