Google Apps Script 自动隐藏超1个月工作表功能失效求助
Google Apps Script 工作表自动生成与隐藏方案
现有代码核心问题
- 直接拿
Range对象和月份数字做比较,没有读取单元格实际存储的值,条件判断完全不生效 - 隐藏逻辑没有排除需要保留的主工作表、模板工作表,会误藏核心表
- 原有月份比对逻辑没有处理跨年场景,比如12月生成的表到次年1月会被判定为月份数字1 < 12,不会隐藏
方案一:最简实现(优先推荐,符合你的简化需求)
运行脚本时自动隐藏除主工作表、新生成的当日工作表之外的所有表,逻辑简单无bug:
// 请将下方的MAIN_SHEET_NAME替换为你实际的主工作表名称 const MAIN_SHEET_NAME = "主工作表"; const TEMPLATE_SHEET_NAME = "DAILY STANDUP TEMPLATE"; function createNewStandupSheet() { var ss = SpreadsheetApp.getActiveSpreadsheet(); // 生成日期信息 var options = { day: '2-digit', month: 'short', year: 'numeric' }; var todaysDate = new Date().toLocaleDateString("en-GB", options); var weekStr = Utilities.formatDate(new Date(), "GMT", "'Week'w"); // 复制模板生成新表 var newSheet = ss.getSheetByName(TEMPLATE_SHEET_NAME).copyTo(ss); SpreadsheetApp.flush(); var newSheetName = weekStr + "-" + todaysDate; newSheet.setName(newSheetName); // 写入表头日期 newSheet.getRange("C1:G1").setValue(todaysDate); // 隐藏除主表、新表、模板表之外的所有表 hideAllSheetsExcept([MAIN_SHEET_NAME, newSheetName, TEMPLATE_SHEET_NAME]); } function hideAllSheetsExcept(keepSheetNames) { var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets(); for(var i = 0; i < sheets.length; i++){ var currentSheet = sheets[i]; // 如果当前表不在保留列表里就隐藏 if(!keepSheetNames.includes(currentSheet.getName())){ currentSheet.hideSheet(); } } }
方案二:按「超过1个月自动隐藏」逻辑优化实现
如果你需要保留当月的历史表,只隐藏超过1个月的旧表,可以用这个版本,解决了原有月份比对的所有问题:
// 请将下方的MAIN_SHEET_NAME替换为你实际的主工作表名称 const MAIN_SHEET_NAME = "主工作表"; const TEMPLATE_SHEET_NAME = "DAILY STANDUP TEMPLATE"; function createNewStandupSheet() { var ss = SpreadsheetApp.getActiveSpreadsheet(); // 生成日期信息 var today = new Date(); var options = { day: '2-digit', month: 'short', year: 'numeric' }; var todaysDate = today.toLocaleDateString("en-GB", options); var weekStr = Utilities.formatDate(today, "GMT", "'Week'w"); // 生成当前时间戳存储,后续用于判断是否超过1个月 var currentTimeStamp = today.getTime(); // 复制模板生成新表 var newSheet = ss.getSheetByName(TEMPLATE_SHEET_NAME).copyTo(ss); SpreadsheetApp.flush(); var newSheetName = weekStr + "-" + todaysDate; newSheet.setName(newSheetName); // 写入表头日期和当前时间戳(存到A50单元格,不影响正常使用) newSheet.getRange("C1:G1").setValue(todaysDate); newSheet.getRange("A50").setValue(currentTimeStamp); // 隐藏超过1个月的非保留表 hideExpiredSheets(); } function hideExpiredSheets() { var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets(); // 计算30天前的时间戳(1个月按30天算,可自行调整) var oneMonthAgoTimeStamp = new Date().getTime() - 30 * 24 * 60 * 60 * 1000; for(var i = 0; i < sheets.length; i++){ var currentSheet = sheets[i]; var sheetName = currentSheet.getName(); // 跳过主表和模板表 if(sheetName == MAIN_SHEET_NAME || sheetName == TEMPLATE_SHEET_NAME) continue; // 读取存储的创建时间戳 var createTimeStamp = currentSheet.getRange("A50").getValue(); // 如果没有存储时间戳或者时间超过1个月就隐藏 if(!createTimeStamp || createTimeStamp < oneMonthAgoTimeStamp){ currentSheet.hideSheet(); } } }
内容的提问来源于stack exchange,提问作者SKB111
相关产品推荐
相关产品推荐

