Excedió el tiempo máximo de ejecución en Google Apps Script

Tengo un script de aplicaciones que constantemente obtiene 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.

Una cosa que podrías hacer (esto por supuesto depende de lo que trates de lograr) es:

  1. Almacene la información necesaria (es decir, como un contador de bucle) en una hoja de cálculo u otro almacén permanente (es decir, ScriptProperties).
  2. Haga que su secuencia de comandos termine cada cinco minutos más o menos.
  3. Configure un disparador controlado por el tiempo para ejecutar el script cada cinco minutos (o cree un desencadenador mediante progtwigción utilizando el servicio de Script ).
  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 para todos, si publica su código las personas podrían ayudarlo mejor.

Aquí hay un fragmento de código simplificado de un script que uso 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 debería ser lo suficientemente grande para que se active el nuevo disparador. (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 forma relativamente rápida (diría que menos de 1 minuto).

NOTA n. ° 3: Google ha dejado de utilizar las Script Properties e introdujo el Properties Service en su lugar. La función ha sido modificada en consecuencia.

Además, trate de 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.

La respuesta de Anton Soradoi parece correcta, pero considere usar el servicio de caché en lugar de almacenar los 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 limitación del tiempo de ejecución del script es de 6 minutos .

He usado 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.

Si usa la edición G Suite Business o Enterprise. Puede registrar el acceso anticipado para App Maker después de que el fabricante de la aplicación haya habilitado el tiempo de ejecución de la secuencia de comandos boostá el tiempo de ejecución de 6 minutos a 30 minutos 🙂

Más detalles sobre el fabricante de aplicaciones Haga clic aquí