2013-01-10 58 views
0

我有一個電子表格,其中第一列包含名稱,而下一個17包含0,1或爲空。每一行看起來是這樣的:提高電子表格篩選腳本的性能

foobar 0 0 0 1 0 1 // and so on 

我需要的功能,從菜單中調用,顯示用戶只在目標列(arg11行。這裏是代碼:

var ssBase = SpreadsheetApp.getActiveSheet(); 
var last = ssBase.getLastRow() ; 
var data = ssBase.getDataRange().getValues(); 

function SkillsFilter(arg1){ 

    ssBase.showRows(1, last+1); 

    for (var i=1; i < last; i++){ 
    if (data[i][arg1] != "1"){       
     ssBase.hideRows(i+1); 
}}} 

此函數執行速度不如我想。我應該如何提高性能?緩存會幫助我還是其他什麼?

回答

2

您正在撥打電話for循環中的電子表格服務的許多電話 - 如果您可以將這些許多操作變成一個,你會看到一個很大的速度提升。閱讀Best Practices瞭解一些背景和指導。

我建議你重新考慮隱藏&顯示各種數據行的方法。相反,您可以顯示過濾列表,並使用菜單功能操作該過濾器。比方說,你擁有的數據看起來像這樣...

Sample Spreadsheet

在電子表格中的第二個選項卡,你可以提供列表的過濾版本。單元格A2以下公式將從一部開拓創新數據表(稱爲在這個例子中「主設備」)創建數據的過濾列表:

=filter(Master!A2:R;Master!D2:D="1") 

要以編程創建過濾器,可使用setFormulaR1C1()功能。這是一個函數,你可以從你的菜單項調用設置任何特定列的過濾器。

/** 
* Sets the filter in cell A2 of the sheet named "Filter" to display 
* only rows with a number 1 in the indicated column. 
* 
* @param {number} column The "skill" column to filter for 
*/ 
function setFilter(column) { 
    column = column | 2; // Use first "skill" column as default 
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Filter"); 
    var formula = "Master!R[0]C[0]:C[17];Master!R[0]C[" 
     +column 
     +"]:C[" 
     +column 
     +"]=1"; 
    sheet.getRange("A2").setFormulaR1C1(formula); 
} 
1

這段代碼將顯示包含數字1的所有行,以爲塔範圍:

function mySort() { 
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); 

    // set col and row 
    var col = sheet.getLastColumn(), row = sheet.getLastRow()-1; 

    // hide all rows 
    sheet.hideRows(2, row); 

    // itterate through columns 
    for(var k=0; k<col; k++) { 
    this.data = sheet.getRange(2, 1, row, col) 
     .sort({column: parseInt(k+1), ascending: true}).getValues(); 

    //set counters 
    var cFirst=0, cSecond=0; 

    // itterate to find number of "1" rows in column k 
    for(var i=0; i<row; i++) {  
     if(this.data[i][k] == 1) { 
     cFirst++; 
     } else { 
     cSecond++; 
     } 
    } 

    // calculate rowIndex 
    var rIndex = row-cSecond; 

    // show (unhide) only "1" rows 
    sheet.showRows(rIndex+2, cFirst); 
    } 
} 

見我創建示例文件:Show the one's。當文件被打開時,它會添加另一個名爲Sorting的菜單項。在那裏你可以玩耍,看看會發生什麼。