Google Sheet脚本异常:仅显示今日数据,无法保留最后两个日期行
脚本无法保留表格最后两个日期行的原因及修正方案
问题根源
你的脚本逻辑完全偏离需求:你用系统的今日/昨日作为保留条件,但需求是保留表格里实际存在的最后两个不同日期的所有行。
具体问题:
- 脚本里的
yesterday是系统日期的前一天,不是表格数据里的倒数第二个日期 - 如果表格最后两个日期不是系统的今日和昨日(比如周末无数据、数据滞后),脚本会错误保留系统日期对应的行,而非表格里的最新两个日期
修正后的脚本
要实现需求,得先从表格中提取所有实际存在的日期,筛选出最后两个,再对比每行日期决定是否隐藏:
function hideRowsExceptLastTwoDates() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName("Example"); var startRow = 9; var lastRow = sheet.getLastRow(); // 提取A列第9行及以下的所有非空日期 var dateValues = sheet.getRange(startRow, 1, lastRow - startRow + 1, 1) .getValues() .flat() .filter(val => val !== ""); // 去重并按日期升序排序(统一清除时分秒避免判断误差) var uniqueDates = [...new Set(dateValues.map(d => { const date = new Date(d); date.setHours(0, 0, 0, 0); return date; }))].sort((a, b) => a - b); // 取最后两个日期作为保留对象 var keepDates = uniqueDates.slice(-2); // 从下往上遍历行,避免隐藏行导致的行号偏移 for (var i = lastRow; i >= startRow; i--) { var cellDate = new Date(sheet.getRange(i, 1).getValue()); cellDate.setHours(0, 0, 0, 0); // 不在保留列表的行就隐藏 if (!keepDates.some(d => d.getTime() === cellDate.getTime())) { sheet.hideRows(i); } } }
关键逻辑说明
- 提取表格实际日期:不再依赖系统日期,完全从你的A列数据中获取日期
- 去重排序:确保拿到所有唯一的日期,并按时间顺序排列,方便取最后两个
- 统一日期格式:清除所有日期的时分秒,避免因单元格里的时间部分导致判断错误
- 反向遍历:从最后一行往上遍历,防止隐藏行后后续行号错乱
内容的提问来源于stack exchange,提问作者raphaelsword
相关产品推荐
相关产品推荐

