【DV脚本】三合一的最近笔记展示脚本

给自己的 DailyNote 更新了「最近笔记」模块,分享一下。

注意:我自己单独维护了创建时间和修改时间的元数据,所以使用的是 row["create_date"] 属性。如果你想用默认的创建时间/修改时间,把元数据属性替换成 ctimemtime 即可。

旧版

原先的版本,使用了三个 Dataview 块:

Source:


### Created
```dataview
TABLE WITHOUT ID
	link(file.name, title) as "笔记",
	dateformat(row["create_date"], "HH:mm") as 创建时间
FROM -"PeriodicNote/Daily" AND -"_global" AND -"网络摘录"
WHERE dateformat(row["create_date"], "yyyy-MM-dd") = this.file.name
SORT row["create_date"] asc
LIMIT 20
```

### Modified
```dataview
TABLE WITHOUT ID
	link(file.name, title) as "笔记",
	dateformat(row["modified_date"], "HH:mm") as 修改于
FROM -"PeriodicNote/Daily" AND -"_global"
WHERE dateformat(row["modified_date"], "yyyy-MM-dd") = this.file.name AND dateformat(row["create_date"], "yyyy-MM-dd") != this.file.name
SORT row["modified_date"] asc
LIMIT 30
```

### Collected
```dataview
TABLE WITHOUT ID
	link(file.name, title) as "笔记",
	dateformat(row["create_date"], "HH:mm") as 创建时间
FROM "网络摘录"
WHERE dateformat(row["create_date"], "yyyy-MM-dd") = this.file.name
SORT row["create_date"] asc
LIMIT 20
```

新版

新版,用一个 JS 文件直接搞定,三个内容都显示在一起:

Source:

```dataviewjs
dv.view('recentNotesInDaily')
```

Markdown 文件里只需要加载对应的 JS 视图即可。

对应的 JS 文件:

// ========================================
// 作者:Moy
// 日期:2024.08.05
// 版本:1.0.0
// ========================================

// 注意:该脚本只在文件名为 yyyy-MM-dd 日期格式(如 2024-08-05)的笔记内有效
// 如果你的 DailyNote 有别的命名格式,自行下方的 yyyy-MM-dd
const curNoteName = dv.current().file.name;
const dateFormat = "yyyy-MM-dd"

// 配置搜索的范围,如果有需要排除的文件夹就加在这儿
const pages = dv.pages('-"PeriodicNote/Daily" AND -"_global" AND -"网络摘录"');

// 显示的笔记数量限制
const displayNoteLimit = 20;

const createdToday = pages.filter(p => p.create_date && dv.date(p.create_date).toFormat(dateFormat) == curNoteName);
const modifiedToday = pages.filter(p => p.modified_date && dv.date(p.modified_date).toFormat(dateFormat) == curNoteName && dv.date(p.create_date).toFormat(dateFormat) != curNoteName);

if (createdToday.length + modifiedToday.length == 0) {
  dv.paragraph(`今天(${curNoteName})暂时没有创建或修改过任何笔记 ⏰`)
  return;
}

// 创建的笔记
if (createdToday.length > 0) {
  dv.header(2, "Created")
  dv.table(["笔记", "创建时间"], 
        createdToday
          .sort(p => p.create_date)
          .slice(0, displayNoteLimit)
          .map(p => [
              // dv.fileLink(p.file.name, p.title),
              p.title?`[[${p.file.name}|${p.title}]]`:p.file.link,
              dv.date(p.create_date).toFormat("HH:mm")
          ])
  )
}

// 修改的笔记(会排除掉今天创建的笔记)
if (modifiedToday.length > 0) {
  dv.header(2, "Modified")
  dv.table(["笔记", "修改时间"], 
        modifiedToday
          .sort(p => p.modified_date)
          .slice(0, displayNoteLimit)
          .map(p => [
              // dv.fileLink(p.file.name, p.title),
              p.title?`[[${p.file.name}|${p.title}]]`:p.file.link,
              dv.date(p.modified_date).toFormat("HH:mm")
          ])
  )
}

// 我自己用的特殊目录,如果用不到的话可以不管这部分(删掉也行)
const collectedPages = dv.pages('"网络摘录"').filter(p => p.create_date && dv.date(p.create_date).toFormat(dateFormat) == curNoteName);

if (collectedPages.length > 0) {
  console.log(collectedPages)
  dv.header(2, "Collected")
  dv.table(["笔记", "采集时间"], 
      collectedPages
        .sort(p => p.create_date)
        .slice(0, displayNoteLimit)
        .map(p => [
            // dv.fileLink(p.file.name, p.title),
            p.title?`[[${p.file.name}|${p.title}]]`:p.file.link,
            dv.date(p.create_date).toFormat("HH:mm")
        ])
  )
}

Gist 页面: recentNotesInDaily.js (github.com)

改进点

  1. 在缺少显示内容时,占用页面更小,更美观

在缺少笔记显示的情况下,差别也很明显:

  1. 加载更快,体感老版每次都会让页面卡顿一下,新版的比较丝滑。

  2. 新版的脚本能保持「一致性」——使用的都是同一个 js 文件,如果做了修改或者更新,所有页面的内容都能同步更新。
    老版的是用模板写死的,就一直固定是那个效果了。

3 个赞

是否可以说下怎么使用?逛了下论坛,发现好多方案太不友好了,上来就是代码,好歹说下怎么用啊。。。。

这是 Dataview 插件的代码查询块。

你需要:

  1. 在 Obsidian 内安装 Dataview 插件
  2. 在插件设置里,勾选脚本功能:
  3. 把脚本块粘贴进 Obsidian笔记里

具体的可以看教程: Dataview | obsidian文档咖啡豆版

原来是直接放到新建文档里面去,天啊,我一直在找该放到设置项里面的哪个地方。感谢解答。
另外


这里的js是怎么理解,直个recentNotesInDaily对应在哪里?下面的js文件放到哪个位置?

这部分算是进阶用法了,除了直接在 markdown 里写 dataviewjs 代码的内容,也可以把代码放在单独的一个 脚本.js 文件里,然后用:

dv.view("脚本")

去执行对应脚本的结果。

至于具体的文件位置,只要在库内就没问题,你可以专门创建一个用来放置脚本的文件夹。

除了上面这样用脚本文件名来指定,也可以写成完整的路径:

dv.view("脚本文件夹/脚本.js")

具体可以看 DV 插件的文档: Codeblock Reference - Dataview


也可以问问 AI,现在 Deepseek 级别的 AI 你说明上下文(“Obsidian 的 Dataview 插件……”)基本都能解答的。

例如:

OK.感谢,明白了,这个笔记上手的确有难度

是刚开始使用吗?
如果是的话,我会建议先别太过深入了解 dataview 这类进阶用法,容易走偏。
最好是先用基础功能和少量插件,写个几十篇笔记,有自己大概结构之后,再考虑拓展这些部分。

因为 OB 的拓展性和可玩性确实很高,一不留神容易陷入“玩插件花的时间比记笔记还多”的情况(

昨天刚通过脚本给有道的笔记迁移到了ob,这几天在测试思源,notion,ob。感觉ob最终符合需求,就是太折腾了,功能太多了。现在想着怎样让ob的markdown显示得效果类似notion

OB 像是自助餐,可选的菜品(功能)很多,但如果都想尝试的话一定会吃撑。
先从自己需要的那部分开始吃起,其他的等用到再慢慢拓展,这样会比较容易些。

功能多不代表都得用上嘛,还是从自身需求出发 :]