wake-up-neo.net

Die maximale Ausführungszeit in Google Apps Script wurde überschritten

Ich habe ein Apps-Skript, das ständig diesen Fehler erhält. Gemessen an der Benachrichtigungs-E-Mail sieht es so aus, als ob das Zeitlimit 5 Minuten beträgt. Weiß jemand, ob es eine Möglichkeit gibt, diese Frist zu verlängern? Oder gibt es eine Möglichkeit, das Apps-Skript erneut aufzurufen und dort fortzufahren, wo es aufgehört hat? Jede Hilfe wird geschätzt.

46
Corry

Eine Sache, die Sie tun könnten (dies hängt natürlich davon ab, was Sie erreichen möchten), ist:

  1. Speichern Sie die erforderlichen Informationen (d. H. Wie ein Schleifenzähler) in einem Arbeitsblatt oder einem anderen permanenten Speicher (d. H. ScriptProperties).
  2. Lassen Sie Ihr Skript etwa alle fünf Minuten beenden.
  3. Richten Sie einen zeitgesteuerten Trigger ein, um das Skript alle fünf Minuten auszuführen (oder erstellen Sie einen Trigger programmgesteuert mit dem Skriptdienst ).
  4. Lesen Sie bei jedem Lauf die gespeicherten Daten aus dem permanenten Speicher, den Sie verwendet haben, und führen Sie das Skript an der Stelle aus, an der es aufgehört hat.

Dies ist keine einheitliche Lösung, wenn Sie Ihren Code veröffentlichen, können Ihnen die Mitarbeiter besser helfen.

Hier ist ein vereinfachter Code-Auszug aus einem Skript, das ich jeden Tag benutze:

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

}

HINWEIS 1: Die Variable REASONABLE_TIME_TO_WAIT Sollte groß genug sein, damit der neue Trigger ausgelöst werden kann. (Ich habe es auf 5 Minuten eingestellt, aber ich denke, es könnte weniger sein).

HINWEIS 2: doSomeWork() muss eine Funktion sein, die relativ schnell ausgeführt wird (ich würde sagen, weniger als 1 Minute).

ANMERKUNG 3: Google hat Script Properties abgelehnt und Properties Service anstelle dessen eingeführt. Die Funktion wurde entsprechend geändert.

65
Anton Soradoi

Versuchen Sie außerdem, die Anzahl der Anrufe bei Google Services zu minimieren. Wenn Sie beispielsweise einen Bereich von Zellen in den Arbeitsblättern ändern möchten, lesen Sie nicht jede Zelle, mutieren Sie sie und speichern Sie sie zurück. Lesen Sie stattdessen den gesamten Bereich (mit Range.getValues ​​() ) in den Speicher, mutieren Sie ihn und speichern Sie ihn auf einmal (mit Range.setValues ​​() ).

Dies sollte Ihnen viel Ausführungszeit sparen.

27
ronme

Anton Soradois Antwort scheint in Ordnung zu sein, aber erwägen Sie, Cache-Service zu verwenden, anstatt Daten in einem temporären Blatt zu speichern .

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

Beachten Sie außerdem, dass ab April 2014 die Beschränkung der Skriptlaufzeit 6 Minuten beträgt.


Benutzer von G Suite Business/Enterprise/Education und Early Access:

Ab August 2018 ist die maximale Skriptlaufzeit für diese Benutzer auf 30 Minuten festgelegt.

14
Liyali

Ich habe die ScriptDB verwendet, um meinen Platz zu sichern, während ich eine große Menge von Informationen in einer Schleife verarbeitete. Das Skript kann/darf das 5-Minuten-Limit überschreiten. Durch Aktualisieren der ScriptDb während jedes Durchlaufs kann das Script den Status aus der Datenbank lesen und dort fortfahren, wo er aufgehört hat, bis die gesamte Verarbeitung abgeschlossen ist. Probieren Sie diese Strategie aus und ich denke, Sie werden mit den Ergebnissen zufrieden sein.

5

Wenn Sie die G Suite Business oder Enterprise Edition verwenden. Sie können frühzeitigen Zugriff für App Maker registrieren Nach Aktivierung von App Maker erhöht sich die Laufzeit durch die Ausführung Ihres Skripts von 6 Minuten auf 30 Minuten :)

Weitere Details zu App Maker hier klicken

5
Shiva