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

使用Google Apps Script按日期筛选数据失效问题排查

问题排查:Google Apps Script筛选日期无输出

问题背景

在Google Sheet的首个工作表「main」中,包含A列(KPI ID)、B列(*Business Unit Name)、C列(Payment Terms)、D列(Transaction Date)数据,已确认Transaction Date为Date类型。尝试用Google Apps Script筛选2025年1月13日的数据,但执行日志无任何输出,该方法此前在其他样本数据中可行。

样本数据

KPI ID  *Business Unit Name Payment Terms   Transaction Date
b10001  MyCo    30 days net 1/13/2025
b10002  MyCo    30 days net 1/13/2025
b10003  MyCo    30 days net 1/13/2025
b10004  MyCo    30 days net 1/13/2025
b10005  MyCo    60 days net 1/22/2025
b10006  MyCo    60 days net 1/22/2025
b10007  MyCo    30 days net 1/22/2025
b10008  MyCo    60 days net 1/22/2025
b10009  MyCo    30 days net 1/22/2025
b10010  MyCo    30 days net 1/22/2025

日期类型验证日志

8:42:49 AM  Notice  Execution started
8:42:50 AM  Info    Mon Jan 13 00:00:00 GMT+08:00 2025
8:42:50 AM  Info    Mon Jan 13 00:00:00 GMT+08:00 2025
8:42:50 AM  Info    Mon Jan 13 00:00:00 GMT+08:00 2025
8:42:50 AM  Info    Mon Jan 13 00:00:00 GMT+08:00 2025
8:42:50 AM  Info    Mon Jan 13 00:00:00 GMT+08:00 2025
8:42:50 AM  Info    Wed Jan 22 00:00:00 GMT+08:00 2025
8:42:50 AM  Info    Wed Jan 22 00:00:00 GMT+08:00 2025
8:42:50 AM  Info    Wed Jan 22 00:00:00 GMT+08:00 2025
8:42:50 AM  Info    Wed Jan 22 00:00:00 GMT+08:00 2025
8:42:50 AM  Info    Wed Jan 22 00:00:00 GMT+08:00 2025
8:42:50 AM  Info    Wed Jan 22 00:00:00 GMT+08:00 2025
8:42:50 AM  Info    Wed Jan 22 00:00:00 GMT+08:00 2025
8:42:50 AM  Info    Wed Jan 22 00:00:00 GMT+08:00 2025
8:42:50 AM  Info    Wed Jan 22 00:00:00 GMT+08:00 2025
8:42:50 AM  Info    Wed Jan 22 00:00:00 GMT+08:00 2025

原测试代码

const target_sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetById(0)

const t_header = target_sheet.getRange(1, 1, 1, 81).getValues()
let t_data = target_sheet.getRange(2, 1, target_sheet.getDataRange().getLastRow() - 1, 81).getValues()

const t_end_date = new Date(2025, 0, 13)

t_data.filter(row => row.slice(3, 4)[0] == t_end_date)
.forEach(row => Logger.log(row))

问题原因

核心问题是Date对象不能直接用==进行相等比较:
两个Date对象即使代表的时间完全相同,也是内存中不同的对象引用,==比较的是对象的引用地址而非实际时间值,因此筛选条件永远不成立,导致没有数据输出。

此外还有两处次要问题:

  1. getSheetById(0)不可靠:工作表ID通常不是0,建议通过工作表名称获取更稳定
  2. row.slice(3,4)[0]冗余:可以直接用row[3]获取D列数据(数组索引从0开始)

修复后的代码

// 通过工作表名称获取,比ID更可靠
const target_sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("main");
// 获取所有数据,包含表头
const allData = target_sheet.getDataRange().getValues();
// 定义目标日期
const targetDate = new Date(2025, 0, 13);

// 跳过表头(第一行),筛选匹配日期的数据
const filteredRows = allData.slice(1).filter(row => {
  const transactionDate = row[3];
  // 比较时间戳(毫秒数)判断日期是否相等
  return transactionDate.getTime() === targetDate.getTime();
});

// 输出筛选结果
filteredRows.forEach(row => Logger.log(row));

其他可选的日期比较方式

除了getTime(),还可以用以下方式:

  • 转换为数字:+transactionDate === +targetDate
  • 使用valueOf():transactionDate.valueOf() === targetDate.valueOf()

内容的提问来源于stack exchange,提问作者Ong K.S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 10:54:50