2016-09-20 2 views
1

Google Script-Tabelle Novice optimierenGoogle Skript - überschritt maximale Ausführungszeit, helfen

Ich versuche, um eine Matrix zu erstellen, wenn das Array ein kleine Datenbank alles funktioniert gut, natürlich, wenn es 800 Zeilen überschreitet und mehr Pausen auf den Fehler "Sie haben die maximal zulässige Laufzeit überschritten." Nicht effektiv erstellen eine Matrix:

var s = SpreadsheetApp.getActiveSheet(); //List 
 
var toAddArray = []; //Greate Arr 
 
    for (i = 1; i <= s.getLastRow()+1; ++i){ //Start getting Value 
 
    var numbr = s.getRange(i,4); //detect range 
 
    var Valus = numbr.getValues().toString(); //get value 
 
    
 
    //filter value 
 
    var newznach = Valus.replace(/\-/g, "").replace(/[0-9][0-9][0-9][0-9][0-9][a-zA-Zа-яА-Я][a-zA-Zа-яА-Я]/g, "").replace(/[a-zA-Zа-яА-Я][a-zA-Zа-яА-Я]/g, ""); 
 
    toAddArray.push([i.toFixed(0),Valus,newznach]); //add to array 0- Row numb, 1- Value, 2- "filtered" value 
 
    }

toAddArray =

{ 
Row, Value, NewValue - filtered 
Row, Value, NewValue - filtered 
Row, Value, NewValue - filtered 
... 
} 

Kann ich irgendwie eine Reihe von demselben anderen Weg (schneller, einfacher)?

+0

Antworten schon hier behandelt: https://developers.google.com/apps-script/best_practices –

Antwort

2

Sie rufen CallValues ​​jede Zeile, die eine Menge Leistung isst.
Es ist besser, einen großen Anruf zu machen, um alle Daten zu haben und dann nacheinander durchzugehen.

var s = SpreadsheetApp.getActiveSheet(); 
var data = s.getRange(1,4, s.getLastRow()).getValues(); 

var toAddArray = data.map(function(row, i) { 
    var Valus = row[0].toString(); 
    var newznach = Valus. 
    replace(/\-/g, ""). 
    replace(/[0-9][0-9][0-9][0-9][0-9][a-zA-Zа-яА-Я][a-zA-Zа-яА-Я]/g, ""). 
    replace(/[a-zA-Zа-яА-Я][a-zA-Zа-яА-Я]/g, ""); 

    return [i.toFixed(0), Valus, newznach]; 
}); 
+0

Danke auch realisiert, dass das Problem ist, dass die GetValue in jedem Zyklus durchgeführt. Meine Krücke war, um es über den Zyklus zu machen, wie: var Valus = numbr.getValues ​​(). ToString(). Split (","); toAddArray.push ([i.toFixed (0), Valus [i-1], newznach]); Aber Sie haben keinen Zweifel, Code richtiger und schöner –

+0

Mit Ihrem Code, Laufzeit von 0,254 Sekunden für 1.500 Zeilen der Tabelle –

1

dieser Code:

var Valus = numbr.getValues().toString(); 

verlangsamt Sie, weil Sie Daten aus dem Blatt in einer Schleife zu lesen.

Versuchen Lesen von Daten einmal in ein Array und dann mit ihm arbeiten:

var data = s.getDataRange().getValues(); 

Und dann mit data, in einer Schleife arbeiten. Dieser Beispielcode log jede Zelle im aktiven Blatt:

function logEachCell() { 
    var s = SpreadsheetApp.getActiveSheet(); 
    var data = s.getDataRange().getValues(); 

    // loop each cell 
    var row = []; 
    for (var i = 0; i < data.length; i++) { 
    row = data[i]; 
    for (var j = 0; j < row.length; j++) { 
     Logger.log(row[j])  
    } 
    } 
} 
Verwandte Themen