Skip to content

Instantly share code, notes, and snippets.

@keeth
Last active June 18, 2025 23:26
Show Gist options
  • Save keeth/ca931f55f4c0ae92d4eff54be17530da to your computer and use it in GitHub Desktop.
Save keeth/ca931f55f4c0ae92d4eff54be17530da to your computer and use it in GitHub Desktop.
Obsidian DataviewJS snippet to show task completion counts by day, week and month
const now = window.moment();
// === Helper: Group tasks by a time unit ===
function groupTasksByTimeframe(tasks, unit, format) {
return Array.from(tasks).reduce((acc, task) => {
const key = window.moment(task.completion.toJSDate()).startOf(unit).format(format);
console.log(key);
acc[key] = (acc[key] || 0) + 1;
return acc;
}, {});
}
// === Helper: Generate sorted table data from count object ===
function buildTableData(counts, label) {
return Object.entries(counts)
.sort((a, b) => b[0].localeCompare(a[0]))
.map(([key, count]) => [key, count ]);
}
// === Get All Completed Tasks ===
const tasks = dv.pages()
  .filter(p => p.file.tasks.length > 0)
  .flatMap(p => p.file.tasks)
  .filter(t => t.completion);
// === 1. Daily Stats (Past 10 Days) ===
const tenDaysAgo = now.clone().subtract(10, "days");
const dailyTasks = tasks.filter(t => window.moment(t.completion).isAfter(tenDaysAgo));
const dailyCounts = groupTasksByTimeframe(dailyTasks, "day", "YYYY-MM-DD");
const dailyTable = buildTableData(dailyCounts, "Date");
dv.header(2, "✅ Daily Completed Tasks (Past 10 Days)");
dv.table(["Date", "Tasks Completed"], dailyTable);
// === 2. Weekly Stats (Past 6 Weeks) ===
const sixWeeksAgo = now.clone().subtract(6, "weeks");
const weeklyTasks = tasks.filter(t => window.moment(t.completion).isAfter(sixWeeksAgo));
const weeklyCounts = groupTasksByTimeframe(weeklyTasks, "isoWeek", "YYYY-MM-DD");
const weeklyTable = buildTableData(weeklyCounts, "Week");
dv.header(2, "📅 Weekly Completed Tasks (Past 6 Weeks)");
dv.table(["Week", "Tasks Completed"], weeklyTable);
// === 3. Monthly Stats (Past 6 Months) ===
const sixMonthsAgo = now.clone().subtract(6, "months");
const monthlyTasks = tasks.filter(t => window.moment(t.completion).isAfter(sixMonthsAgo));
const monthlyCounts = groupTasksByTimeframe(monthlyTasks, "month", "YYYY-MM");
const monthlyTable = buildTableData(monthlyCounts, "Month");
dv.header(2, "🗓️ Monthly Completed Tasks (Past 6 Months)");
dv.table(["Month", "Tasks Completed"], monthlyTable);
@keeth
Copy link
Author

keeth commented Jun 18, 2025

put it in a

```dataviewjs
```

block

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment