我有一个包含许多隐藏行的 Google 电子表格,我想在遍历电子表格中的行列表时跳过它们。
这主要是一个效率问题,因为我正在处理超过一半的行被隐藏并且不需要检查。
任何帮助,将不胜感激。
我有一个包含许多隐藏行的 Google 电子表格,我想在遍历电子表格中的行列表时跳过它们。
这主要是一个效率问题,因为我正在处理超过一半的行被隐藏并且不需要检查。
任何帮助,将不胜感激。
在 Apps 脚本中没有直接的方法来执行此操作,但是如果您想为它加注星标,则打开一个功能请求以提供一种获取行的显示/隐藏状态的方法。
2018 年的新 API 可用于解决此问题:isRowHiddenByUser。另请参阅isRowFilteredByUser
。
使用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 定义了用于聚合的函数类型。第二个参数是应用函数的范围。
COUNTA
并计算范围内的值的数量单元格范围为 1的结果SUBTOTAL
将在隐藏单元格时为 0,在显示单元格时为 1。NOT
反转它。
现在,您可以使用脚本读取 B 列,以了解是否隐藏了一行。
问题跟踪器自 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)
至于解决方法,可以使用SUBTOTAL
可以返回垂直范围单元格的小计的函数。
语法是:
SUBTOTAL(function_code, range1, [range2, ...])
其中任何这些代码的隐藏值可以通过在前面加上 10(到个位数代码)来跳过。
例如 102 表示COUNT
同时跳过隐藏单元格,并110
表示VAR
这样做。
相关:Google 电子表格仅对Webapps SE 显示的行求和