web-dev-qa-db-fra.com

Expiration du script Google app ~ 5 minutes?

Mon script d'application Google effectue une itération sur les fichiers de lecteur Google de l'utilisateur et la copie et parfois le transfert de fichiers vers d'autres dossiers. Le script est toujours arrêté après 5 minutes sans message d'erreur dans le journal. 

Je trie des dizaines voire des milliers de fichiers en une fois.

Existe-t-il des paramètres ou des solutions de contournement?

23
Martin V.

Les quotas

La durée maximale d'exécution d'un seul script est de 6 minutes/exécution.
- https://developers.google.com/apps-script/guides/services/quotas } _

Mais il y a d'autres limitations à connaître. Par exemple, vous ne pouvez utiliser qu'une durée d'exécution totale du déclencheur de 1 heure/jour. Vous ne pouvez donc pas diviser une longue fonction en 12 blocs différents de 5 minutes.

Optimisation

Cela dit, il y a très peu de raisons pour lesquelles vous auriez vraiment besoin de prendre six minutes pour exécuter. JavaScript ne devrait avoir aucun problème à trier des milliers de lignes de données en quelques secondes. Ce sont probablement les appels de service adressés à Google Apps lui-même qui nuisent à vos performances.

Vous pouvez écrire des scripts pour tirer le meilleur parti de la mise en cache intégrée en réduisant le nombre de lectures et d'écritures. L'alternance des commandes de lecture et d'écriture est lente. Pour accélérer un script, lisez toutes les données d'un tableau à l'aide d'une seule commande, effectuez toutes les opérations sur les données du tableau et écrivez les données à l'aide d'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 le permet en autorisant des versions par lots de la plupart de leurs appels d'API. 

Comme exemple trivial, Au lieu de ceci:

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

Faites ceci:

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

Dans la première boucle, non seulement vous aviez besoin de 100 appels à deleteRow sur la feuille, mais vous deviez également obtenir la feuille active 100 fois. La deuxième variante devrait exécuter plusieurs ordres de grandeur mieux que la première.

L'imbrication lit et écrit

En outre, vous devez également faire très attention à ne pas faire de va-et-vient fréquents entre lecture et écriture. Non seulement vous perdrez des gains potentiels en opérations par lots, mais Google ne pourra pas utiliser sa mise en cache intégrée.

Chaque fois que vous effectuez une lecture, nous devons d'abord vider (valider) le cache en écriture pour vous assurer de lire les dernières données (vous pouvez forcer l'écriture du cache en appelant SpreadsheetApp.flush()). De même, chaque fois que vous écrivez, nous devons jeter le cache de lecture car celui-ci n'est plus valide. Par conséquent, si vous évitez l'entrelacement des lectures et des écritures, vous profiterez pleinement du cache.
- http://googleappsscript.blogspot.com/2010/06/optimizing-spreadsheet-operations.html

Par exemple, au lieu de ceci:

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

Faites ceci:

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

Chaînage d'appels de fonction

En dernier recours, si votre fonction ne peut vraiment pas terminer en moins de six minutes, vous pouvez chaîner des appels ou diviser votre fonction pour travailler sur un segment de données plus petit. 

Vous pouvez stocker des données dans les compartiments service de cache (temporaire) ou service de propriétés (permanent) afin de les récupérer d'une exécution à l'autre (car l'exécution de Google Apps Scripts est sans état).

Si vous souhaitez lancer un autre événement, vous pouvez créer votre propre déclencheur avec la classe de générateur de déclencheurs ou configurer un déclencheur récurrent sur un tableau temporel serré.

41
KyleMit

Trouvez un moyen de fractionner votre travail de manière à ce que cela prenne moins de 6 minutes, car c'est la limite pour tout script. Lors de la première étape, vous pouvez parcourir et stocker la liste des fichiers et des dossiers dans une feuille de calcul et ajouter un déclencheur temporel pour la partie 2.

Dans la partie 2, supprimez chaque entrée de la liste lors de son traitement. Lorsqu'il n'y a aucun élément dans la liste, supprimez le déclencheur.

C’est ainsi que je traite une feuille d’environ 1 500 lignes qui est répartie dans une douzaine de feuilles de calcul différentes. En raison du nombre d'appels aux feuilles de calcul, le délai d'attente expire mais se poursuit lorsque le déclencheur est exécuté à nouveau.

10
Fred

J'ai développé une bibliothèque de scripts Google Apps qui utilise UserProperties et des déclencheurs programmatiques pour exécuter un lot dépassant 6 minutes. Vous pouvez importer cette bibliothèque dans votre projet GAS et encapsuler votre code avec l'API afin qu'il puisse s'exécuter à jamais (enfin 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
patt0

Si vous utilisez G Suite en tant que client Business, Enterprise ou EDU, l'heure d'exécution des scripts est définie sur: 

30 min/exécution

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

0
ScottMcC

Si vous êtes un client professionnel, vous pouvez maintenant vous inscrire à Accès anticipé à App Maker , qui inclut Quotas flexibles .

Dans le système de quota flexible, ces limites de quota strictes sont supprimées. Les scripts ne s'arrêtent pas lorsqu'ils atteignent une limite de quota. Au contraire, ils sont retardés jusqu'à ce que le quota devienne disponible, moment auquel l'exécution du script reprend. Une fois que les quotas commencent à être utilisés, ils sont remplis à un taux régulier. Pour une utilisation raisonnable, les délais de script sont rares.

0
browly