使用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对象即使代表的时间完全相同,也是内存中不同的对象引用,==比较的是对象的引用地址而非实际时间值,因此筛选条件永远不成立,导致没有数据输出。
此外还有两处次要问题:
getSheetById(0)不可靠:工作表ID通常不是0,建议通过工作表名称获取更稳定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
相关产品推荐
相关产品推荐

