12

我有一个包含许多隐藏行的 Google 电子表格,我想在遍历电子表格中的行列表时跳过它们。

这主要是一个效率问题,因为我正在处理超过一半的行被隐藏并且不需要检查。

任何帮助,将不胜感激。

4

5 回答 5

7

在 Apps 脚本中没有直接的方法来执行此操作,但是如果您想为它加注星标,则打开一个功能请求以提供一种获取行的显示/隐藏状态的方法。

于 2011-08-25T12:35:55.910 回答
7

2018 年的新 API 可用于解决此问题:isRowHiddenByUser。另请参阅isRowFilteredByUser

于 2019-07-30T01:31:52.200 回答
4

使用SUBTOTAL. 创建 2 列 A 和 B。A 必须始终有一个值,而 B 有一组公式。这 2 列如下所示:

A |           B
---------------------------
1 | =NOT(SUBTOTAL(103, A1))
1 | =NOT(SUBTOTAL(103, A2))
1 | =NOT(SUBTOTAL(103, A3))

SUBTOTAL使用指定的聚合函数返回小计。第一个参数 103 定义了用于聚合的函数类型。第二个参数是应用函数的范围。

  • 3 表示COUNTA并计算范围内的值的数量
  • +100 表示忽略该范围内的隐藏单元格。

单元格范围为 1的结果SUBTOTAL将在隐藏单元格时为 0,在显示单元格时为 1。NOT反转它。

现在,您可以使用脚本读取 B 列,以了解是否隐藏了一行。

这是转置的问题和答案:https ://stackoverflow.com/a/27846180/1385429

于 2015-01-08T17:36:46.873 回答
3

问题跟踪器自 2010 年 8 月 3 日起持有该请求,具有中等优先级和“已分类”状态。超过 3 年,GAS 团队没有任何解决方案的迹象。

我的解决方法是使用一个特殊的前导字符来指示行/列的可见性状态,它是顶部标题行/列的单元格中的前导反引号 (`)。如果在列标题中使用了合并单元格,那么在谷歌工程师改进 API 之前,应该专门为该功能提供一个空的顶行。如果第一行/列单元格中有公式,则同样适用。这些专用行/列本身可以隐藏。

开始使用此功能后,应从自定义菜单执行每个显示/隐藏列/行命令,否则在以编程方式遍历范围时会出现错误,因为缺少/过多的反引号。

例如,要隐藏选定单元格的行,调用以下函数

function hideSelectedRows() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = SpreadsheetApp.getActiveRange();

  // hide rows and add a ` backtick to the header cell
  for (var row = range.getRow(); row <= range.getLastRow(); row++)
  {
    // add backtick only if it isn't there (that may happen when manually unhiding the rows)
    var cellHeader      = sheet.getRange(row, 1)
    var cellHeaderValue = cellHeader.getValue()    
    if ( !cellHeaderValue.match(/^`/) ) {
      cellHeader.setValue('`' + cellHeaderValue)
    }

    // hide rows of selected range
    sheet.hideRows( row );
  }
}

和菜单

SpreadsheetApp.getActiveSpreadsheet()
.addMenu("Show/Hide", [
    { name : "Hide Selected Rows",    functionName : "hideSelectedRows"    },
    { name : "Hide Selected Columns", functionName : "hideSelectedColumns" },
    null,
    { name : "Hide Rows",             functionName : "hideRows"            },
    { name : "Hide Columns",          functionName : "hideColumns"         },
    null,
    { name : "Show Rows",             functionName : "showRows"            },
    { name : "Show Columns",          functionName : "showColumns"         },
    null,
    { name : "Show All Rows",         functionName : "unHideAllRows"       },
    { name : "Show All Columns",      functionName : "unHideAllColumns"    }
  ])

一旦谷歌工程师找到时间改进 onChange 事件,就可以自动放置这些反引号。目前,changeType 仅限于EDIT、INSERT_ROW、INSERT_COLUMN、REMOVE_ROW、REMOVE_COLUMN、INSERT_GRID、REMOVE_GRID、OTHER,没有任何关于插入/删除行/列的详细信息。看起来 GAS 背后的团队很少。我希望他们能雇佣更多的程序员(khm khm)

于 2013-10-05T02:02:11.377 回答
0

至于解决方法,可以使用SUBTOTAL可以返回垂直范围单元格的小计的函数。

语法是:

SUBTOTAL(function_code, range1, [range2, ...])

其中任何这些代码的隐藏值可以通过在前面加上 10(到个位数代码)来跳过。

例如 102 表示COUNT同时跳过隐藏单元格,并110表示VAR这样做。

相关:Google 电子表格仅对Webapps SE 显示的行求和

于 2015-08-04T22:28:32.220 回答