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

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);
    }
  }
}

关键逻辑说明

  1. 提取表格实际日期:不再依赖系统日期,完全从你的A列数据中获取日期
  2. 去重排序:确保拿到所有唯一的日期,并按时间顺序排列,方便取最后两个
  3. 统一日期格式:清除所有日期的时分秒,避免因单元格里的时间部分导致判断错误
  4. 反向遍历:从最后一行往上遍历,防止隐藏行后后续行号错乱

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 17:32:03