Dépassement du temps d'exécution maximal dans le Script Google Apps

J'ai un Script D'applications qui obtient constamment cette erreur. Jugez par l'e-mail de notification, il semble que la limite de temps est de 5 minutes. Personne ne sait si il existe un moyen de prolonger ce délai? Ou peut-être Existe-t-il un moyen d'appeler à nouveau le Script des applications et de le reprendre là où il s'est arrêté? Toute aide est appréciée.

43
demandé sur Corry 2011-10-21 23:53:02

5 réponses

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(c'est-à-dire comme un compteur de boucles) dans une feuille de calcul ou un autre magasin permanent (C'est-à-dire ScriptProperties).
  2. que votre script se termine 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 programmation À l'aide du service de Script ).
  4. à chaque exécution, lisez les données enregistrées depuis le magasin permanent que vous avez utilisé et continuez à exécuter le script à partir de l'endroit où il s'est arrêté.

Ce n'est pas une solution unique, si vous postez votre code, les gens seraient en mesure de 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

}

NOTE#1: La variable REASONABLE_TIME_TO_WAIT doit être suffisamment grande pour que le nouveau déclencheur. (Je l'ai mis à 5 minutes, mais je pense que ça pourrait être moins que ça).

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

NOTE#3 : Google a retiré de Script Properties, et introduit Properties Service à sa place. La fonction a été modifiée en conséquence.

59
répondu Anton Soradoi 2016-02-25 06:18:47

Essayez également de minimiser le nombre d'appels vers les services google. Par exemple, si vous souhaitez modifier une plage de cellules dans les feuilles de calcul, ne les lisez pas, ne les mutez pas et ne les stockez pas. Au lieu de cela, lisez toute la plage (en utilisant Range.getValues () ) en mémoire, mutez-le et stockez-le tout en même temps (en utilisant Range.setValues () ).

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

24
répondu ronme 2013-07-09 15:58:11

La réponse d'Anton Soradoi semble correcte mais pensez à utiliser le service de Cache au lieu de stocker des 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.

13
répondu Liyali 2017-05-23 12:02:45

J'ai utilisé le ScriptDB pour enregistrer ma place tout en traitant une grande quantité d'informations dans une boucle. Le script peut / dépasse la limite de 5 minutes. En mettant à jour le ScriptDb pendant 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
répondu Roderick Forsythe 2012-07-27 20:28:48

Si vous utilisez G Suite Business ou Enterprise edition. Vous pouvez enregistrer early access pour App Maker après app maker activé votre script run runtime augmentera le temps d'exécution de 6 minutes à 30 minutes :)

Plus de détails sur App maker Cliquez ici

5
répondu Shiva 2017-11-15 15:49:41