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

如何修改Obsidian Dataview示例代码实现年度主题进度条?

如何修改Obsidian DataviewJS代码实现年度主题进度追踪?

需求背景

我想要在Obsidian中创建进度条,用于追踪年度内不同主题的进展。查阅了相关教程但理解不清晰,希望明确需要修改哪些内容来实现目标。

教程提供的示例代码

(await dv.tryQuery('TASK FROM "Test" ')).values.length
const Tasks = dv.page("Test").file.tasks

let CompletedTasks = Tasks
    .where(t => t.completed)

dv.span(
    "![progress](https://progress-bar.dev/"
    + parseInt((CompletedTasks.length / Tasks.length) * 100)
    + "/)"
)

示例任务列表

- [ ] Quest 1
- [ ] Quest 2
- [ ] Quest 3
- [ ] Quest 4
- [ ] Quest 5

需要修改的核心内容

1. 替换任务页面的名称

代码里的"Test"是存放任务的页面文件名,你需要把两处"Test"替换成自己实际用来存放年度主题任务的页面名称,比如"2024年度目标"。

2. 按主题筛选任务(多主题场景)

如果你的任务页面里包含多个主题的任务,需要给任务添加标识(比如标签#学习、#健身),然后修改代码筛选对应主题的任务:

// 筛选带#学习标签的任务
const Tasks = dv.page("2024年度目标").file.tasks.where(t => t.tags.includes("#学习"))

let CompletedTasks = Tasks.where(t => t.completed)

dv.span(
    "![学习进度](https://progress-bar.dev/"
    + parseInt((CompletedTasks.length / Tasks.length) * 100)
    + "/)"
)

重复这段代码并修改标签,就能为每个主题生成单独的进度条。

3. 避免无任务时的报错

如果页面暂时没有任务,原代码会因为除以0报错,添加判断逻辑即可解决:

const Tasks = dv.page("2024年度目标").file.tasks
let completionRate = 0

if (Tasks.length > 0) {
    const CompletedTasks = Tasks.where(t => t.completed)
    completionRate = parseInt((CompletedTasks.length / Tasks.length) * 100)
}

dv.span(
    "![年度总进度](https://progress-bar.dev/"
    + completionRate
    + "/)"
)

4. 自定义进度条的标识文本

把代码里的![progress]替换成对应主题的名称,比如![健身进度],这样鼠标悬停时能直观看到进度对应的主题。

内容的提问来源于stack exchange,提问作者roybatty

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 02:58:25