2013-01-10 57 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的菜单项。在那里你可以玩耍,看看会发生什么。