【已解决】Dataview能否查询并引用到特定小标题的链接?

我现在日志上的项目内容(关键节点)是通过 dataview 动态从项目文件里面抓的,主要是回顾今天有哪些项目更新过内容(关键节点)。

如果是在一个多项目的会议,我可能会另外建一个meeting note. 在这个meeting note里面通过连接,或者 dataview 将相关项目抓过来展示。这样会议期间的展示以meeting note 为主,需要讨论具体的项目时,就点击项目链接进入。

1 个赞

啊,怎么会有问题呢,是我的测试文件不一样吗

好了,我知道了,你的文件名的年是 4 位数,所以没检索出文件 :rofl:

```dataviewjs
let files = dv.pages().filter(p=>/日志-\d{2,4}年\d{1,2}月\d{1,2}日/.test(p.file.name))
let projects = {}
for(let i of files) {
    let content = await app.vault.readRaw(i.file.path)
    content = content.match(/#### \[\[(.*?)\]\] ?情况跟进 #工作\/进展/g)
    content = content.map(p=>/\[\[(.*?)\]\]/.exec(p))
    content.map(p=>projects[p[1]]?projects[p[1]].push(i.file.name):projects[p[1]]=[i.file.name])
}
for(let i in projects) {
    dv.paragraph('## '+i)
    dv.paragraph('### 情况跟进')
    dv.list(projects[i].map(p=>`[[${p}#${i}情况跟进 工作/进展]]`))
}
```
1 个赞

匈牙利大叔这个视频讲笔记组织方式的,对理清笔记的组织思路很有帮助。建议有空可以看看

重新思考我的PKM第5部分–你如何组织你的笔记?_哔哩哔哩_bilibili

1 个赞

:confounded:报错

能不能理解为本来在我日志笔记中的会议内容,单独成为了一个新的以会议为主的笔记?
在笔记头部设置Dataview的YAML信息,实现内容的抓取?
对Dataview了解不深刻,感觉特别像是把一个block变成了一个笔记。

诶,原来不是所有日志里都有这样的标题啊

```dataviewjs
let files = dv.pages().filter(p=>/日志-\d{2,4}年\d{1,2}月\d{1,2}日/.test(p.file.name))
let projects = {}
for(let i of files) {
    let content = await app.vault.readRaw(i.file.path)
    content = content.match(/#### \[\[(.*?)\]\] ?情况跟进 #工作\/进展/g)
    if(!content) continue
    content = content.map(p=>/\[\[(.*?)\]\]/.exec(p))
    content.map(p=>projects[p[1]]?projects[p[1]].push(i.file.name):projects[p[1]]=[i.file.name])
}
for(let i in projects) {
    dv.paragraph('## '+i)
    dv.paragraph('### 情况跟进')
    dv.list(projects[i].map(p=>`[[${p}#${i}情况跟进 工作/进展]]`))
}
```
1 个赞

对的。

我的理解,每个笔记应该尽量围绕同一个/同一类目的来记录或展示内容。比如:

  • 日志,记录或展示跟日期相关的内容,比如当天创建的笔记,当天有过更新的内容,当天完成的任务等
  • 项目笔记:记录或展示跟这个项目相关的所有信息
  • 会议笔记:记录或展示跟这次会议相关的所有信息

我现在在 Obsidian 写的笔记,基本可以做到在一个笔记文件记录,在其他笔记文件按需要连接/dataview 抓取过来展示

1 个赞

可以试下这个,看能否实现需求。用途:汇总【指定小标题下的全部内容】,包括task、列表、普通文本等

```dataviewjs
//输入目标小标题(含#),例如:#### 项目进度条
const header = '#### 小标题名称'

// 按【路径或文件夹、文件名、标签】筛选并按修改时间降序排列
const pages = dv.pages('"00数据管理" or ""').filter(p => p.file.name.includes("") && !p.file.path.includes("template")).filter(p => p.file.name.includes("") || p.file.name.includes("")).sort(p=>p.file.mtime,"desc");

// This regex will return text from the Summary header, until it reaches
// the next header, a horizontal line, or the end of the file
const regex = new RegExp(`\n${header}\r?\n(.*?)(\n#+ |\n---|$)`, 's')

for (const page of pages) {
    const file = app.vault.getAbstractFileByPath(page.file.path)
    // Read the file contents
    const contents = await app.vault.read(file)
    // Extract the summary via regex
    const summary = contents.match(regex)
    //显示全部包括空结果if (summary) {
    //不显示空结果if (summary && summary[1].trim()) {
    if (summary && summary[1].trim()) {
        // Output the header and summary
        dv.header(2, page.file.link)
        //或者dv.header(2, '[[' + file.basename + ']]')
        dv.paragraph(summary[1].trim())
    }
}
```
1 个赞

非常感谢!

抱歉昨天回复次数超限了,这个代码能够列出带链接的列表了,我对代码做了简单的修改,把具体项目筛选出来后,还是有2个小问题想再请教一下:

  1. 鼠标移至链接上时,预览窗口并没有定位至对应的小标题,这个和.task的预览不太一样(详见3.1 的图片)
  2. 日志链接是日期从早到晚的,这个能怎么处理调整成倒序吗?

再次感谢!

1 个赞

谢谢!

我研究一下~ :grinning:

你为啥要把标签删了嘞。。。

```dataviewjs
let files = dv.pages().filter(p=>/日志-\d{2,4}年\d{1,2}月\d{1,2}日/.test(p.file.name))
let projects = {}
for(let i of files) {
    let content = await app.vault.readRaw(i.file.path)
    content = content.match(/#### \[\[(.*?)\]\] ?情况跟进 #工作\/进展/g)
    if(!content) continue
    content = content.map(p=>/\[\[(.*?)\]\]/.exec(p))
    content.map(p=>projects[p[1]]?projects[p[1]].push(i.file.name):projects[p[1]]=[i.file.name])
}
for(let i in projects) {
    dv.paragraph('## '+i)
    dv.paragraph('### 情况跟进')
    dv.list(dv.array(projects[i])
	    .sort(p=>moment(/\d{2,4}年\d{1,2}月\d{1,2}日/.exec(p)[0],'YYYY年MM月DD日').valueOf(),'desc')
	    .map(p=>`[[${p}#${i} 情况跟进 工作/进展]]`))
}
```

另外我才发现标题里的链接在引用时和其他文本之间是有空格的,不管原文本里有没有空格

[[日志-2022年11月08日#ABC情况跟进 工作/进展]]  #我以为的
[[日志-2022年11月08日#ABC 情况跟进 工作/进展]] #实际的
1 个赞

感谢大神!!! :+1: :+1: :+1:

成功了!!! :tada: :tada: :tada:

```dataviewjs
let files = dv.pages().filter(p=>/日志-\d{2,4}年\d{1,2}月\d{1,2}日/.test(p.file.name)) 
let projects = {} 
for(let i of files) { 
	let content = await app.vault.readRaw(i.file.path) 
	content = content.match(/#### \[\[ABC\]\] ?情况跟进 #工作\/进展/g) 
	if(!content) continue 
	content = content.map(p=>/\[\[(.*?)\]\]/.exec(p)) 
	content.map(p=>projects[p[1]]?projects[p[1]].push(i.file.name):projects[p[1]]=[i.file.name]) 
} 
for(let i in projects) { 
	dv.paragraph('### 情况跟进') 
	dv.list(dv.array(projects[i])
	    .sort(p=>moment(/\d{2,4}年\d{1,2}月\d{1,2}日/.exec(p)[0],'YYYY年MM月DD日').valueOf(),'desc')
	    .map(p=>`[[${p}#${i} 情况跟进 工作/进展]]`)) }

最后还有一个问题想请教一下:
图片中我在测试时项目ABC的子标题中也有日期(右下角①位置),有没有什么方法能够将链接定位至这些带了日期的子标题(右下角①位置)呢?

再次感谢!!! :sparkles: :sparkles: :sparkles:

啊,为什么要这样写呢,日期不是已经在标题里了吗

明白,我可能是比较懒惰的类型···
我会以日志为主、ZK为辅来进行记录,有点像是在做个人wiki。
对于频繁使用的项目、人物、企业等等会有专门的文件夹来存放词条,但是更新频率很慢。
我是想尝试用Dataview来实现在这些词条中直接看到有关联的重要信息,预览或者跳转的需求就能满足我的使用。如果涉及到想要了解全部,会采取直接搜索的办法。
这样以来笔记会比较碎片化,后期不好进行整理。可能会成为我未来的很大困扰。
我会认真考虑一个主题的所有信息保存在一份笔记中的思路。

谢谢!

因为以前我查看这些内容是用笔记下方的反向链接或搜索看的,为了加快阅读查找速度,就在模板中添加了日期和周数的设置···
只是想请教一下是否有办法,如果很麻烦我觉得还是删除标题的日期信息更快 :grinning:

哎哟,不错,这个解决了我的需求!注释也很清晰,非常感谢!

这个非常有用,感谢

请问大神可以增加一个根据时间筛选的句子吗?想放到周记模版里,例如某一周的时间模版为:[[{{date:YYYY-MM-[W]ww}}]],希望筛选出本周内的七天日记,汇总其中的标题,请教大神怎么写?

如下是显示在AAA文件夹下BBB文件夹中,新增的7个笔记。

	LIST From "AAA/BBB" sort file.mtime desc limit (7)

其中:

  1. AAA/BBB为文件夹目录,例如你的日记文件夹叫做C,C文件夹直接存放在库里,那就把“AAA/BBB”整体替换为“C”;如果日记文件夹在库里的A文件夹中的S文件夹中,就把“AAA/BBB”替换成“A/S/C”。
  2. desc为降序,asc为升序。
  3. limit()中的数字代表着你要显示几个日志,填7就是7个,填5就是5个。
  4. 注意粘贴时代码前后的```和dataview。