2014-01-03 2 views
0

Я пытаюсь запустить следующий скрипт, чтобы обойти максимальное время выполнения скрипта Google. Я выполняю функцию в течение 4 минут и устанавливаю триггер, чтобы он запускался снова через 5 минут, начиная с того места, где он был остановлен при обработке. Первый раз через него выполняется плавно и задает триггер. Когда триггер запускается в первый раз, он обрабатывается очень медленно, а затем не запускается снова. Может ли кто-нибудь сказать мне, что я делаю неправильно, и если есть способ обойти это?Триггер, чтобы обойти «Превышено максимальное время выполнения» в google-apps-script

function updateAll() { 

    var startTime= (new Date()).getTime(); 
    var startRow = ScriptProperties.getProperty("start_row"); 

    //Start on row 2 if null 
    if (!startRow) { 
    startRow = "2"; 
    } 

    // This code deletes all the triggers 
    var triggers = ScriptApp.getProjectTriggers(); 
    for(var i in triggers) { 
    ScriptApp.deleteTrigger(triggers[i]); 
    } 

    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getSheets()[0]; 

    for (var i = startRow; i < 3000; i++) { 
    var currTime = (new Date()).getTime(); 

    if(currTime - startTime >= 240000) { 

     ScriptProperties.setProperty("start_row", i) 
     //Set new trigger to run in 5 minutes 
     ScriptApp.newTrigger("updateAll") 
       .timeBased() 
       .at(new Date(currTime+300000)) 
       .create(); 
     break; 

    } else { 

     //Do logic and set values in spreadsheet 
     //Run sleep to avoid maximum script execution error 
     Utilities.sleep(100); 

    } 

    }; 
} 
+0

Btw, 'Date.now()' 'делает ваш (новый Date()). GetTime()'. –

ответ

2

Откуда вы знаете, что он работает медленно? Работает ли электронная таблица с вашей новой версией? Кажется, there's a lot of issues with it.

В любом случае, я бы не удалял триггер и не переустанавливал его каждый раз. Я бы просто запускал его каждые 5 минут и удалял, когда обнаружил, что работа полностью завершена. Также нет необходимости вызывать Utilities.sleep из-за «максимальной ошибки времени выполнения». Это полезно только в том случае, если вы нажимаете ошибку типа «звонки в секунду».

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

var startRow = parseInt(ScriptProperties.getProperty("start_row")); 
Смежные вопросы