2

나는 약간의 속도가 느리고 clunky 한 코드를 가지고있다. 이 작업을 수행하는 더 좋은 방법이 있는지 확인하십시오 :구글 스크립트에서 데이터 '가져 오기/일치'수정

사용자가 편집하는 시트 ('MAIN')와 스크립트가 데이터를 가져 오는 시트 (5000 라인 이상) ('REF')가 있습니다. . 기본적으로는 1 열에서 일치를 확인하고 사용자가 입력 한 것과 일치하는 경우, 오히려 천천히 동일한 행이지만 3.

코드가 작동하는 열에서 값을 잡고 있지만 :

function onEdit(){ 
    var s = SpreadsheetApp.getActive().getSheetByName('MAIN'); 
    var sref = SpreadsheetApp.getActive().getSheetByName('REF'); 

    var activeRow = s.getActiveCell().getRow(); 
    var activeCol = s.getActiveCell().getColumn(); 
    var activeCell = s.getActiveCell().getValue(); 

    var mainPageBranch = s.getRange(8,1).getValue(); 
    var refPageBranch = sref.getRange('I4').getValue(); 

    var lastrow = sref.getLastRow(); 

    if(activeCol == '2' || activeCol == '5' || activeCol == '8' || activeCol == '11' || activeCol == '14' || activeCol == '17' || activeCol == '20'){ 
    if(activeRow > 9 && activeRow < 41){ 
     if(activeCell > 100000){ 
     s.getRange(activeRow, activeCol+1).setValue(1); 
     } 
     else{ 
     s.getRange(activeRow, activeCol+1).setValue(''); 
     } 
     for(var i=5; i <lastrow; i++){ 
     var productCode = sref.getRange(i, 1).getValue(); 
     if(activeCell == productCode){ 
      var essMould = sref.getRange(i,3).getValue(); 
      s.getRange(activeRow+1,activeCol).setValue(essMould); 
      s.getRange(activeRow+1,activeCol+1).setValue('1'); 
      break; 
     } 
     } 
     Logger.log('Product Code: ' + productCode); 
     Logger.log('Ess Mould: ' + essMould); 
     Logger.log('Last Row: ' + lastrow); 
    } 
    } 
} 

나는 그것이 clunky의 종류라고 이해한다 - 그것을 빠르게하는 어떤 도움은 위대 할 것이다!

다른 작업 :

편집이 필요하면 알려주세요 : 여기에 업데이트 된 코드 덕분입니다!

function onEdit(){ 
    var s = SpreadsheetApp.getActive().getSheetByName('MAIN'); 
    var sref = SpreadsheetApp.getActive().getSheetByName('REF'); 

    var activeRow = s.getActiveCell().getRow(); 
    var activeCol = s.getActiveCell().getColumn(); 
    var activeCell = s.getActiveCell().getValue(); 

    var mainPageBranch = s.getRange(8,1).getValue(); 
    var refPageBranch = sref.getRange('I4').getValue(); 

    var lastrow = sref.getLastRow(); 

    var productCode,essMould,data,L; 

    data = sref.getRange(5, 1, lastrow-5,3).getValues(); 
    L = data.length; //Length of data 

    if(activeCol == '2' || activeCol == '5' || activeCol == '8' || activeCol == '11' || activeCol == '14' || activeCol == '17' || activeCol == '20'){ 
    if(activeRow > 9 && activeRow < 41){ 
     if(activeCell > 100000){ 
     s.getRange(activeRow, activeCol+1).setValue(1); 
     } 
     else{ 
     s.getRange(activeRow, activeCol+1).setValue(''); 
     } 
     for(var i=5; i <L; i++){ 
     productCode = data[i][0]; 
     if(activeCell == productCode){ 
      essMould = data[i][2]; 
      s.getRange(activeRow+1,activeCol).setValue(essMould); 
      s.getRange(activeRow+1,activeCol+1).setValue('1'); 
      break; 
     } 
     } 
     Logger.log('Product Code: ' + productCode); 
     Logger.log('Ess Mould: ' + essMould); 
    } 
    } 
} 

답변

1
당신은 모든 루프의 개별 값을 받고되어서는 안

:

for(var i=5; i <lastrow; i++){ 
    var productCode = sref.getRange(i, 1).getValue(); 

먼저 모든 값의 데이터 배열을 통해 루프가 필요한 경우 배열의 데이터를 변경 한 다음 쓰기 수 전체 데이터 세트를 스프레드 시트로 다시 보냅니다.

var data,essMould,i,L,productCode; 

data = sref.getRange(5, 1, lastrow-5,activeCol).getValues(); 
L = data.length; //Length of data 

for(i=0; i < L; i++){ 
    productCode = data[i][0]; 
    Logger.log("productCode: " + productCode); 

    if (activeCell == productCode) { 
    essMould = data[i][activeCol]; 
    data[i][2] = essMould; 
    data[i + 1][activeCol + 1] = 1; 
    break; 
    } 
} 

sref.getRange(5,1,data.length,data[0].length).setValues(data); 
+0

훨씬 더 세련된 생각인데, 이것은 내가 찾고 있었던 것이지만, 나 자신을 할 수 없다. 하하! 약간 내 응용 프로그램에 맞게 코드를 편집했습니다 - 당신이 그것을 내 게시물에서 편집 볼 수 있습니다 :) 감사합니다 힙! – Khaoz

관련 문제