3

Привет, я пытаюсь написать пользовательскую функцию, которая берет пару ячеек, перебирает все листы в электронной таблице, чтобы найти идентичную пару совпадений, и возвращает другое значение из эта же строка.Быстрое перемещение по нескольким листам для поиска данных

Фон; лист 0 является основным листом всех комбинаций LOA и ID (по существу, местоположения и серийного номера #), которые должны иметь заполненные контрольные даты. Люди, которые проводят эти проверки, обновляют свои личные листы с помощью комбинации LOA-ID + данные проверки в google водить машину. Я пытаюсь автоматически обновлять мастер-лист при каждом добавлении этих данных.

Листы все соответствуют одному и тому же формату (LOA, ID в 1-ом & 2-я колонны, дата осмотра в 14-м). Это пользовательская функция im, использующая то, что я намереваюсь, но работает очень медленно. Как сделать этот запуск быстрее? Требуется несколько секунд 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

Это лучшая практика для выполнения, как несколько звонков Spreadsheet службы, как это возможно, и особенно избегать их внутри циклов. Вместо этого извлеките все данные в пакете с помощью 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; 
}