基于自定义菜单的App Script:实现仅显示当前工作表功能
解决Google Sheets自定义菜单切换工作表并隐藏其余的问题
问题分析
你的代码逻辑本身可行,但存在两个关键问题导致功能失效:
- 全局变量在脚本初始化阶段执行,可能获取到错误的表格上下文
- 菜单定义中存在语法错误(
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(); }
关键修改点说明
- 移除全局变量:删除了脚本开头的
ss、currentSheetId、sheets全局变量,避免脚本初始化时获取错误的上下文,确保每次函数执行时都获取最新的活动表格。 - 修复语法错误:修正了
subMenu4末尾多余的闭合括号,确保菜单能正常创建。 - 优化
showOnlySheet函数:- 增加了工作表不存在的提示,提升用户体验
- 调整操作顺序,先激活目标工作表,再隐藏其他工作表,避免UI更新异常
- 保留
flush()方法确保所有操作立即生效
使用说明
- 将修改后的代码替换原脚本内容
- 保存脚本后,刷新Google Sheets表格
- 点击自定义菜单中的选项,即可激活对应工作表并自动隐藏其余工作表
内容的提问来源于stack exchange,提问作者Rodrigo Theodoro
相关产品推荐
相关产品推荐

