0

我有一个电子表格,其中第一列包含名称,接下来的 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);
}}}

这个功能没有我想的那么快。我应该如何提高性能?缓存会帮助我还是其他什么?

4

2 回答 2

2

您在for循环中对电子表格服务进行了多次调用 - 如果您可以将这些操作合二为一,您将看到速度大大提高。阅读最佳实践以获取一些背景和指导。

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

样本电子表格

在电子表格的第二个选项卡上,您可以提供列表的过滤版本。单元格 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);
}
于 2013-01-10T18:52:55.820 回答
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 . 打开文件时,它会添加另一个菜单项,称为排序。你可以在那里玩耍,看看会发生什么。

于 2013-01-29T18:52:58.450 回答