obsidian dataview写年报:按标签分类汇总

发布时间 2023-12-23 22:40:59作者: liqinglucky

原文地址:https://www.cnblogs.com/liqinglucky/p/ob-dataview.html

使用场景

上次我们讲过用dataview写周报obsidian dataview写周报:统计一周内的文件 - liqinglucky - 博客园 (cnblogs.com)。现在考虑另一个场景,年底要写年报,将一年的工作汇总。但通常不是像周报那样只是简单的罗列,还需要按照不同的项目内容分类汇总。这种情况就可以通过obsidian dataview按照每个文件的标签分类统计。

被统计文件的格式要求

参考:Adding Metadata - Dataview (blacksmithgu.github.io)
同样按之前的文章中的方法创建的三个工作文件,但使用了不同的标签。

工作任务1.md

---
type: 工作任务
issueId: issue-001
theme: 任务:写项目计划
status: 完成
createTime: 2023-12-16               
finishTime: 2023-12-16
tags:
  - 项目1                   <<< 标签 
---

工作任务2.md工作任务3.md采用相同的属性和标签。

--
type: 工作任务
issueId: issue-002
theme: 任务:查资料
status: 完成
createTime: 2023-12-23
finishTime: 2023-12-23
tags:
  - 项目1                        <<< 标签 
  - 调研
---

工作按项目统计

关键问题是我想把工作任务按项目关键词分类。首先是针对不同的文件使用不同的标签,这里我有两类标签项目1标签和项目1,调研标签。我期望的是能把不同标签的任务放一起。

方案1:按照tags排序显示

使用排序语法

SORT tags ASC

代码:

TABLE
tags as "项目", issueId as "编号", theme as "任务", createTime as "启动时间", finishTime as "完成时间"

WHERE type = "工作任务" AND createTime >= date(today) - dur(12 month)

SORT tags ASC

效果:

之前提到过,dataview的最小单元是文件,所以一个文件是占一行的。这种方式把相同标签的放相邻行。

方案2:按照tags分组显示

为了让相同的项目内容可以更集中,可以使用分组语法

GROUP BY file.etags

但这里要注意,分组后,为了让两个文件的同一属性合并在同一行。需要使用语法:

rows.属性

TABLE格式

代码:

TABLE 
rows.issueId, rows.theme as "任务", rows.createTime as "启动时间", rows.finishTime as "完成时间", rows.file.link as "文件"

WHERE type = "工作任务" AND createTime >= date(today) - dur(12 month)

GROUP BY file.etags as "项目"

效果:

这样相同标签的就集中到一行了。

LIST格式

代码:

LIST  rows.theme

where type = "工作任务" AND createTime >= date(today) - dur(3 month)
//sum函数使得条目扁平化
GROUP BY sum(file.etags)

效果:

方案3:按照tags分表显示

更进一步,想按不同项目标签分不同的表格。研究了官方给的用例Codeblock Examples - Dataview (blacksmithgu.github.io)。使用dataviewjs 可以达到效果,有兴趣的就可以学习下JavaScript语法。
示例代码:

for (let group of dv.pages("#项目1").groupBy(p => p.tags)) {  
    dv.header(3, group.key);  
    dv.table(["Name", "文件时间", "任务"],  
        group.rows  
            .sort(k => k.file.cday, 'desc')  
            .map(k => [k.file.link, k.file.cday, k.theme]))  
}

效果: