如何修改Google Sheets脚本以仅保留最后两个录入日期的行?
修改脚本实现隐藏除最后两个录入日期外的行
你的需求是替换原脚本中“今日/昨日”的判断逻辑,改为保留表格内最后两个录入的日期对应的行,同时优化脚本运行效率,以下是具体实现:
优化后的脚本
function hideRows() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheet = ss.getSheetByName("Example"); const lastRow = sheet.getLastRow(); // 只取A列有数据的范围(第9行到最后一行),避免空行浪费资源 const dateRange = sheet.getRange(9, 1, lastRow - 8, 1); const dateValues = dateRange.getValues().flat(); // 转换为一维数组 // 从后往前遍历,收集唯一的日期,直到拿到最后两个 const uniqueDates = new Set(); for (let i = dateValues.length - 1; i >= 0; i--) { const date = new Date(dateValues[i]); // 处理有效日期,排除空值 if (!isNaN(date.getTime())) { // 统一日期格式(去除时分秒),避免同一日期因时间不同被重复统计 const normalizedDate = new Date(date.setHours(0, 0, 0, 0)).toString(); uniqueDates.add(normalizedDate); if (uniqueDates.size === 2) break; } } // 先取消所有行的隐藏,避免重复运行时出现异常 sheet.showRows(9, lastRow - 8); // 收集需要隐藏的行号 const rowsToHide = []; for (let i = 0; i < dateValues.length; i++) { const currentDate = new Date(dateValues[i]); if (!isNaN(currentDate.getTime())) { const normalizedCurrent = new Date(currentDate.setHours(0, 0, 0, 0)).toString(); if (!uniqueDates.has(normalizedCurrent)) { // 行号是第9行 + 当前索引 rowsToHide.push(i + 9); } } } // 批量隐藏行,减少服务端调用次数,提升效率 if (rowsToHide.length > 0) { // 将连续的行合并,进一步优化 let startRow = rowsToHide[0]; let rowCount = 1; for (let i = 1; i < rowsToHide.length; i++) { if (rowsToHide[i] === rowsToHide[i - 1] + 1) { rowCount++; } else { sheet.hideRows(startRow, rowCount); startRow = rowsToHide[i]; rowCount = 1; } } // 处理最后一组连续行 sheet.hideRows(startRow, rowCount); } }
关键逻辑说明
- 提取最后两个唯一日期:从后往前遍历日期列,用
Set自动去重,收集到2个唯一日期后停止,确保拿到的是最新录入的两个日期。 - 日期归一化:将所有日期的时分秒设为0,避免同一日期因记录时的时间差异被误判为不同日期。
- 批量操作优化:
- 只读取有数据的范围,而非整列,减少数据处理量;
- 先收集所有需要隐藏的行号,再合并连续行批量隐藏,大幅减少对SpreadsheetApp服务端的调用次数(逐行调用是低效的主要原因);
- 每次运行先显示所有行,避免重复运行时出现行状态混乱。
内容的提问来源于stack exchange,提问作者raphaelsword
相关产品推荐
相关产品推荐

