2017-03-14 3 views
0

Ich bin ein bisschen Anfänger bei der Codierung, vor allem Javascript/Google-Skript-Sprache. Ich habe den Code unten erstellt, und es funktioniert, aber jetzt, wo ich einen funktionierenden Code habe, würde ich gerne sehen, wie ich ihn optimieren kann. Es scheint mir, dass alle Aufrufe von getValue() ein großer Leistungshit sind, und ich war nie wirklich gut darin, Loops zu optimieren. Wer weiß einen besseren Weg, um das gleiche wie diesen Code zu erreichen?Code optimieren - getValue() und looping

Was es tut: Prüft jede Tabelle in einem meiner Ordner, um zu sehen, ob der Rest des Skripts ausgeführt werden muss. Wenn dies der Fall ist, wird das Blatt geöffnet und die Anzahl der Zeilen mit Daten gezählt, um die Anzahl der Zeilen zu begrenzen, die in der Schleife überprüft werden. Es sucht dann nach einer Zeile, die für Push markiert ist, und kopiert diesen Bereich in eine andere Tabelle in meinem Laufwerk. Es geht dann weiter zur nächsten Datei im Ordner und macht das selbe.

Hier ist mein Code:

function myVupdate() { 
    try { 
    var folder = DriveApp.getFolderById("123abc"), 
     files = folder.getFiles(); 
    while (files.hasNext()) { 
    var file = files.next(), 
     sss = SpreadsheetApp.open(file); 
    SpreadsheetApp.setActiveSpreadsheet(sss); 

    //Work orders update 
    var ss = sss.getSheetByName("Sheet2"), 
     refresh = ss.getRange("W3").getValue(); 
    if (refresh == 0) {continue}; 
    var avals = ss.getRange("D5:D").getValues(), 
     count = avals.filter(String).length, 
     rows = count + 5 
    var val = ss.getDataRange().getValues(); 
    for (var row=5; row < rows; row++) { 
    var cell = ss.getDataRange().getCell(row, 23).getValue(); 
    if (cell == 0) {   
     var cells = [["v" + "WO-" + val[row-1][3] + "_" + val[row-1][2],val[row-1][13],val[row-1][14],val[row-1][15],new Date()]]; 
     var tss = SpreadsheetApp.openById("target_spreadsheet"), 
      ts = tss.getSheetByName("Sheet5"); 
     ts.insertRowBefore(2); 
     var last_hmy = ts.getRange(3,1).getValue(); 
     ts.getRange(2,1).setValue(last_hmy+1); 
     ts.getRange(2,2,cells.length,cells[0].length).setValues(cells); 
     ts.getRange(2,7).setValue(sss.getName()); 
     ss.getRange(row,17).setValue(last_hmy+1); 
     ss.getRange(row,18,cells.length,cells[0].length).setValues(cells); 

     //Turnover update 
    var ss = sss.getSheetByName("Sheet1"), 
     avals = ss.getRange("D5:D").getValues(), 
     count = avals.filter(String).length, 
     rows = count + 5 
    var val = ss.getDataRange().getValues(); 
    } 
    } 
    for (var row=5; row < rows; row++) { 
    var cell = ss.getDataRange().getCell(row, 24).getValue(); 
    if (cell == 0) { 

     var cells = [["v" + val[row-1][3] + "_" + val[row-1][2],val[row-1][12],val[row-1][15],val[row-1][16],new Date()]]; 
     var tss = SpreadsheetApp.openById("target_spreadsheet"), 
      ts = tss.getSheetByName("Sheet5"); 
     ts.insertRowBefore(2); 
     var last_hmy = ts.getRange(3,1).getValue(); 
     ts.getRange(2,1).setValue(last_hmy+1); 
     ts.getRange(2,2,cells.length,cells[0].length).setValues(cells); 
     ts.getRange(2,7).setValue(sss.getName()); 
     ss.getRange(row,18).setValue(last_hmy+1); 
     ss.getRange(row,19,cells.length,cells[0].length).setValues(cells); 
    } 
    } 
    } 
} 
    catch(e) { 
    // Browser.msgBox("An error occured. A log has been sent for review."); 
    var errorSheet = SpreadsheetApp.openById ("target_sheet").getSheetByName("Error Log"), 
    source = sss.getName(); 
    lastRow = errorSheet.getLastRow(); 
    var cell = errorSheet.getRange('A1'); 
    cell.offset(lastRow, 0).setValue(e.message); 
    cell.offset(lastRow, 1).setValue(e.fileName); 
    cell.offset(lastRow, 2).setValue(e.lineNumber); 
    cell.offset(lastRow, 3).setValue(source); 
    cell.offset(lastRow, 4).setValue(new Date()); 
    MailApp.sendEmail("[email protected]", "Error report - " + new Date(), 
     "\r\nSource: " + source + "\r\n" 
     + "\r\nMessage: " + e.message 
     + "\r\nFile: " + e.fileName 
     + "\r\nLine: " + e.lineNumber 
    ); 
    } 
} 

Antwort

2

Hallo und willkommen auf Stack-Überlauf,

vor allem, Sie richtig sind. Je mehr getValue() oder setValue() Anrufe Sie tun, desto schlechter die Leistung, lesen Sie mehr zu Best Practices here. Google empfiehlt, diese so oft wie möglich stapelweise zu erstellen. Eine Sache, die sofort Aufmerksamkeit Federn ist die folgende:

var val = ss.getDataRange().getValues(); 

so jetzt haben Sie alle Werte auf dem Blatt in einem 2D-Array. Das bedeutet, dass in der folgenden Bit

var ss = sss.getSheetByName("Sheet2"), 
     refresh = ss.getRange("W3").getValue(); 
    if (refresh == 0) {continue}; 
    var avals = ss.getRange("D5:D").getValues(), 
     count = avals.filter(String).length, 
     rows = count + 5 
    var val = ss.getDataRange().getValues(); 
    for (var row=5; row < rows; row++) { 
    var cell = ss.getDataRange().getCell(row, 23).getValue(); 

jeder einzelnen getValue() oder getValues() ist nicht mehr erforderlich. Stattdessen wissen Sie, dass refresh = val[2][22], weil Sie die dritte Zeile und 23. Spalte benötigen, wie Sie bereits den gesamten Bereich, der Daten aus diesem Blatt hat.

Same mit avals als alle Werte in Bereich D5:D sind in vals[n][3], wo n beginnt von 4. Denken Sie daran, der Array-Index beginnt bei 0 (so erste Zeile und die erste Spalte ist vals[0][0].

So überall Sie versuchen getValues() aus der ss-Tabelle zu verwenden, haben Sie bereits, dass die Daten. Was Sie auch tun können, ist manipulieren Sie das Array, das Sie haben, also ändern Sie immer nur die Werte in diesem Array.So verwenden Sie ss.getDataRange().setValues(vals), um das gesamte Array wieder in den gleichen Bereich zu verschieben (Sie können den Bereich einfach in einer Variablen wie datRange = ss.getDataRange() und speichern dann tun datRange.setValues(vals).

Sie müssen nur mit einem separaten Daten-Array für jedes andere Blatt arbeiten.Ich ging nicht im Detail für den Rest des Codes als die gleichen Ideen gehen durch. Da Sie bereits alles mit getValues() greifen, gibt es keinen Grund mehr, getValue() für irgendeine Zelle in diesem Bereich zu verwenden.