Я использую учетную запись gmail для получения обновлений статуса с устройств, которые я перечислял в электронной таблице Google своим пользователем и серийным номером. В электронном письме с обновлением статуса будет указан серийный номер устройства в его элементе электронной почты и обычно отправляется примерно раз в неделю на устройство. Из-за количества устройств (600+) я получаю довольно постоянный приток обновлений статуса с различных устройств каждый день. То, что я пытаюсь сделать, - это настроить сценарий, который будет искать мою папку «Входящие» и создать список устройств, на которых я не получил сообщение об обновлении статуса, из которого было бы интересно выяснить, почему это устройство не сообщает.Повторный запуск сценария GMail для предотвращения «Превышено максимальное время выполнения»
Я изменил сценарий, который я нашел в Интернете по адресу: http://forums.mozillazine.org/viewtopic.php?f=46&t=2740775. Он работает путем получения серийного номера устройства, указанного в электронной таблице, и поиска в папке «Входящие» для темы электронной почты с этим серийным номером, отправленным за последние 15 дней. Скрипт отлично работает, когда в таблице содержится около 200 элементов, но помимо этого я начинаю получать ошибку «Превышено максимальное время выполнения», и мне нужно, чтобы время от времени выполнялось более 600 элементов. Мне также пришлось добавить строку Utilities.sleep (1000), чтобы избежать «Службы, вызванной слишком много раз за короткое время: ошибка gmail rateMax». Есть ли лучший способ написать этот скрипт, чтобы избежать этих ошибок?
function SearchEmail() {
var sheet = SpreadsheetApp.getActiveSheet();
var data = sheet.getDataRange().getValues();
var waittime = 15;
var emailTo = "[email protected]";
var emailSubject = "NO EMAIL IN " + waittime + " DAYS FROM FOLLOWING DEVICES";
var emailText = "";
for (var i = 1; i < data.length; i++) {
Utilities.sleep(1000);
var j = i + 1;
var gsearch = "in:inbox subject:(" + data[i][1] + ") newer_than:" + waittime + "d";
var threads = GmailApp.search(gsearch, 0, 1);
if (threads.length == 0) {
var emailText = emailText + j + " Device: " + data[i][1] + " User: " + data[i][0] + "\n";
}
}
MailApp.sendEmail(emailTo, emailSubject, emailText);
}
Пожалуйста, добавьте дополнительную информацию, чтобы помочь подумать об альтернативах и полноте. Как вы вызываете скрипт? (Тайм-триггер, какой-то пользовательский интерфейс?) Если вы используете пользовательский интерфейс, укажите свой код для этого. Благодарю. – Mogsdad
Возможная оптимизация для вашего текущего кода ... Уменьшите количество запросов GMail с помощью 'OR, чтобы объединить несколько идентификаторов устройств для тестирования' subject', а затем затем оценивать объекты в JavaScript. (Могу быть в состоянии получить все 600 за один раз, но я бы ожидал ограничение длины строки для поиска.) – Mogsdad
Прямо сейчас, он будет работать только при ручном запуске через scripts.google.com. Я хотел пройти эту проблему, прежде чем пытаться выяснить, как ее автоматизировать. – user2012363