2

我试图运行一个代码,从一个电子表格复制值并将它们复制到另一个,但是顺序不一样(很难使它成为一个数组)。在某些情况下,它还会打印“未知”,并且在某些情况下还会格式化一些单元格。然而,它需要很长时间才能完成。有没有办法改进它?代码运行太慢

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. 你做一个循环
  2. 您使用getValuesetValue,而不是更快的功能getValues所有的计算,setValues

取而代之的是集中你的循环做一次呼叫:

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

揣摩如何找到环外的第一行,然后增加该值:

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