3

안녕하세요, 나는 한 쌍의 셀을 취하고 스프레드 시트의 모든 워크 시트를 루프하여 동일한 셀 쌍을 찾은 다음 다른 값을 반환하는 사용자 지정 함수를 작성하려고합니다. 그 같은 행.빠르게 여러 시트를 반복하여 데이터를 찾으려면

배경; 시트 0은 검사 일을 기입해야하는 모든 LOA 및 ID 조합 (본질적으로 위치 및 일련 번호)의 마스터 시트입니다. 이러한 검사를 수행하는 사람들은 LOA-ID 조합 + google의 검사 데이터를 사용하여 개인 워크 시트를 업데이트합니다 드라이브. 이 데이터가 추가 될 때마다 자동으로 마스터 시트를 업데이트하려고합니다.

시트는 모두 동일한 형식 (LOA, ID는 & 두 번째 열, 검사 일은 14 번째)에 있습니다. 이것은 내가 의도 한 것을 사용하는 사용자 정의 함수이지만, 고통스럽게 느리게 작동합니다. 어떻게하면 더 빨리 달릴 수 있습니까? PER CELL은 몇 초가 걸립니다. 10k 개 이상의 셀을 실행해야합니다.

function findMatch(LOA,GRID) { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheets = ss.getSheets(); 
    var returnDate = "not found" 

    for (var sheetNum = 1; sheetNum < sheets.length; sheetNum++){ 
    var ws = ss.getSheets()[sheetNum] 

     for (var count = 1; count<ws.getLastRow(); count++){ 
     if (ws.getRange(count,1,1,1).getValues()==LOA && ws.getRange(count,2,1,1).getValues()==GRID) 
     { 
     returnDate = ws.getRange(count,14,1,1).getValue() 
     break; 
     } 
     else 
    { 
    } 
     } 

    } 
    Logger.log(returnDate) 
    return returnDate 

답변

3

가능한 한 스프레드 시트 서비스를 최대한 자주 수행하지 말고 루프 내부에서 사용하지 않는 것이 좋습니다. 대신 getValues ​​()를 사용하여 배치의 모든 데이터를 검색하고 Javascript를 사용하여 해당 데이터를 반복합니다.

function findMatch(LOA,GRID) 
{ 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheets = ss.getSheets(); 
    var returnDate = "not found", data; 

    for (var sheetNum = 1; sheetNum < sheets.length; sheetNum++) 
    { 
    data = sheets[sheetNum].getDataRange().getValues(); 
    for (var count = 1; count < data.length; count++) 
    { 
     if (data[count][0] == LOA && data[count][1] == GRID) 
     { 
     returnDate = data[count][13]; 
     break; 
     } 
    } 

    } 
    Logger.log(returnDate); 
    return returnDate; 
}