Google app délai d'exécution du script ~ 5 minutes?

mon script d'application google itère à travers les fichiers GoogleDrive de l'utilisateur et copie et parfois déplace des fichiers vers d'autres dossiers. Le script est toujours arrêté après 5 minutes sans aucun message d'erreur dans le journal.

je trie des dizaines ou parfois des milliers de fichiers en un seul passage.

y a-t-il des réglages ou des solutions de rechange?

20
demandé sur KyleMit 2013-01-22 06:53:10

5 réponses

Quotas

le temps d'exécution maximum pour un seul script est de 6 minutes / exécution

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

mais il y a d'autres limites à se familiariser avec. Par exemple, vous n'avez droit qu'à une durée totale de déclenchement d'une heure / jour, donc vous ne pouvez pas simplement casser une fonction longue en 12 5 minutes différentes bloc.

Optimisation

cela dit, il y a très peu de raisons pour lesquelles vous auriez vraiment besoin de six minutes pour exécuter. JavaScript ne devrait pas avoir de problème à trier des milliers de lignes de données en quelques secondes. Ce qui est susceptible de nuire à vos performances sont les appels de service à Googleapps lui-même.

vous pouvez écrire des scripts pour profiter au maximum de la mise en cache intégrée, en minimisant le nombre de lectures et d'Écritures. Alternant lecture et écriture commandes est lente. Pour accélérer un script, de lire toutes les données dans un tableau avec une seule commande, d'effectuer des opérations sur les données dans le tableau, et d'écrire les données avec une seule commande.

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

traitement par Lots

la meilleure chose à faire est de réduire le nombre d'appels de service. Google permet cela en autorisant les versions par lots de la plupart de leurs appels API.

Comme un exemple trivial, au Lieu de:

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

Faire:

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

Dans la première boucle, non seulement avez-vous besoin de 100 appels deleteRow sur la feuille, mais vous avez aussi besoin pour obtenir la feuille active 100 fois. La seconde variation devrait donner de meilleurs résultats de plusieurs ordres de grandeur que la première.

Interweaving lit et écrit

de plus, vous devriez également être très prudent de ne pas revenir en arrière et de suite souvent entre la lecture et l'écriture. Non seulement vous perdrez des gains potentiels dans les opérations par lots, mais Google ne sera pas en mesure d'utiliser sa mise en cache intégrée.

chaque fois que vous faites une lecture, nous devons d'abord vider (commit) le cache d'écriture pour vous assurer que vous lisez les dernières données (vous pouvez forcer une écriture du cache en appelant SpreadsheetApp.flush()). De même, chaque fois que vous écrivez, nous devons jeter le cache de lecture parce qu'il n'est plus valide. Donc si vous pouvez éviter en lisant et en écrivant, vous profiterez pleinement de la cache.

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

Par exemple, au lieu de cela:

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

Faire:

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

Le Chaînage Des Appels De Fonction

en dernier recours, si votre fonction ne peut vraiment pas finir en moins de six minutes, vous pouvez enchaîner les appels ou casser votre fonction sur un petit segment de données.

Vous pouvez stocker des données dans le Service De Cache (temporaire) ou Service De Propriétés seaux (permanents) pour la récupération à travers les exécutions (depuis les Scripts Googleapps a une exécution apatride).

Si vous voulez lancer un autre événement, vous pouvez créer votre propre déclencheur à l' Déclenchement Du Générateur De Classe ou mettre en place un déclencheur récurrent sur un temps serré table.

35
répondu KyleMit 2015-04-22 14:29:19

trouver un moyen de diviser votre travail de sorte qu'il faut moins de 6 minutes, c'est la limite pour n'importe quel script. Lors de la première passe, vous pouvez itérer et stocker la liste des fichiers et dossiers dans un tableur et Ajouter un déclencheur temporel pour la partie 2.

dans la partie 2, supprimez chaque entrée de la liste au fur et à mesure que vous la traitez. Lorsqu'il n'y a aucun élément dans la liste, supprimez le déclencheur.

C'est comme ça que je traite une feuille d'environ 1500 rangées qui se répand à une douzaine différentes feuilles de calcul. En raison du nombre d'appels vers les tableurs, il est de temps en temps, mais continue lorsque le déclencheur s'exécute à nouveau.

8
répondu Fred 2013-01-22 12:49:53

J'ai développé une bibliothèque de scripts Googleapps qui utilise UserProperties et programmatic triggers pour exécuter un lot qui s'étend au-delà de 6 minutes. Vous pouvez importer cette bibliothèque dans votre projet de gaz et envelopper votre code avec L'API de sorte qu'il puisse fonctionner pour toujours (bien pas vraiment, nous sommes limités par les quotas liés au nombre d'heures que les déclencheurs peuvent exécuter)

vous pouvez tout apprendre ici: http://patt0.blogspot.in/2014/08/continuous-batch-library-update-for.html

2
répondu patt0 2015-12-18 05:27:30

Si vous êtes un client professionnel, vous pouvez maintenant vous inscrire pour Début de l'Accès à l'App Maker, qui comprend Quotas Flexibles.

dans le cadre du système de contingentement souple, ces limites de contingentement rigides sont supprimées. Les Scripts ne s'arrêtent pas lorsqu'ils atteignent une limite de quota. Ils sont plutôt retardés jusqu'à ce que le quota soit disponible, et l'exécution du script reprend. Une fois que les quotas commencent à être utilisés, ils sont renouvelés à un taux régulier. Pour une utilisation raisonnable., les retards de script sont rares.

0
répondu browly 2017-01-11 16:39:16

Si vous utilisez G Suite Affaires, de l'Entreprise ou EDU client le temps d'exécution pour l'exécution de scripts:

30 min / exécution

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

0
répondu ScottMcC 2018-08-28 02:34:03