Превышено максимальное время выполнения (Google Sheet Script)

1

Я использую скрипт для пересылки длинного списка писем (под одной меткой) в новую учетную запись. Тем не менее, я нажимаю на превышенную максимальную ошибку времени выполнения, даже четверть. Мне было интересно, если есть обходной путь, возможно, возможность хранить переменные на листе и возобновить после определенного времени? Я не слишком хорошо разбираюсь в кодировании, поэтому любая помощь в этом будет оценена.

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);
      }
    }
  }
}
  • 0
    Один из способов - сделать код асинхронным, хотя я удивлен, что messages[y].forward не асинхронны! Кроме того, это немного сложно, хотя с threads[x].removeLabel(label); после цикла y in ... Я думаю, что этот pastebin - очень асинхронное решение, которое все еще вызывает message.forward в последовательности
  • 3
    Имейте в виду, что есть также квота на количество писем, которые вы можете отправить.
Показать ещё 3 комментария
Теги:
google-apps-script
gmail

1 ответ

0
Лучший ответ

Этот скрипт должен обрабатывать одну строку в вашей электронной таблице во время выполнения. При следующем выполнении он будет запускать следующую строку и так далее. Он все еще может использовать какую-то работу, но это хорошее начало и, надеюсь, передает идею, которую я имею для того, чтобы обойти максимальное время выполнения.

Идея здесь заключается в том, что вы устанавливаете значение в столбце 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню