我是22年中开始在 Obsidian 中写日记的,记录了大半年后,发现周期性复盘时仍需要去一篇篇翻看,着实耽误时间,而日记的内容却又是比较固定的分类(工作、学习、生活、大事件、感触),所以就在想怎么能把本周或本月在工作、生活上完成的事情自动聚合在相应分类下,便于复盘时的回顾。
最终,通过 Obsidian 中的 Dataview 插件解决了这个问题。正好最近有朋友也有类似的问题,所以就决定把自己的方法分享出来。
最终效果
每天正常写日记,在复盘页面中自动对日记中的内容进行分类汇总查看。
实现步骤
下面我以月度复盘为例讲一下具体怎么实现的,周度和年度的,都是类似的方法,稍微调整下最后的代码即可
日记的配置
- 创建日记,按不同维度设置标题,比如:工作、生活、学习、大事件…
- 每篇日记的不同维度的标题格式需要保持一致,可以直接设置统一的模板,这样每次创建出来的就
复盘页的配置
-
建立一个复盘笔记
- 每个维度下的内容是通过 DataviewJS 进行查询自动生成的
- 每个维度下的内容是通过 DataviewJS 进行查询自动生成的
-
粘贴具体的代码到笔记中
- 一段代码只会检索一个维度下的内容,上方的图中有多个维度,需要粘贴多段代码,配置完后,每次仅需要替换月份即可
- 将下面的代码复制到复盘笔记中,记得把开头改成```dataviewjs
//定义一个月份,查询这个月份的数据
let month=6
let year=2024
//定义一个变量,用于按此变量查询笔记中的具体标题:输入目标小标题(含#),例如:#### 项目进度条
const header = '#### 工作'
// 定义一个用于变量,用于存储指定范围内的笔记:按月份筛选笔记,并按修改时间降序排列
const pages = dv.pages('"日记"').where(b => moment(b.file.name).year()==year&&moment(b.file.name).month()==(month-1)).sort(p=>dv.date(p.file.name),"desc");
// 定义一个正则表达式,用于后续匹配指定笔记中的指定内容:某个笔记中从指定标题到下一个标题/横线/文章结尾的所有内容
const regex = new RegExp(`\n${header}\r?\n(.*?)(\n#### |\n---|$)`, 's')
//对所有查询出来的页面提取指定内容并显示出来
for (const page of pages) {
//根据查询到的笔记获取对应的文件
const file = app.vault.getAbstractFileByPath(page.file.path)
// 读取文件正文
const contents = await app.vault.read(file)
// 获得正文中的指定内容
const summary = contents.match(regex)
//显示指定内容
//显示空结果:if (summary) {
//不显示空结果:if (summary && summary[1].trim()) {
if (summary && summary[1].trim()) {
// 显示对应文件链接,或者用这个也行dv.header(2, '[[' + file.basename + ']]')
dv.span("**"+page.file.link+"**")
//显示对应正文内容
dv.paragraph(summary[1].trim())
}
}
- 粘贴之后,对如下的几处地方进行调整,这里以4级标题的工作为例,具体情况请自行修改