web-dev-qa-db-fra.com

Temps d'exécution maximal dépassé dans le script Google Apps

J'ai un script d'applications qui obtient constamment cette erreur. À en juger par l'e-mail de notification, il semble que le délai soit de 5 minutes. Est-ce que quelqu'un sait s'il existe un moyen de prolonger ce délai? Ou peut-être existe-t-il un moyen d'appeler à nouveau le script d'applications et de reprendre là où il s'était arrêté? Toute aide est appréciée.

46
Corry

Une chose que vous pourriez faire (cela dépend bien sûr de ce que vous essayez d'accomplir) est:

  1. Stockez les informations nécessaires (par exemple, comme un compteur de boucles) dans une feuille de calcul ou un autre magasin permanent (par exemple ScriptProperties).
  2. Faites terminer votre script toutes les cinq minutes environ.
  3. Configurez un déclencheur temporel pour exécuter le script toutes les cinq minutes (ou créez un déclencheur par programme à l'aide de Service de script ).
  4. À chaque exécution, lisez les données enregistrées dans le magasin permanent que vous avez utilisé et continuez d'exécuter le script là où il s'était arrêté.

Ce n'est pas une solution universelle, si vous publiez votre code, les gens pourraient mieux vous aider.

Voici un extrait de code simplifié d'un script que j'utilise tous les jours:

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

}

REMARQUE # 1: La variable REASONABLE_TIME_TO_WAIT Doit être suffisamment grande pour que le nouveau déclencheur se déclenche. (Je l'ai fixé à 5 minutes mais je pense que ça pourrait être moins que ça).

NOTE # 2: doSomeWork() doit être une fonction qui s'exécute relativement rapidement (je dirais moins de 1 minute).

REMARQUE # 3: Google a déprécié Script Properties , et introduit Properties Service à sa place. La fonction a été modifiée en conséquence.

65
Anton Soradoi

Essayez également de minimiser le nombre d'appels aux services Google. Par exemple, si vous souhaitez modifier une plage de cellules dans les feuilles de calcul, ne lisez pas chacune, ne la mutez pas et ne la stockez pas. Au lieu de cela, lisez toute la plage (en utilisant Range.getValues ​​() ) en mémoire, mutez-la et stockez-la en une seule fois (en utilisant Range.setValues ​​() ).

Cela devrait vous faire économiser beaucoup de temps d'exécution.

27
ronme

la réponse d'Anton Soradoi semble OK mais pensez à utiliser Cache Service au lieu de stocker les données dans une feuille temporaire .

 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;
 }

Notez également qu'en avril 2014, la limitation de l'exécution du script est de 6 minutes .


Utilisateurs G Suite Business/Enterprise/Education et Early Access:

Depuis août 2018, la durée d'exécution maximale du script est désormais fixée à 30 minutes pour ces utilisateurs.

14
Liyali

J'ai utilisé ScriptDB pour enregistrer ma place tout en traitant une grande quantité d'informations en boucle. Le script peut/dépasse la limite de 5 minutes. En mettant à jour ScriptDb lors de chaque exécution, le script peut lire l'état de la base de données et reprendre là où il s'était arrêté jusqu'à ce que tout le traitement soit terminé. Essayez cette stratégie et je pense que vous serez satisfait des résultats.

5
Roderick Forsythe

Si vous utilisez l'édition G Suite Business ou Enterprise. Vous pouvez enregistrer un accès anticipé pour App Maker après avoir activé App Maker, l'exécution de votre script augmentera la durée d'exécution de 6 minutes à 30 minutes :)

Plus de détails sur le créateur d'applications Cliquez ici

5
Shiva