2013-07-19 50 views
3

嗨,我想寫一個自定義函數,它需要一對單元格,循環遍歷電子表格中的所有工作表以找到相同匹配的單元格對,並從中返回另一個值同一行。快速循環瀏覽多個工作表以找到數據

背景;工作表0是所有LOA和ID組合(基本上是位置和序列號)的主工作表,它們需要在那裏填寫檢查日期。執行這些檢查的人員使用LOA-ID組合+在谷歌上的檢查數據更新他們的個人工作表駕駛。我試圖讓主表單自動更新,每當這個數據被添加。

表單全部採用相同的格式(LOA,第一列&第二列ID,第14列檢查日期)。這是一個自定義函數,使用它可以做我想要的,但是工作起來很慢。我如何讓這個運行更快?每個細胞需要幾秒鐘;我需要運行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; 
}