Obsidian dataviewjs 查詢多 kanban 中的 list

使用情境

  • 使用 Obsidian、安裝 kanban plugin
  • 有多個不同主題的 kanban
  • 每個 kanban 依據 status 分 list,有名稱為 WIP 的 list
  • kanban 的檔名固定為 [主題] Kanban

想達成的目的

在 daily note 或 homepage 顯示所有 kanban 的 WIP list 內容,可以一眼看出目前有哪些正在進行的事項。

迷之音:為什麼不直接用 todo list 就好?

這算是我自己的習慣,todoist 是我每天會開來看有什麼今天得做的事情的 todo list app,拿來放生活瑣事、做完勾掉通常不會回去翻的待辦事項,像是洗衣服、買日常用品等等。todoist 不放偏向「有目標、維持性或比較像 project」的事情,像是自己的 side project、正在閱讀的書籍等等。

嘗試過用 todoist 來管理 side project,但不習慣在 todo list 寫筆記,而且完成勾掉後預設顯示是隱藏、之後不太會想到到 todo list app 翻筆記。後來改用看板管理這類型的事項,發現用得還算順手,因為我自然而然在兩種模式下開啟「待辦清單」,一是有時效性的「我今天得做什麼?」,二是有段空檔時想知道「最近正在進行些什麼?挑個來繼續吧!」,這兩種模式剛好對應到 todoist 跟看板。

Obsidian 使用 dataviewjs query

看板系統我一開始先用 trello,最近用起 obsidian 也就裝了 kanban plugin,因為有換換病跟搬搬病也就把 trello 的東西搬到 obsidian。

我有兩個主要看板,分別是 side project 跟生活中要持續的事,兩個看板都有一個 WIP 清單,表示「正在做」事項。用了幾天想有個統一的地方可以一次看到兩個看板的 WIP 清單內容,於是邊跟 Sonar 聊天邊寫出了下面這段 dataviewjs query:

1
2
3
4
5
6
7
8
9
10
11
12
let pages = dv.pages(); 

for (let page of pages) {
const filePath = page.file.path;
const markdownContent = await dv.io.load(filePath);
const wipSectionRegex = /(?:^|\n)##\s*WIP[^\n]*\n(.*?)(?=\n##\s|\n#\s|$)/gs;
const wipContent = markdownContent.match(wipSectionRegex);

if (wipContent) {
dv.paragraph(wipContent[0].replace(/^## WIP$/gm, `### ${filePath.slice(5, -10)}`));
}
}

就能顯示出多個 kanban 的內容:

須注意的是放這個 script 的 note 不能有 ## WIP,否則整個 obsidian 一開該 note 就會當掉。我懷疑是因為會 infitie loop,但我沒有證據 aka 還懶得深究。解法簡單粗暴:用一般編輯器打開 obsidian 那個 note,把 ## WIP 改掉即可。

這 script 偏 hard code,在不同前提下需要修改才能使用,像是不叫 WIP 的話 regex 要改、用來替換的 heading 3 字串 slice() 位置也要修改。