Google Sheets中按特定条件统计唯一日期数的方法求助
统计符合条件的唯一日期数量的解决方法
以下是几种可行的实现方式,解决你遇到的公式和脚本失效问题:
方法1:使用COUNTUNIQUEIFS函数(最简方案)
这是Google Sheets中专门用于统计满足多条件的唯一值数量的函数,直接匹配你的需求:
=COUNTUNIQUEIFS(A:A, D:D, B:B)
如果需要限定数据范围(比如仅处理A2到D9的行),可以写成:
=COUNTUNIQUEIFS(A2:A9, D2:D9, B2:B9)
这个公式会直接返回「D列=B列」条件下,A列的唯一日期总数。
方法2:修正QUERY公式
你之前的QUERY公式错误地引用了E列(实际应该是D列),若要统计唯一日期数,需使用count(distinct A):
=QUERY(A2:D9, "select count(distinct A) where D = B label count(distinct A) ''")
如果需要按日期分组,显示每个日期对应的符合条件的记录数,修正条件后的公式为:
=QUERY(A2:D9, "select A, count(A) where D = B group by A")
方法3:高效的Apps Script实现
避免低效的逐行循环,改用批量数据处理的方式,同时正确处理日期去重:
function countQualifiedUniqueDates() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); const lastRow = sheet.getLastRow(); if (lastRow < 2) return; // 无数据时直接返回 // 批量读取A2到D列的所有数据 const data = sheet.getRange(2, 1, lastRow - 1, 4).getValues(); // 统计唯一日期总数 const uniqueDateSet = new Set(); data.forEach(row => { const [date, campaignName, , budget] = row; if (budget === campaignName) { // 将日期转为字符串,确保Set能正确去重(日期对象是引用类型) uniqueDateSet.add(date.toISOString().split('T')[0]); } }); // 将结果写入E2单元格(总唯一日期数) sheet.getRange(2, 5).setValue(uniqueDateSet.size); // 可选:如果需要列出每个日期及对应符合条件的记录数 const dateCountMap = {}; data.forEach(row => { const [date, campaignName, , budget] = row; if (budget === campaignName) { const dateStr = date.toISOString().split('T')[0]; dateCountMap[dateStr] = (dateCountMap[dateStr] || 0) + 1; } }); // 转换为可写入表格的格式,写入E2开始的区域 const resultRows = Object.entries(dateCountMap).map(([dateStr, count]) => [new Date(dateStr), count]); if (resultRows.length > 0) { sheet.getRange(2, 5, resultRows.length, 2).setValues(resultRows); } }
脚本说明:
- 批量读取数据比逐行读取效率高很多
- 用
Set处理日期去重时,必须将日期对象转为字符串(否则不同的日期对象会被视为不同值) - 可选逻辑支持输出每个日期的对应记录数
内容的提问来源于stack exchange,提问作者Laira Reeba Joseph
相关产品推荐
相关产品推荐

