改善电子表格过滤脚本性能

时间:2013-01-10 13:20:29

标签: google-apps-script google-sheets

我有一个电子表格,其中第一列包含名称,接下来的17包含0,1或为空。每一行都是这样的:

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

我需要创建一个从菜单调用的函数,该函数仅向用户显示目标列(1)中arg1的行。这是代码:

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 个答案:

答案 0 :(得分:2)

您在for循环中多次调用电子表格服务 - 如果您可以将这些操作更改为一个,您会看到速度的提升。阅读Best Practices了解一些背景和指导。

我建议你重新考虑一下隐藏的方法。显示各种数据行。相反,您可以显示已过滤的列表,并使用菜单功能操作该过滤器。假设您拥有的数据看起来像这样......

Sample Spreadsheet

在电子表格的第二个标签页上,您可以提供列表的过滤版本。单元格A2中的以下公式将从orignal数据表(在此示例中称为“Master”)创建过滤的数据列表:

=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)

这段代码将显示包含数字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的菜单项。你可以在那里玩,看看会发生什么。