2016-11-18 12 views
0

Ich verwende das folgende Skript, um E-Mail-Adressen aus Google Mail basierend auf einigen Suchkriterien zu extrahieren und sie in eine Google-Tabelle auszugeben. Funktional funktioniert das Skript und macht, was ich will.Google E-Mail-Extraktionsskript - Maximale Ausführungszeit überschritten (Egal was)

Ich bekomme jedoch ständig "Maximale Ausführungszeit überschritten", wenn ich das Skript ausführen, da die maximale Ausführungszeit für Gmail-Skripts fünf Minuten zu sein scheint. Ich habe dies mit einem kleineren Label in Gmail mit einer Handvoll E-Mails getestet und das Skript läuft erfolgreich und gibt E-Mails wie erwartet aus. Wenn ich jedoch versuche, etwas in größeren Stapeln mit mehr E-Mails zu extrahieren, kann das Skript nicht abgeschlossen werden.

Dieses Skript ist von anderen Sachen, die ich im Internet gefunden habe, cobled. Ich habe versucht, dieses Zeitlimitproblem durch Hinzufügen von for-Schleifen in einem try-Block zu beheben, wobei die Ausnahme abgefangen und in den Ruhezustand versetzt wurde, sodass das Skript die Ausführung pausieren und das Zeitlimit nicht überschreiten konnte, dies jedoch nicht funktionierte. Ich habe auch andere Methoden ausprobiert, um das Skript in den Ruhezustand zu versetzen, um eine Auszeit zu vermeiden, aber diese waren nicht möglich.

Könnte mir jemand helfen, die Zeitüberschreitung zu verhindern oder eine effizientere Art der Suche in E-Mail-Threads verwenden, um die E-Mails herauszuholen?

Edit: Ich habe den Code mit den Vorschlägen hinzugefügt, aber es kann immer noch nicht abgeschlossen werden, ohne die Ausführungszeit zu erreichen. Irgendwelche Ideen, warum das Skript nicht pausiert? Ich habe auch versucht, nur eine Nachricht mit GmailApp.search (Suche, 0, 1) zu suchen, aber das Skript wird nicht abgeschlossen, wenn ich meinen Posteingang durchsuche.

function extractEmailAddresses() { 

    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var userInputSheet = ss.getSheets()[0]; 

    var labelName = userInputSheet.getRange("B2").getValue(); 
    var keyword = userInputSheet.getRange("C2").getValue(); 

    var sheetName = "Label: " + labelName; 
    var sheet = ss.getSheetByName (sheetName) || ss.insertSheet (sheetName, ss.getSheets().length); 
    sheet.clear(); 

    var messageData = []; 

    var search = "label:" + label + "is:unread " + keyword; 

    // Process 50 Gmail threads in a batch to prevent script execution errors 
    var threads = GmailApp.search(search, 1, 1);  

    var messages, from, email, subject, mailDate; 

    try { 

    for (var x=0; x<threads.length; x++) { 

     var message = threads[x].getMessages()[0]; //Get message for thread 
     from = message.getFrom(); 
     mailDate = message.getDate(); 
     from = from.match(/\[email protected]\S+\.\S+/g); 

     if (from.length) {    

     email = from[0]; 
     email = email.replace(">", ""); 
     email = email.replace("<", "");  

     //push emails to array 
     messageData.push ([email, mailDate]); 
     } 
    } 
    } 

    catch (e) { 
    //Pause script to prevent exceeded timeout error 
    Logger.log(e.toString()); 
    Utilities.sleep(5000); 
    } 

    //Adding our emails to the spreadsheet 
    sheet.getRange (1, 1, messageData.length, 2).setValues (messageData); 

} 

Antwort

0

Zwei schnelle Ideen, ich habe es im Detail nicht sieht und nicht wissen, die API gut:

  1. Sie getMessages zweimal nicht nennen:

    ersetzen:

    from = threads[x].getMessages()[0].getFrom(); 
    mailDate = threads[x].getMessages()[0].getDate(); 
    

    mit:

  2. Vermeiden Sie die Verwendung von setValue bei jeder Iteration: Die Aktualisierung einzelner Zellen in der Tabelle ist langsam, da jedes Mal die Kommunikation mit der Sheets-Infrastruktur und die Übergabe eines Werts erforderlich ist. Stattdessen baut eine größere Reihe von Zellenwerten bis zu ändern und es auf einmal mit setValues(Object[][])

Das sind nur Gedanken von einem schnellen Blick gesetzt, sorry.

+0

Danke für die Vorschläge. Ich habe das Skript entsprechend angepasst, aber das Skript kann immer noch nicht in einem normalen Zeitrahmen abgeschlossen werden. – Touchstone57

+0

Ich schlage vor, dass Sie mit einem Debugger Schritt für Schritt durchgehen oder Zeitpläne erstellen, um herauszufinden, wo die Zeit genommen wird. z.B. Wie lange dauert der Aufruf 'var threads = GmailApp.search (search, 0, 50);' take? Ist das die Mehrheit? Oder wird es tatsächlich hauptsächlich dazu verwendet, die Ergebnisse zu durchlaufen? Wenn Sie in Ihrem Skript ermitteln, wo die Zeit liegt, können Sie ermitteln, auf was Sie sich für Verbesserungen konzentrieren sollten. – Bardy

+0

Es scheint zu sein "var threads = GmailApp.search (search, 0, 50);" das könnte die meiste Zeit dauern, da ich es in 'var threads = GmailApp.search (search, 0, 5);' geändert habe. ' Durchsehen von weniger Threads, aber es ist immer noch nicht in der Lage, während der Suche im Posteingang zu vervollständigen. Liegt das daran, dass der Posteingang zu groß ist? Es funktioniert, wenn ich versuche, ein Label mit weniger E-Mails zu durchsuchen, aber ich brauche es auch, um mit einem größeren Datensatz zu arbeiten.Ich werde das Debugging versuchen, wie Sie vorgeschlagen haben, danke. – Touchstone57

Verwandte Themen