【已解决】如何用dataviewjs汇总文件目录下所有一级标题下的 [[日常工作]]/[[项目A]]/[[项目B]]?

通过日记流水账方式零碎的记一些工作上的事,利用dataviewjs将标题汇总在相关标题的页面中,方便查看。

页面:2024年1月3日、2024年1月2日、2024年1月3日、日常工作、项目A、项目B

文件名:2024年1月1日
内容:

# [[日常工作]]
电话联系了谁谁谁。
干了什么什么。
- [ ] 记得打电话给谁谁谁说什么什么
# [[项目A]]
进度到了XX程度

预览效果:
image

文件名:2024年1月2日
内容:

# [[日常工作]]
电话联系了谁谁谁。
干了什么什么。
- [ ] 记得打电话给谁谁谁说什么什么
# [[项目A]]
进度到了完工程度

# [[项目B]]
开工了

预览效果:

文件名:2024年1月3日
内容:

# [[日常工作]]
电话联系了谁谁谁。
干了什么什么。
- [ ] 记得打电话给谁谁谁说什么什么

# [[项目B]]
进度到了完工程度

预览效果
image

文件名:日常工作
内容:


dv.pages('[[日常工作]]').sort(f => f.file.ctime ,'desc').forEach(p => {
dv.paragraph(dv.fileLink(p.file.name))
dv.paragraph(dv.fileLink(p.file.name+"#日常工作", true))
})


预览结果:

文件名:项目A
内容:


dv.pages('[[项目A]]').sort(f => f.file.ctime ,'desc').forEach(p => {
dv.paragraph(dv.fileLink(p.file.name))
dv.paragraph(dv.fileLink(p.file.name+"#项目A", true))
})


预览结果:

文件名:项目B
内容:


dv.pages('[[项目B]]').sort(f => f.file.ctime ,'desc').forEach(p => {
dv.paragraph(dv.fileLink(p.file.name))
dv.paragraph(dv.fileLink(p.file.name+"#项目B", true))
})


预览结果:
image

问题来了

看似全部汇总了,把流水日记中标题下的内容全部引用过来了.
但是
如果把文件 2024年1月3日里内容调整下

# [[日常工作]]
电话联系了谁谁谁。
干了什么什么。
- [ ] 记得打电话给谁谁谁说什么什么

# [[项目B]]
进度到了完工程度

改为

# [[日常工作]]
电话联系了谁谁谁。
干了什么什么。
- [ ] 记得打电话给谁谁谁说什么什么

# [[项目B]]
进度到了完工程度,要参照[[项目A]]的模式搞竣工决算

之所以用[[项目A]]这个字眼,是因为实际的项目名称会很长用到[]这个相当于是代码自动完成.减少输入错误和快速输入的目的
但是dataviewjs通过连接搜索到 [[项目A]],会生成一个![[2024年1月3日#项目A]],实际上文件2024年1月3日中没有 项目A 这个标题.等同于把无效信息拉取过来了,变成了![[2024年1月3日]]这种的结果,把整个2024年1月3日页面全部拉取过来了.


想到了通过dataviewjs来把不是包含 # [[XXX]] 的页面过滤掉.

1.通过修改项目A页面的内容为


dv.pages('[[项目A]]').sort(f => f.file.ctime ,'desc').forEach(p => {

    const file =await  app.vault.readRaw(p.file.path)
   
  
if (content.match(/\# \[\[项目A\]\]/) !=null){

dv.paragraph(dv.fileLink(p.file.name))
dv.paragraph(dv.fileLink(p.file.name+'#项目A', true))

}


})

const file =await app.vault.readRaw(p.file.path)
提示必须要在第一层使用 await 关键字.


const file = app.vault.readRaw(p.file.path)
提示 content没有match这个方法.

2.改用for循环.修改项目A页面的内容为



let files=dv.pages('[[项目A]]').sort(f => f.file.ctime ,'desc')

for(let i of files) { 

let content = await app.vault.readRaw(i.file.path)

if (content.match(/\# \[\[项目A\]\]/) !=null){

dv.paragraph(dv.fileLink(i.file.name))
dv.paragraph(dv.fileLink(i.file.name+'#项目A', true))

}

}


这样确实能排除掉 不是标题的 [[项目A]],但是双链变没了,变成了正文.
image

不知道是不是我做笔记的习惯需要改改还是代码没整明白,有大神帮忙看下的么,感激不尽!!!

还有用dataviewjs页面会加载 2次 3次的,通过console.log看到的.不知道是什么原因.

1 个赞

请问,问题可否简化为“汇总文件目录下所有一级标题 [[日常工作]]/[[项目A]]/[[项目B]]…”

用正则匹配汇总自然会有这样的问题。

建议用读取元数据的方式汇总,参 DataviewJS 汇总全文及特定标题下内容并解决图片显示痛点“汇总标题下内容”。该引出帖代码会更新,请使用最新代码。

以汇总一级标题 [[项目A]] 为例。

首行 term 改为 term = '[[项目A]]'

因为你要获取一级标题,p.level == 2 改为 p.level == 1,下面的 fc[j]?.level > 2 改为 fc[j]?.level > 1

不要动也不要删其他代码。若出现不显示,尝试刷新代码块或重启 Ob。

附测试成功截图:

汇总 [[项目A]]:image;汇总 [[项目B]]:image

1 个赞

谢谢,能提取出数据了,但是附件显示不出来,图片是裂开的,其他类型的文件只有个名字,没有链接起来

请提供必要信息。有无尝试刷新代码块或重启 Ob。

1 个赞

感谢 :kissing_heart:,解决掉了,我把代码做了下变更和简化,让他直接引用的。