2017-09-24 78 views
0

我不是專業人士,但我需要這個Google腳本來處理我的電子表格。我正在尋找拼圖來建立我的代碼。最後它可以工作,但速度很慢。有人能幫我嗎?我可以在慢動作中看到代碼的工作原理。 :-(電子表格的Google腳本非常慢

我的電子表格或工作表有很多條目,但有些行是空的(超過1000行)使用過濾器功能,我可以非常快速地隱藏這些行,只需幾秒鐘。電子表格只是創建者,普通用戶實際上並不是專家,使用過濾功能對他們來說是個挑戰,我認爲我可以將腳本中的所有步驟合併爲一個按鈕使用,其中一部分隱藏空行。

腳本在第N列檢查是否有1或0。如果有0,那麼該行應該隱藏。腳本從第7行開始到1150.隱藏一行需要一秒!慢動作。如果我的代碼是垃圾,是否可以通過腳本激活過濾功能?

function hideRows() { 

    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    ss.setActiveSheet(ss.getSheetByName("Order")); 
    var sheet = SpreadsheetApp.getActiveSheet(); 
    var column = 14; 
    var cell = 0; 
    var lastRow = SpreadsheetApp.getActiveSheet().getLastRow(); 

    for (var row = 7; row < lastRow; row++) { 
    cell = sheet.getRange(row, column).getValues(); 
    if (cell == 0){ 
     sheet.hideRows(row); 
    } 
    else { 
     sheet.showRows(row); 
    } 
    } 
} 
+2

您應該獲取數組中的所有值,然後在循環中遍歷它們,而不是逐個獲取值。它會明顯更快。 – Cooper

回答

0

試試這個:

function hideRows() 
{ 
    var ss=SpreadsheetApp.getActive(); 
    var sh=ss.getSheetByName('Sheet1').activate(); 
    var rg=sh.getDataRange(); 
    var vA=rg.getValues(); 
    for (var i=6;i<vA.length-1;i++)//vA.length-1 stops before last row i=6 is row 7 
    { 
    if (vA[i][13] == 0) 
    { 
     sh.hideRows(i+1); 
    } 
    else 
    { 
     sh.showRows(i+1); 
    } 
    } 
} 

數組下標與行數和列數少一個,所以你必須保持這種直的,但你得到的所有數據在同一時間,然後循環運行速度快得多,因爲您閱讀數組而不必訪問每個值的電子表格。

0

getValues()方法返回一個二維數組,因此您應該使用getValue()來代替它,它將返回目標單元格的內容。我改寫了你貼有一個好一點的語法/格式的片段,通過二維數組遞增是不是通過細胞增加更快/範圍:

function hideRows() { 

    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Order"); //get sheet 
    var nRows = sheet.getLastRow() - 7; //# of rows to search 

    var values = sheet.getRange(7, 14, nRows, 1).getValues(); //Get 2D array of values [[],[],...] 
    //increment through the full index range of values (0-7) 
    for (var i in values) { 
    if (values[i][0] == 0) sheet.hideRows(i+7); //i+7 is the rowIndex (7-14) 
    else sheet.showRows(i+7); 
    } 
} 

這應該做到你想要做什麼。如果您有任何問題或疑問,請告知我。

相關問題