2

Ich versuche, einen Code auszuführen, der Werte aus einer Kalkulationstabelle kopiert und sie in einen anderen kopiert, aber die Reihenfolge ist nicht die gleiche (schwierig, es zu einem Array zu machen). In manchen Fällen wird auch 'Unbekannt' und in einigen Fällen auch einige Zellen formatiert. Es macht jedoch viel Zeit zu beenden. Gibt es einen Weg, es zu verbessern?Code läuft zu langsam

  1. Sie tun in einer Schleife alle Berechnungen
  2. Sie getValue und setValue anstelle getValues, schnellere Funktionen setValues

Statt dessen:

function move() { 

    var sss = SpreadsheetApp.openById('xx'); 
    var sourceSheet = sss.getSheetByName('CJ_Products'); 
    var destinationSheet = sss.getSheetByName('Product2'); 

    var lastRow = sourceSheet.getRange(sourceSheet.getLastRow(), 1,1,1).getRow() 

    var i = 1 

    while(i<=lastRow){ 
    var rowInt = destinationSheet.getRange(destinationSheet.getLastRow()+1, 4,1,1).getRow() //get row number 
    destinationSheet.getRange('A' + rowInt).setFormula('=Month(D'+rowInt+')') 
    destinationSheet.getRange('B' + rowInt).setFormula('=Weekday(D'+rowInt+')') 
    destinationSheet.getRange('C' + rowInt).setFormula('=Day(D'+rowInt+')') 
    destinationSheet.getRange('D' + rowInt).setValue(sourceSheet.getRange('A'+i).getValues()) //move from the source to destination 
    destinationSheet.getRange('E' + rowInt+':F'+rowInt).setValue('Unknown') //set to Unknown 
    destinationSheet.getRange('H' + rowInt+':J'+rowInt).setValue('Unknown') 
    destinationSheet.getRange('J' + rowInt).setValue('CJ') 
    destinationSheet.getRange('K' + rowInt).setValue(sourceSheet.getRange('B' +i).getValues()) 
    destinationSheet.getRange('L' + rowInt).setValue(sourceSheet.getRange('E' +i).getValues()) 
    destinationSheet.getRange('M' + rowInt).setValue(sourceSheet.getRange('F' +i).getValues()) 
    destinationSheet.getRange('N' + rowInt).setValue(sourceSheet.getRange('J' +i).getValues()) 
    destinationSheet.getRange('S' + rowInt).setValue(sourceSheet.getRange('G' +i).getValues()) 
    destinationSheet.getRange('T' + rowInt).setValue(sourceSheet.getRange('H' +i).getValues()) 
    destinationSheet.getRange('O' + rowInt).setFormula('=S'+rowInt+'*GOOGLEFINANCE("currency:EURUSD")') 
    destinationSheet.getRange('P' + rowInt).setFormula('=T'+rowInt+'*GOOGLEFINANCE("currency:EURUSD")') 
    destinationSheet.getRange('Q' + rowInt).setFormula('=P'+rowInt+'/T'+rowInt) 
    destinationSheet.getRange('O' + rowInt+':Q'+rowInt).setNumberFormat('0.00$') 

    i = i+1 
    } 
    } 
+1

keine Tags in die Frage Titel Zwingen Sie. –

Antwort

4

Der Code sollte optimiert werden Konzentriere deine Schleife auf einen einzigen Anruf:

var rowInt = destinationSheet.getRange(destinationSheet.getLastRow()+1, 4,1,1).getRow()

versuchen, herauszufinden, wie die erste Zeile außerhalb der Schleife zu finden und dann diesen Wert erhöhen:

var rowStart = destinationSheet.getRange(destinationSheet.getLastRow()+1, 4,1,1).getRow(); 

for (var row = rowStart; row <= lastRow, row++) 
{ 
    // some code... 
} 

Verwenden Arrays und dann den Wert von Arrays in Bereiche kopieren:

var formulas = []; 

for (var row = rowStart; row <= lastRow, row++) 
{ 
    // some code... 
    formulas.push(['=Month(D'+ row + ')']); 
} 
var rangeToPateFormulas = destinationSheet.getRange('A' + rowStart + ':A' + lastRow); 
rangeToPateFormulas.setFormulas(formulas); 

Und so weiter. Sehen Sie weitere Informationen:

https://developers.google.com/apps-script/reference/spreadsheet/range

https://developers.google.com/apps-script/guides/support/best-practices