Google-apps-script

Как приостановить скрипт Google, чтобы избежать ограничений

Google Script накладывает квоты на разные службы. Если ваш сценарий превышает указанную квоту, он генерирует исключение и прекращает выполнение до сброса квоты.
Например, скрипт Google может читать 20 000 сообщений электронной почты от Gmail за 24 часа до того, как он бросает исключение, как Service invoked too many times
Надстройка «Сохранить Gmail» загружает сообщения электронной почты из Gmail и записывает их в виде файлов PDF на ваш Google Диск. Он использует основанный на времени триггер для запуска сценария в фоновом режиме, или пользователь может вручную запустить приложение для загрузки электронных писем.
Если в учетной записи Gmail пользователя много писем, и они пытаются запускать скрипт слишком часто, это может превысить квоту, и триггер может не сработать. Таким образом, полезно иметь в сценарии какие-то проверки, которые будут временно приостанавливать выполнение сценария в случае возникновения известного исключения.
const suspend = (timeInMinutes = 60) => {
CacheService.getScriptCache().put('SUSPEND', Date.now(), timeInMinutes * 60);
};
const isSuspended = () => {
return CacheService.getScriptCache().get('SUSPEND');
};

Мы используем CacheService Google Script, чтобы отслеживать, был ли приостановлен скрипт.
Время истечения установлено на 60 минут, поэтому скрипт автоматически возобновит выполнение после истечения срока действия кеша.
В основном приложении мы добавляем блок try catch который анализирует сообщение об исключении. Если сообщение совпадает с одной из известных ошибок — например, Service using too much computer time for one day или Service invoked too many times — мы приостанавливаем скрипт на 60 минут.
const app = () => {
try {
// download emails
} catch ({ message }) {
if (/Service invoked too many times/.test(message)) {
suspend(60);
}
}
};
const hourlyTrigger = () => {
if (!isSuspended()) {
app();
}
};

При следующем вызове нашего hourlyTrigger оно запустит основное приложение, только если скрипт Google не находится в приостановленном состоянии. Поскольку мы используем здесь Cache Service, приостановленное состояние автоматически сбрасывается по истечении срока действия кеша.