2017-03-26 1 views
1

Ich benutze seit einiger Zeit ein Google-Skript. Der Zweck des Skripts besteht darin, bestimmte Zeilen auf drei Registerkarten ein- oder auszublenden, wenn ein Dropdown-Menü zum Ein-/Ausblenden ausgewählt ist. Ich habe möglicherweise zwei Dinge, die ich lösen möchte und finde keine hilfreiche Informationen da draußen auf der Interwebs:Google Script - Timeout und Vereinfachung

1) Ich denke, das Skript läuft in der Reihenfolge der Operationen. Wenn also der Tab "Ein Dropdown" ausgewählt ist, werden sofort Ergebnisse angezeigt, da dies der erste "Layer" des Skripts ist. Die zweite Registerkarte ist langsamer, weil es die zweite "Ebene" des Skripts ist, und die dritte Registerkarte dauert eine Weile, weil es die dritte "Ebene" ist. Gibt es eine Möglichkeit, dieses Skript zu rationalisieren, um die Tab-Funktionalität genauso schnell zu machen?

2) Auf der dritten Registerkarte scheint das Skript eine Zeitüberschreitung zu haben. Alle Zeilen werden eingeblendet, aber wenn Sie sie durch das Dropdown-Menü ausblenden, wird sie in einer bestimmten Zeile angehalten. Es funktioniert jedoch vollständig, wenn Sie zum Skript gehen und es manuell ausführen. Im Folgenden wird das Skript, das ich verwendet habe (lösche ich unter sonst vielen Reihen würde es recht lang sein):

function onEdit(e) { 
var ss = SpreadsheetApp.getActiveSpreadsheet(); 
var s = ss.getSheetByName("TX MD 2017");   
    var row = s.getRange('C2').getValues();       
s.showRows(1); 
for(var i=0; i< row.length; i++){ if(row[i] == 'hide') 
    { s.hideRows(5); 
     s.hideRows(7); 
     s.hideRows(9);} 

    else if(row[i] == 'unhide'){s.unhideRow(ss.getDataRange());} 
}  
s = ss.getSheetByName("DC MD 2017");   
    row = s.getRange('C2').getValues();       
s.showRows(1); 
for(var i=0; i< row.length; i++){ if(row[i] == 'hide') 
    { s.hideRows(6); 
     s.hideRows(7); 
     s.hideRows(9); }       
    else if(row[i] == 'unhide'){s.unhideRow(ss.getDataRange());} 
           } 
s = ss.getSheetByName("ATL MD 2017");   
row = s.getRange('C2').getValues(); 
s.showRows(1); 
for(var i=0; i< row.length; i++){ if(row[i] == 'hide') 
    {s.hideRows(6); 
     s.hideRows(7); 
     s.hideRows(9);}       
    else if(row[i] == 'unhide'){s.unhideRow(ss.getDataRange());} 
           } 
} 
+0

Da 'c2' eine einzelne Zelle ist, denke ich' for' nicht notwendig ist. Außerdem haben Sie 's.getDataRange()' dreimal aufgerufen, aber der Wert ändert sich nicht. –

Antwort

1

Diese Zeile:

s.unhideRow(ss.getDataRange()); 

werden soll:

s.showRows(1, s.getLastRow()); 

Mit s.unhideRow(ss.getDataRange()) erhalten Sie den Datenbereich der gesamten Tabelle.
In der Dokumentation:

ein Bereich, bestehend aus allen Daten in der Tabelle

, die wahrscheinlich ist, warum wird der Code so langsam läuft.

Der Code kann zu konsolidieren:

function onEdit(e) { 
    var arrayOfRowsToHide,i,j,k,L,objectOfSettings,row,s,ss; 

    ss = SpreadsheetApp.getActiveSpreadsheet();      

    objectOfSettings = { 
    "TX MD 2017":[5,7,9], 
    "DC MD 2017":[6,7,9], 
    "ATL MD 2017":[6,7,9] 
    } 

    for (k in objectOfSettings) {//Loop through all settings 
    s.showRows(1); 
    s = ss.getSheetByName(k);//get this sheet by name 
    row = s.getRange('C2').getValues(); 
    Logger.log('row: ' + row) 
    L = row.length;//The number of rows to check 

    arrayOfRowsToHide = objectOfSettings[k];//Get array of row numbers 

    for (i=0; i<L; i++) {//Loop through all rows in the data from getValues() 
     if(row[i] === 'hide') { 
     for (j=0;j<arrayOfRowsToHide.length;j++) {//hide all rows 
      s.hideRows(arrayOfRowsToHide[j]); 
     } 
     break;//If this row has a status of "hide" then hide rows and quit 
     } else if (row[i] === 'unhide') { 
     s.showRows(1, s.getLastRow());//show all rows in the sheet 
     break;//continue to next sheet 
     } 
    } 
    } 
} 
+0

Danke für die Antwort. Ich stelle s.showRows (1, s.getLastRow()) und es scheint schneller zu gehen. Ich werde daran arbeiten, die Konsolidierung in Ordnung zu bringen, kann aber ein wenig dauern, um die Lernkurve zu überwinden. Danke noch einmal. – davecut85