0

그래서 VBA에서 많은 작업을 한 후에 처음으로 Google 스크립트로 작업하고 있습니다. 코드를 실행할 때 스크립트가 실행되는 데 너무 오래 걸린다는 메시지가 나타납니다. .getValue() 및 .setValue()와 같은 특정 부분은 문제를 유발하지만 더 나은 최적화를 위해 코드를 다시 작성하는 방법을 모르겠습니다. 이 리팩토링하는 가장 좋은 방법에Google Scripts 런타임 최적화

function getPredictions() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var Carter = ss.getSheetByName("Carter"); 
    var back = ss.getSheetByName("Back"); 
    var monthsLeft= Carter.getRange(13,15) 
    var months = monthsLeft.getValue(); 
    var total = 0; 
    Carter.getRange("d2").setValue(months); 
    for(var i = 13;Carter.getLastRow(); i++){ 
    if(Carter.getRange(i, 2).getValue() != ""){ 
     total = 0; 
     var k = 17; 
     monthsLeft = Carter.getRange(i,15).getValue(); 
     for(var j = 2; j<29; j++){ 
     if(back.getRange(j, 2).getValue() <= monthsLeft){ 
      total = total + back.getRange(j, 3).getValue(); 
      Carter.getRange(i,k).setValue((back.getRange(j, 3).getValue()/Carter.getRange(i,16).getValue()) * Carter.getRange(i,11).getValue()); 
      k++; 
     } 
     } 
    } 
    } 
} 

function getMonthsL() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var Carter = ss.getSheetByName("Carter"); 
    for(var i = 13; i < Carter.getLastRow(); i++){ 
    if(Carter.getRange(i, 2).getValue() != ""){ 
     Carter.getRange(i,15).setFormula('=if(day($B$5)>20,DATEDIF($B$5,I' +i + ',"M"),DATEDIF($B$5,I' +i+',"M")+1)'); 
    } 
    } 
} 

function getMonthP(){ 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var Carter = ss.getSheetByName("Carter"); 
    var back = ss.getSheetByName("Back"); 
    var total = 0; 
    for(var i = 13; i < Carter.getLastRow(); i++){ 
    total = 0; 
    if(Carter.getRange(i, 2).getValue() != ""){ 
     for(var j = 2; Carter.getRange(i,15).getValue() >= back.getRange(j,2).getValue(); j++){ 
     total = total + back.getRange(j,3).getValue(); 
     } 
    Carter.getRange(i,16).setValue(total); 
    } 
    } 
} 

function runAll(){ 
getMonthsL(); 
getMonthP(); 
getPredictions(); 
} 

어떤 도움/설명 주시면 감사하겠습니다 : 다음은 코드입니다.

+3

개별 셀 값을 가져 오는 대신 [getValues ​​()] (https://developers.google.com/apps-script/reference/spreadsheet/range#getValues ​​())를 사용하여 자연스러운 그리드에서 데이터를 가져 와서 액세스하십시오. 값은 [배열 인덱스] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Indexed_collections#Multi-dimensional_arrays)를 사용합니다. 또한 일부 [모범 사례] (https://developers.google.com/apps-script/guides/support/best-practices) –

답변

1

나는이 답변이 정확할 것으로 기대하지 않지만 나는 우리 중 많은 사람들이 당신에게 권할만한 것을 보여줄 것이라고 생각했습니다. getValue()의 사용을 제한하고 2 차원 배열 (일종의)을 반환하는 getValues를 사용하려고합니다.

인덱스가 0에서 시작하고 행과 열이 하나에서 시작한다는 것이 복잡함 중 하나입니다. 따라서 모든 것을 똑바로 유지하는 것이 때때로 어려울 수 있지만 일단 그렇게하면 코드가 10 배 빠르게 실행될 수 있습니다.

function getPredictions() 
{ 
    var ss=SpreadsheetApp.getActiveSpreadsheet(); 
    var Carter=ss.getSheetByName("Carter"); 
    var crg=Carter.getDataRange(); 
    var carterA=crg.getValues(); 
    var back=ss.getSheetByName("Back"); 
    var backA=back.getDataRange().getValues(); 
    var months=carterA[12][14]; 
    var total=0; 
    carterA[3][1]=months; 
    for(var i = 12;i<carterA.length; i++) 
    { 
    if(carterA[i][1]!= "") 
    { 
     total = 0; 
     var k = 16; 
     var monthsLeft = carterA[i][14]; 
     for(var j=0;j<28;j++)//I probably got this indexing incorrect 
     { 
     if(backA[j][1] <= monthsLeft) 
     { 
      total = total + backA[j][2]; 
      carterA[i][k]=backA[j][2]; 
      k++; 
     } 
     } 
    } 
    } 
    crg.setValues(carterA);//This save all the changes 
    //Didn't do backA because I don't think you changed it. 
} 

나는 이것이 작동하지 않을 것이라고 확신한다. 그러나 코드를 더 빨리 만들 수있는 방법에 대한 아이디어를 줄 수 있기를 바랍니다.