Mi google app script es la iteración del usuario archivos de google drive y la copia y, a veces, mover archivos a otras carpetas. El guión siempre es detenido después de 5 minutos sin mensaje de error en el registro.

Estoy clasificación de decenas o incluso miles de archivos en una sola carrera.

¿Hay alguna configuración o soluciones?

InformationsquelleAutor Martin V. | 2013-01-22

5 Comentarios

  1. 43

    Cuotas

    El tiempo máximo de ejecución para una única secuencia de comandos está a 6 minutos /ejecución

    https://developers.google.com/apps-script/guides/services/quotas

    Pero hay otras limitaciones para familiarizarse con. Por ejemplo, sólo se permite un total de desencadenador de tiempo de ejecución de 1 hora /día, por lo que no puede romper una larga función en 12 tipos diferentes de 5 minutos.

    Optimización

    Que dijo, hay muy pocas razones por las que realmente te necesita tomar de seis minutos a ejecutar. JavaScript no debe tener ningún problema de clasificación de miles de filas de datos en un par de segundos. Lo que es probable que dañe su rendimiento son las llamadas de servicio de Google Apps en sí.

    Puede escribir secuencias de comandos para aprovechar al máximo el construido-en caché, minimizando el número de lecturas y escrituras. La alternancia de comandos de lectura y escritura es lenta. Para aumentar la velocidad de secuencia de comandos, leer todos los datos en una matriz con un comando, realice cualquiera de las operaciones sobre los datos en la matriz, y escribir los datos con un solo comando.

    https://developers.google.com/apps-script/best_practices

    Lotes

    La mejor cosa que usted puede hacer es reducir el número de llamadas de servicio. Google permite que esta permitiendo lote versiones de la mayoría de sus llamadas a la API.

    Como un ejemplo trivial, en Lugar de este:

    for (var i = 1; i <= 100; i++) {
      SpreadsheetApp.getActiveSheet().deleteRow(i);
    }

    Ello:

    SpreadsheetApp.getActiveSheet().deleteRows(i, 100);

    En la primera vuelta, no sólo necesita 100 llamadas a deleteRow en la hoja, pero también necesario para obtener la hoja activa 100 veces. La segunda variación se debe realizar varios órdenes de magnitud mejor que la primera.

    Entrelazamiento Lee y Escribe

    Además, también se debe ser muy cuidadoso para no ir de ida y vuelta con frecuencia entre la lectura y la escritura. No sólo va a perder el potencial de ganancias en operaciones por lotes, pero Google no será capaz de utilizar su función de almacenamiento en caché.

    Cada vez que haces una lectura, primero debemos vacío (commit) la caché de escritura para asegurarse de que usted está leyendo los datos más recientes (puede forzar a una escritura de la caché llamando SpreadsheetApp.flush()). Del mismo modo, cada vez que haces una escritura, tenemos que tirar la caché de lectura porque ya no es válido. Por lo tanto, si usted puede evitar el intercalado de lee y escribe, usted obtendrá el beneficio total de la memoria caché.

    http://googleappsscript.blogspot.com/2010/06/optimizing-spreadsheet-operations.html

    Por ejemplo, en lugar de este:

    sheet.getRange("A1").setValue(1);
    sheet.getRange("B1").setValue(2);
    sheet.getRange("C1").setValue(3);
    sheet.getRange("D1").setValue(4);

    Ello:

    sheet.getRange("A1:D1").setValues([[1,2,3,4]]);

    Encadenamiento De Llamadas A La Función

    Como último recurso, si su función, realmente no se puede terminar en menos de seis minutos, puede encadenar llamadas o romper su función para trabajar en un segmento más pequeño de datos.

    Puede almacenar los datos en la Servicio De Caché (temporal) o Propiedades Del Servicio (permanente) cubos para la recuperación a través de las ejecuciones (desde Google Apps script tiene un estado de ejecución).

    Si quieres que saque de otro evento, usted puede crear su propio gatillo con el Gatillo Constructor De La Clase o la instalación de un recurrente desencadenar en un apretado de la tabla.

    • Gracias KyleMit, que es una muy completa respuesta!
    • «Que, dijo, hay muy pocas razones por las que realmente te necesita tomar seis minutos para ejecutar.» a Tratar de escribir un script que procesa por ejemplo, cosas en Gmail, Drive, etc…
    • aquellos que parecen un par de razones 🙂 pero sí, el 95%+ de secuencias de comandos no se debería correr en esto como un obstáculo
  2. 11

    Encontrar una manera de dividir el trabajo por lo que tarda menos de 6 minutos, ya que es el límite para cualquier secuencia de comandos. En el primer paso, usted puede iterar y guarde la lista de archivos y carpetas en una hoja de cálculo y agregar un desencadenador controlado por tiempo para la parte 2.

    En la parte 2, eliminar cada entrada en la lista a medida que el proceso de la misma. Cuando no hay elementos en la lista, eliminar el gatillo.

    Esta es la forma en que estoy de procesamiento de una hoja de alrededor de 1500 filas que se distribuye alrededor de una docena de diferentes hojas de cálculo. Debido a que el número de llamadas a hojas de cálculo, tiempo de espera, pero continúa cuando el disparador se ejecuta de nuevo.

    • Para ser precisos, el máximo de tiempo de ejecución es de 6 minutos: «el máximo actual de la ejecución del script límite de tiempo (6 minutos)» como se indica aquí developers.google.com/apps-script/scriptdb
    • Gracias, lo he reparado. También, yo uso un 10min gatillo para mi guión, sólo para asegurarse de que no se superponen entre ejecuciones. No estoy seguro de cómo decide Google a la hora de inicio impulsada por factores desencadenantes, así que un poco de búfer no puede lastimar.
    • ASÍ que usted puede almacenar todos sus datos en ScriptDb y hacer alguna pequeña parte (porque de 6min límite) y luego continuar en la próxima carrera (que será activada por el temporizador). Eso suena como una buena solución.
    • También, usted puede ahora crear desencadenadores para cualquier momento que quieras, así que mi script crea un desencadenador de 7 minutos en el futuro cada vez que se inicia (si es que sabe que va a tener para seguir adelante).
  3. 2

    He desarrollado una biblioteca de secuencias de Comandos de Google Apps que utiliza UserProperties y programático desencadenadores para ejecutar un lote de la extiende más allá de los 6 minutos. Usted puede importar esta biblioteca en su proyecto de GAS y ajustar el código con el API para que pueda funcionar para SIEMPRE (bueno, no realmente, estamos limitados por las cuotas relacionadas con el número de horas que los desencadenadores pueden ejecutar)

    Tu puede aprender todo sobre él aquí: http://patt0.blogspot.in/2014/08/continuous-batch-library-update-for.html

  4. 0

    Si usted es un cliente de negocios, ahora usted puede firmar para arriba para El Acceso temprano a la App Maker, que incluye Flexible Cuotas.

    Bajo el flexible sistema de cuotas, tales cuota de disco duro límites son eliminados. Los Scripts no se detienen cuando llegan a un límite de cuota. Más bien, se retrasa hasta que la cuota esté disponible, en qué punto de la secuencia de comandos de ejecución se reanuda. Una vez que las cuotas van a ser utilizados, son rellenados en un ritmo regular. Para un uso razonable de script, los retrasos son raros.

Dejar respuesta

Please enter your comment!
Please enter your name here