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

基于自定义菜单的App Script:实现仅显示当前工作表功能

解决Google Sheets自定义菜单切换工作表并隐藏其余的问题

问题分析

你的代码逻辑本身可行,但存在两个关键问题导致功能失效:

  1. 全局变量在脚本初始化阶段执行,可能获取到错误的表格上下文
  2. 菜单定义中存在语法错误(subMenu4末尾多余的闭合括号),导致菜单无法正确创建

修改后的完整代码

function onOpen() {
  createMenuWithSubMenu();
}

function createMenuWithSubMenu() {
  var subMenu = SpreadsheetApp.getUi().createMenu("⚙️ 设置")
    .addItem("⚙️ 数据验证器", "supportsheet")
    .addSeparator()
    .addSubMenu(SpreadsheetApp.getUi().createMenu('❌ 请勿使用 ❌')
      .addItem("🔧 RL03筛选器", "DBRL03")
      .addSeparator()
      .addItem("⚙️ RL04筛选器", "DBRL04")
      .addSeparator()
      .addItem("🔧 Dash07筛选器", "DBRL05")
      .addSeparator()
      .addItem("🔧 Dash08筛选器", "DBRL06"));

  var subMenu1 = SpreadsheetApp.getUi().createMenu("📂 总体跟踪 📂")
    .addSubMenu(SpreadsheetApp.getUi().createMenu('📋 报表')
      .addItem("📋 年度无筛选总览", "RL01"))
    .addSeparator()
    .addSubMenu(SpreadsheetApp.getUi().createMenu('📉 仪表板')
      .addItem("📊 年度无筛选总览(数值)", "Dash01")
      .addSeparator()
      .addItem("📊 年度无筛选总览(百分比)", "Dash02"));

  var subMenu2 = SpreadsheetApp.getUi().createMenu("🏥 医院 🏥")
    .addSubMenu(SpreadsheetApp.getUi().createMenu('📋 报表')
      .addItem("📋 年度筛选", "RL02")
      .addSeparator()
      .addItem("📋 年度总览", "RL03"))
    .addSeparator()
    .addSubMenu(SpreadsheetApp.getUi().createMenu('📉 仪表板')
      .addItem("📊 年度单个筛选(数值)", "Dash03")
      .addSeparator()
      .addItem("📊 年度单个筛选(百分比)", "Dash04")
      .addSeparator()
      .addItem("📊 月度筛选", "Dash07"));

  var subMenu3 = SpreadsheetApp.getUi().createMenu("🩸 检测 🩸")
    .addSubMenu(SpreadsheetApp.getUi().createMenu('📋 报表')
      .addItem("📋 年度总览", "RL04")
      .addSeparator()
      .addItem("📋 年度筛选", "RL05"))
    .addSeparator()
    .addSubMenu(SpreadsheetApp.getUi().createMenu('📉 仪表板')
      .addItem("📊 年度单个筛选(数值)", "Dash05")
      .addSeparator()
      .addItem("📊 年度单个筛选(百分比)", "Dash06")
      .addSeparator()
      .addItem("📊 月度筛选", "Dash08"));   
    
  var subMenu4 = SpreadsheetApp.getUi().createMenu("📩 发送 📩")
    .addItem("📋 年度报表", "RLHP01")
    .addSeparator()
    .addItem("📋 月度报表", "RLHP02");
  
  SpreadsheetApp.getUi().createMenu("🌐 请求 🌐")
    .addItem("📤 首页", "Home")
    .addSeparator()
    .addItem("🖥 注册", "Database")
    .addSeparator()
    .addSubMenu(subMenu)
    .addSeparator()
    .addSubMenu(subMenu1)
    .addSeparator()
    .addSubMenu(subMenu2)
    .addSeparator()
    .addSubMenu(subMenu3)
    .addSeparator()
    .addSubMenu(subMenu4)
    .addToUi();
}


function Home() {
  showOnlySheet('Início');
}

function Database() {
  showOnlySheet('Database');
}

function supportsheet() {
  showOnlySheet('Support Sheet');
}

function RL01() {
  showOnlySheet('RL01');
}

function RL02() {
  showOnlySheet('RL02');
}

function RL03() {
  showOnlySheet('RL03');
}

function RL04() {
  showOnlySheet('RL04');
}

function RL05() {
  showOnlySheet('RL05');
}

function DBRL03() {
  showOnlySheet('DBRL03');
}

function DBRL04() {
  showOnlySheet('DBRL04');
}

function DBRL05() {
  showOnlySheet('DBRL05');
}

function DBRL06() {
  showOnlySheet('DBRL06');
}

function Dash01() {
  showOnlySheet('Dash01');
}

function Dash02() {
  showOnlySheet('Dash02');
}

function Dash03() {
  showOnlySheet('Dash03');
}

function Dash04() {
  showOnlySheet('Dash04');
}

function Dash05() {
  showOnlySheet('Dash05');
}

function Dash06() {
  showOnlySheet('Dash06');
}

function Dash07() {
  showOnlySheet('Dash07');
}

function Dash08() {
  showOnlySheet('Dash08');
}

function RLHP01() {
  showOnlySheet('RLHP01');
}

function RLHP02() {
  showOnlySheet('RLHP02');
}

// 仅显示指定工作表,隐藏其余所有工作表
function showOnlySheet(sheetName) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const targetSheet = ss.getSheetByName(sheetName);
  
  // 校验目标工作表是否存在
  if (!targetSheet) {
    SpreadsheetApp.getUi().alert(`工作表 ${sheetName} 不存在!`);
    return;
  }
  
  // 先激活目标工作表,再处理其他工作表的可见性
  ss.setActiveSheet(targetSheet);
  
  // 遍历所有工作表,设置可见性
  ss.getSheets().forEach(sheet => {
    sheet.setVisible(sheet.getSheetName() === sheetName);
  });
  
  // 强制刷新UI
  SpreadsheetApp.flush();
}

关键修改点说明

  1. 移除全局变量:删除了脚本开头的ss、currentSheetId、sheets全局变量,避免脚本初始化时获取错误的上下文,确保每次函数执行时都获取最新的活动表格。
  2. 修复语法错误:修正了subMenu4末尾多余的闭合括号,确保菜单能正常创建。
  3. 优化showOnlySheet函数:
    • 增加了工作表不存在的提示,提升用户体验
    • 调整操作顺序,先激活目标工作表,再隐藏其他工作表,避免UI更新异常
    • 保留flush()方法确保所有操作立即生效

使用说明

  1. 将修改后的代码替换原脚本内容
  2. 保存脚本后,刷新Google Sheets表格
  3. 点击自定义菜单中的选项,即可激活对应工作表并自动隐藏其余工作表

内容的提问来源于stack exchange,提问作者Rodrigo Theodoro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 01:27:06