Dataviewjs的奇技淫巧


用大佬给的代码生产成的热力图是没有标记的,很奇怪…
感觉好像date并没有识别出page.key的日期,显示不正确。

你不修改一下文件夹名吗,还是你也有名叫 200-主笔记 的文件夹

1 个赞


哇塞!成功啦!大佬太牛了,我还在奇怪为什么要用200减去主笔记呢 :joy: 不好意思,纯小白…
谢谢大佬!

非常感谢~再此基础上进行改造开发了自己想要的功能

麻烦大神,这段代码我想去掉“and #日记”这个条件,实现表格形式汇总小标题下内容,但尝试了一下,会报错。

实在不懂代码,希望大神指点。

噢,这段代码有bug,如果没有对应标题就会出错

```dataviewjs
const term = "日常记录"
const files = dv.pages(`"600-日常"`).sort(p=>p.file.name)
let a = []
for(let i of files) {
    let x = await app.vault.readRaw(i.file.path);
    x = x.split(/^#+ /m).find(p=>p.startsWith(term));
    if(!x) continue
    a.push([i.file.name, x.split('\n').slice(1).join('\n')])
}
dv.table(['文件名', term],a)
```

不过有个更好的代码在这
关于日记自定义日期文件名、代办任务排序、内容聚合等问题 - 疑问解答 - Obsidian 中文论坛

非常完美,谢谢:pray:

感恩,大佬这种二次渲染的做法真的给了好多灵感,js小白一点点看例子东平西凑弄了一个每日创建文件的热力图(排除日志),也贴出来抛砖引玉一下

dv.span("### **🗄️ 每日创建文件 🗄️**")
const calendarData = { 
	year: 2023, 
	intensityScaleStart: 0,
    intensityScaleEnd: 10,
	colors: { 
		green: [
            "hsl(65, 83%, 88%)",
            "hsl(70, 77%, 78%)",
            "hsl(80, 62%, 72%)",
            "hsl(95, 52%, 66%)",
            "hsl(112, 45%, 61%)",
            "hsl(125, 43%, 56%)",
            "hsl(132, 41%, 49%)",
            "hsl(132, 45%, 43%)",
            "hsl(132, 49%, 36%)",
            "hsl(132, 54%, 29%)", 
            "hsl(132, 59%, 24%)",
        ]
	}, 
	entries: [] 
} 

for(let page of dv.pages('"Periodic Note"')){ 
	let color = "green" 
	let intensity = dv.pages('!"Periodic Note"').where(p =>p.file.cday.toISODate()==page.file.name).file.array().length
// 排除日志,这样有日志而未创建文件会显示为0,而无日志直接不显示(默认只要有工作当天必有日志)

	calendarData.entries.push({ 
		date: page.file.name, 
		color: color, 
		intensity: intensity,
		content: await dv.span(`[${intensity}](${page.file.name}.md#🗄️%20当天创建的文件清单)`),
		// 预览修改为段落引用
	}) 
} 

renderHeatmapCalendar(this.container, calendarData) 

感谢大佬详尽教学,想请问大佬这「呈现」上有没有可能用 JS 实现? :sweat_smile:

●情境:
人员 A 和 B 针对不同的案子有不同的负责内容,
在有多个案子的状况下,希望有一区块能一次呈现人员负责的工作内容分别是哪些案子。

●YAML的纪录方式:
案子 : 旺旺牛奶
人员A : 撰写文章、制作推图
人员B : 文章排版

●呈现:希望案子是像下面这样集合在一个栏内,而不是每个案子都必须一列一列地显示,并且每个案子之间能自动用 " 、" 分开。

人员 A

工作内容 案子
撰写文章 旺旺牛奶、晶晶果冻
撰写推文 花花洗发水
制作推图 旺旺牛奶、花花洗发水

人员 B

工作内容 案子
文章排版 旺旺牛奶

这样应该可以

```dataviewjs
let files = dv.pages().filter(p=>p.案子)
for(let i=0;i<26;i++) {
	let field = '人员'+String.fromCharCode(65+i)
	let d={}
	files.forEach(file=>file[field]?.split('、').forEach(p=>d[p]?d[p].push(file.案子):d[p]=[file.案子]))
	if(Object.keys(d)==0) continue
	dv.header(2,field)
	dv.table(
		['工作内容','案子'],
		Object.entries(d).map(p=>[p[0],p[1].join('、')])
	)
}
```
1 个赞

感谢大佬, 有成功实现!但不好意思前面没有讲清楚
我本来想试着自己改改看,但JS实在太难了…TT

●想调整最终呈现效果是这样:
(人员的名字不是规律性,抱歉我范例没有做好)

【文章 A 的 yaml】
案子 : 旺旺牛奶
陈小明 : 撰写文章、制作推图
王阿娇 : 文章排版

【文章 B 的 Dataviewjs 呈现】

陈小明

工作内容 案子
撰写文章 旺旺牛奶、晶晶果冻
撰写推文 花花洗发水
制作推图 旺旺牛奶、花花洗发水

(这里中间还需要安插其他东西,所以不同人员希望是分两块 dataviewjs 代码块)

王阿娇

工作内容 案子
文章排版 旺旺牛奶



【并想加问可能增加这 1 个功能吗】
呈现表格上的「案子」内容(即旺旺牛奶等),可能自动带入文章连结吗?在 dataview 上可以使用 link(file.link, 案子),但 JS 不知道怎么转换?

好吧, 看来是我搞错了,按你新发的帖子重写了一下

```dataviewjs
let files = dv.pages().filter(p=>p.菜名)
console.log(files)
let d=[]
for(let p of files) {
	p.file.link.display=p.菜名
	d.push({link:p.file.link,name:p.菜名,非常喜欢:p?.非常喜欢,不喜欢:p?.不喜欢})
}
let target = '陈大'
dv.header(2,target+'饮食喜好表')
dv.table(
	['程度','菜名'],
	[['非常喜欢',d.map(p=>{if(p.非常喜欢?.split('、').includes(target)) return p.link}).filter(p=>p).join('、')],
	 ['不喜欢',d.map(p=>{if(p.不喜欢?.split('、').includes(target)) return p.link}).filter(p=>p).join('、')]]
)
```
1 个赞

感谢大佬一次解决我两个需求! :joy: :joy: :joy:
将两组代码对照调整了一下,上面「案子类」需求也解决了!

只是带入连结的那段琢磨不懂,另外找了一种写法

```dataviewjs
let files = dv.pages().filter(p=>p.案子)
for(let i=0;i<1;i++) {
	let field = '陈小明'
	let d={}
	files.forEach(file=>file[field]?.split('、').forEach(p=>d[p]?d[p].push("[[" + file.file.path + "|" + file.案子 + "]]"):d[p]=["[[" + file.file.path + "|" + file.案子 + "]]"]))
	if(Object.keys(d)==0) continue
	dv.header(2,field)
	dv.table(
		['工作内容','案子'],
		Object.entries(d).map(p=>[p[0],p[1].join('、')])
	)
}

请教题主,能否使用dataview实现块状内容的聚合并且将这些内容进行排列,类似于gallery视图那样,具体的效果图就是这样

请教下,笔记的yaml写成如下,能正常返回数据

file:菜名: 麻辣猪蹄
非常喜欢: 小明
不喜欢: 二狗

但“非常喜欢”似乎不能有多个值,例如写成 非常喜欢: 小明,小华 ,就不会返回数据。

请问有解决办法吗?

你是想用上面的代码吗,那个代码是用 分割的

请问表格的样式是怎么设置的?我的表格样式还是默认的

大佬,请问一下 dataviewjs 能不能查询出当前笔记中所有高亮的内容呢?

```dataviewjs
//定义一个函数,接受一个markdown字符串作为参数
function extractHighlight(markdown) {
  //定义一个空数组,用来存放高亮部分
  let highlights = [];
  //定义一个正则表达式,匹配被==包裹的部分
  let regex = /==(.+?)==/g;
  //定义一个变量,用来存放正则表达式的匹配结果
  let match;
  //使用循环,遍历所有的匹配结果
  while (match = regex.exec(markdown)) {
    //把匹配结果中的第一个捕获组(也就是高亮部分)添加到数组中
    highlights.push(match[1]);
  }
  //返回数组
  return highlights.filter(p=>p!='(.+?)');
}

dv.list(extractHighlight(await app.vault.readRaw(dv.current().file.path)))
```

提一嘴,你敢相信上面那个函数是 newbing 生成的吗 :joy:,太离谱了

谢谢!确实可以诶!
new bing有点强,相比之下chatGPT就显得跟智障一样,这是它给我的回答 :joy: