Google Sheets Apps Script 取消隐藏行遗漏手动隐藏行问题求助
问题原因
原脚本的显隐逻辑被包裹在r.every(e => e == '')的空行判断分支内,选择选项B触发取消隐藏操作时,只会对空白行执行显示操作,所有非空行(包括手动隐藏的非空行)都不会被遍历处理,因此无法取消手动隐藏的非空行。
修改方案
调整分支判断逻辑,将两种选项的处理逻辑拆分:
- 选择选项A时,保留原有逻辑,仅隐藏Sheet2中的所有空白行,不改动非空行状态
- 选择选项B时,跳过空行判断,直接遍历Sheet2所有已使用行,对所有处于隐藏状态的行执行取消隐藏操作,覆盖手动隐藏、脚本自动隐藏的所有场景
修改后的完整可运行代码如下:
function onEdit(e) { const sh = e.range.getSheet(); const rg = e.source.getRangeByName("NamedRange1"); const sr = rg.getRow(); const sc = rg.getColumn(); const er = sr + rg.getHeight() - 1; const ec = sc + rg.getWidth() - 1; if (sh.getName() == "Sheet3" && e.range.columnStart >= sc && e.range.columnStart <= ec && e.range.rowStart >= sr && e.range.rowStart <= er && e.value) { const sh2 = e.source.getSheetByName("Sheet2"); // 选项A逻辑:仅隐藏空白行 if (e.value == "A") { const vs = sh2.getDataRange().getValues(); vs.forEach((r, i) => { if (r.every(cell => cell == '')) { sh2.hideRows(i + 1); } }); } // 选项B逻辑:取消所有行的隐藏状态 else if (e.value == "B") { const lastRow = sh2.getLastRow(); for (let rowNum = 1; rowNum <= lastRow; rowNum++) { // 匹配所有用户手动/脚本触发的隐藏行,默认不包含筛选器、分组折叠隐藏的行 if (sh2.isRowHiddenByUser(rowNum)) { sh2.showRows(rowNum); } } } } }
补充说明
- 如果需要覆盖筛选器、行分组折叠导致的隐藏场景,可以在判断条件中追加
sh2.isRowHiddenByFilter(rowNum)、sh2.isRowHiddenByGroup(rowNum)判断即可 - 逐行处理显隐的逻辑在数据量超过1000行时可能存在轻微延迟,可根据实际使用场景调整为批量收集隐藏行号后统一执行显示操作,优化运行速度
内容的提问来源于stack exchange,提问作者Edyphant
相关产品推荐
相关产品推荐

