Last active
June 18, 2025 23:26
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
put it in a
block