2

1つのスプレッドシートから値をコピーして別のスプレッドシートにコピーするコードを実行しようとしていますが、その順序は同じではありません(配列にするのは難しい)。場合によっては、「Unknown」も印刷され、一部ではいくつかのセルもフォーマットされます。しかし、それは多くの時間を終了する方法を作る。それを改善する方法はありますか?コードが遅すぎる

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

:詳細情報を参照してください。 –

答えて

4

コードを最適化する必要があります。

  1. あなたがあなたの代わりに高速化機能getValuesgetValuesetValueを使用するループ
  2. 内のすべての計算を行う、setValues

の代わりに、この1回の呼び出しでループを集中させてください:

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

ループの外側の第1行を検索する方法を理解し、この値インクリメントしよう:次に

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

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

使用アレイ及び範囲にアレイからの値をコピー:

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); 

など。質問のタイトルにタグを強制しないでください

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

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