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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 18:57:34