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

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

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);
      }
    }
  }
}

один из способов - сделать код асинхронным - хотя я удивлен, что messages[y].forward не является асинхронным! Кроме того, это немного сложно, хотя с этим threads[x].removeLabel(label); после цикла y in ... Я думаю, что этот пастебин - очень асинхронное решение, которое по-прежнему вызывает message.forward последовательно

Jaromanda X 16.07.2018 10:56

Имейте в виду, что также существует квота на количество писем, которые вы можете отправлять.

TheMaster 16.07.2018 13:20

Если вы обрабатываете строки из электронной таблицы, то можно установить флаг, указывающий, что строка заполнена. Затем вы можете обработать заданное количество записей, а затем продолжить с последнего флага. Опубликуйте сценарий ниже в ответе, чтобы вы могли его посмотреть.

New_2_Code 16.07.2018 16:24

Возможный дубликат Класс скриптов Google Apps Пакетные операции GmailApp?

TheMaster 16.07.2018 20:16
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
5
1 500
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

Другие вопросы по теме