manager - Excedió el tiempo máximo de ejecución en Google Apps Script
script editor google forms (5)
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.
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.
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 aumentará el tiempo de ejecución de 6 minutos a 30 minutos :)
Más detalles sobre el fabricante de aplicaciones Haga clic aquí
Una cosa que podrías hacer (esto por supuesto depende de lo que trates de lograr) es:
- 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).
- Haga que su secuencia de comandos termine cada cinco minutos más o menos.
- Configure un disparador controlado por el tiempo para ejecutar el script cada cinco minutos (o cree un desencadenador mediante programación utilizando el servicio de Script ).
- 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.
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 .