如何在Google Apps Script中按年份值筛选日期列表格(按值而非条件筛选)
用Google Apps Script实现日期列按年份筛选
我来帮你搞定这个问题!手动操作时你是通过「按值筛选」勾选年份,用脚本实现的话,我们可以利用Google Sheets的筛选器API,通过限定日期范围来精准匹配目标年份(因为日期列实际存储的是完整日期,直接按年份值筛选不如范围筛选可靠)。
基础实现代码(单年份筛选)
下面是一个可直接使用的函数,你只需要传入工作表名称、目标列的位置(从1开始计数,比如A列是1,B列是2)和要筛选的年份:
function filterByYear(sheetName, targetColumn, targetYear) { // 获取当前活动表格 const ss = SpreadsheetApp.getActiveSpreadsheet(); // 定位目标工作表 const sheet = ss.getSheetByName(sheetName); if (!sheet) { throw new Error(`找不到名为${sheetName}的工作表`); } // 获取或创建筛选器 let filter = sheet.getFilter(); if (!filter) { // 如果工作表还没有筛选器,就创建一个(表头默认在第1行) filter = sheet.createFilter(); } // 构建目标年份的日期范围:比如2023年就是从2023-01-01到2024-01-01 const startDate = new Date(targetYear, 0, 1); // 月份从0开始,0代表1月 const endDate = new Date(targetYear + 1, 0, 1); // 创建筛选条件:包含startDate到endDate之间的日期(不包含endDate) const criteria = SpreadsheetApp.newFilterCriteria() .whenDateAfter(startDate) .whenDateBefore(endDate) .setIncludeDateAfter(true) .setIncludeDateBefore(false) .build(); // 将条件应用到目标列 filter.setColumnFilterCriteria(targetColumn, criteria); }
使用示例
比如你要筛选「销售数据」工作表的第3列(C列)中2023年的记录,直接在脚本编辑器里运行:
filterByYear("销售数据", 3, 2023);
扩展:筛选多个年份
如果需要同时筛选多个年份(比如2022和2023),可以通过组合多个日期范围条件来实现:
function filterByMultipleYears(sheetName, targetColumn, targetYears) { const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheet = ss.getSheetByName(sheetName); if (!sheet) throw new Error(`找不到名为${sheetName}的工作表`); let filter = sheet.getFilter() || sheet.createFilter(); const criteriaBuilder = SpreadsheetApp.newFilterCriteria(); // 为每个年份添加日期范围条件,用OR连接 targetYears.forEach(year => { const start = new Date(year, 0, 1); const end = new Date(year + 1, 0, 1); criteriaBuilder.addCriteria( SpreadsheetApp.newFilterCriteria() .whenDateAfter(start) .whenDateBefore(end) .setIncludeDateAfter(true) .setIncludeDateBefore(false) .build() ); }); filter.setColumnFilterCriteria(targetColumn, criteriaBuilder.build()); }
使用示例
筛选「销售数据」第3列的2022和2023年记录:
filterByMultipleYears("销售数据", 3, [2022, 2023]);
清除筛选
如果需要清除目标列的筛选条件,可以用这个函数:
function clearColumnFilter(sheetName, targetColumn) { const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheet = ss.getSheetByName(sheetName); if (!sheet) throw new Error(`找不到名为${sheetName}的工作表`); const filter = sheet.getFilter(); if (filter) { filter.removeColumnFilterCriteria(targetColumn); } }
注意事项
- 确保目标列是日期格式,而不是文本格式,否则筛选条件会失效。
- 脚本中的列位置是从1开始计数的(和Excel/Sheets的列编号一致)。
- 月份参数是从0开始的(0=1月,11=12月),这是JavaScript Date对象的特性,别搞错啦!
内容的提问来源于stack exchange,提问作者Philip Pappas
相关产品推荐
相关产品推荐

