You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 22:15:48