2015-06-29 2 views
1

Я использую учетную запись 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); 
} 
+0

Пожалуйста, добавьте дополнительную информацию, чтобы помочь подумать об альтернативах и полноте. Как вы вызываете скрипт? (Тайм-триггер, какой-то пользовательский интерфейс?) Если вы используете пользовательский интерфейс, укажите свой код для этого. Благодарю. – Mogsdad

+0

Возможная оптимизация для вашего текущего кода ... Уменьшите количество запросов GMail с помощью 'OR, чтобы объединить несколько идентификаторов устройств для тестирования' subject', а затем затем оценивать объекты в JavaScript. (Могу быть в состоянии получить все 600 за один раз, но я бы ожидал ограничение длины строки для поиска.) – Mogsdad

+0

Прямо сейчас, он будет работать только при ручном запуске через scripts.google.com. Я хотел пройти эту проблему, прежде чем пытаться выяснить, как ее автоматизировать. – user2012363

ответ

0

Я предлагаю вам увидеть проблему с другой точки зрения.

Не могли бы вы найти общую строку для всех писем, отправляемых вашим отчетом? Что-то вроде «состояния устройства» в объекте или в теле ...

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

function checkList(device){ 
var sheet = SpreadsheetApp.getActiveSheet(); 
var data = sheet.getDataRange().getValues(); 
    for(var n=0;n<data.length;n++){ 
    if(data[n][0]==device){ return true};// assuming number are in column A 
    } 
    return false; 
} 

затем отправить почту только if(checkList(device)!=true){

Это было бы гораздо более эффективным, я думаю.

Смежные вопросы