2011-10-21 66 views
38

Tengo un script de aplicaciones que constantemente recibe este error. Juzgue por el correo electrónico de notificación, parece que el límite de tiempo es de 5 minutos. ¿Alguien sabe si hay una manera de extender este límite de tiempo? ¿O tal vez hay una forma de volver a llamar a Apps Script y retomar desde donde se quedó? Cualquier ayuda es apreciada.Superado el tiempo máximo de ejecución en Google Apps Script

+2

¿Puede compartir la secuencia de comandos que se está ejecutando? Es posible que pueda sintonizarlo para hacerlo más rápido. – Eduardo

+2

Puede doblar las reglas utilizando el servicio HTML para iniciar "iteraciones" separadas de su secuencia de comandos en subconjuntos de su trabajo. [Bruce McPherson ha blogueado al respecto.] (Http://ramblings.mcpher.com/Home/excelquirks/htmlservice/parallel) – Mogsdad

+1

Si es cliente comercial, ahora puede suscribirse para [Acceso anticipado a App Maker] (https://developers.google.com/apps-script/guides/apps-script-eap), que incluye [Cuotas flexibles] (https://developers.google.com/apps-script/guides/services/quotas #flexible_quotas_early_access). – browly

Respuesta

56

Una cosa que podría hacer (esto por supuesto depende de lo que está tratando de lograr) es:

  1. almacenar la información necesaria (es decir, como un contador de bucle) en una hoja de cálculo o otra tienda permanente (es decir, ScriptProperties).
  2. Haga que su secuencia de comandos termine cada cinco minutos más o menos.
  3. Configure un disparador accionado por tiempo para ejecutar el script cada cinco minutos (o cree un desencadenador mediante programación utilizando el Script service).
  4. En cada ejecución, lea los datos guardados del almacén permanente que ha utilizado y continúe ejecutando el script desde donde lo dejó.

Esta no es una solución única, si publica su código las personas podrían ayudarlo mejor.

Aquí es un extracto de código simplificado de un guión que utilizo todos los días:

function runMe() { 
    var startTime= (new Date()).getTime(); 

    //do some work here 

    var scriptProperties = PropertiesService.getScriptProperties(); 
    var startRow= scriptProperties.getProperty('start_row'); 
    for(var ii = startRow; ii <= size; ii++) { 
    var currTime = (new Date()).getTime(); 
    if(currTime - startTime >= MAX_RUNNING_TIME) { 
     scriptProperties.setProperty("start_row", ii); 
     ScriptApp.newTrigger("runMe") 
       .timeBased() 
       .at(new Date(currTime+REASONABLE_TIME_TO_WAIT)) 
       .create(); 
     break; 
    } else { 
     doSomeWork(); 
    } 
    } 

    //do some more work here 

} 

NOTA # 1: La variable REASONABLE_TIME_TO_WAIT debe haber debe ser lo suficientemente grande para el nuevo gatillo para disparar. (Lo configuré en 5 minutos, pero creo que podría ser menor que eso).

NOTA # 2: doSomeWork() debe ser una función que se ejecute de manera relativamente rápida (diría que menos de 1 minuto).

NOTA # 3: Google ha obsoleto Script Properties, y ha introducido Properties Service en su lugar. La función ha sido modificada en consecuencia.

+1

¿Existe un límite en la frecuencia con la que se puede disparar el gatillo? Creo que puede haber un límite de activación por 24 horas o algo así ... ¡Gracias! – Kalin

+0

No creo que esto funcione para add-on. Add-on timed-trigger solo permite ejecutar una vez cada hora. ¿Conoces alguna otra solución para mantener una tarea en ejecución y procesar una gran cantidad de datos de la hoja de Excel? – angelokh

+0

Esto tiene el efecto secundario de dejar todos los desencadenadores antiguos en la lista de desencadenantes del proyecto ... No estoy seguro de cómo se supone que los desencadenadores de tiempo caducados se eliminan. – staggart

21

Además, intente minimizar la cantidad de llamadas a los servicios de google. Por ejemplo, si desea cambiar un rango de celdas en las hojas de cálculo, no las lea, muévalas y guárdelas. En su lugar, lea todo el rango (usando Range.getValues()) en la memoria, muéstrelo y almacénelo todo a la vez (usando Range.setValues()).

Esto debería ahorrarle mucho tiempo de ejecución.

5

He utilizado ScriptDB para guardar mi lugar mientras procesaba una gran cantidad de información en un bucle. La secuencia de comandos puede/supera el límite de 5 minutos. Al actualizar ScriptDb durante cada ejecución, la secuencia de comandos puede leer el estado de la base de datos y continuar donde lo dejó hasta que se complete todo el procesamiento. Prueba esta estrategia y creo que estarás satisfecho con los resultados.

+1

Tiene un problema similar con un script que itera a través de 750 direcciones de correo electrónico en una hoja de cálculo. ¿Cómo almacena dónde dejó el script y reanuda la ejecución? – jwesonga

+0

podría proporcionar más detalles ... código de muestra si es posible ... o enlace a más detalles. –

+0

ScriptDb está en desuso. –

12

Anton Soradoi's answer parece correcto pero considere utilizar Cache Service en lugar de almacenar datos en una hoja temporal.

function getRssFeed() { 
    var cache = CacheService.getPublicCache(); 
    var cached = cache.get("rss-feed-contents"); 
    if (cached != null) { 
    return cached; 
    } 
    var result = UrlFetchApp.fetch("http://example.com/my-slow-rss-feed.xml"); // takes 20 seconds 
    var contents = result.getContentText(); 
    cache.put("rss-feed-contents", contents, 1500); // cache for 25 minutes 
    return contents; 
} 

También tenga en cuenta que a partir de abril de 2014, la limitation of script runtimees de 6 minutos.

+0

Esto me parece la forma más fácil de resolver el problema, ya que no necesita configurar ni preocuparse por ningún otro recurso (hojas de cálculo, bases de datos, ...) y toda la lógica del script permanece dentro del script. ¡Gracias! – dubrox

+1

¿Podría dar un ejemplo para una función generalizada? –

4

Si está utilizando la edición G Suite Business o Enterprise. Puede register early access for App Maker después del fabricante de la aplicación habilitada la secuencia de comandos de ejecución en tiempo de ejecución se incrementará el tiempo de ejecución de 6 minutos a 30 minutos :)

Más detalles sobre el fabricante aplicación Click here

Cuestiones relacionadas