dataview 统计列计每日清单

来自 关于日记自定义日期文件名、代办任务排序、内容聚合等问题 - 疑问解答 - Obsidian 中文论坛 的解决方案

在dailynotes文件夹里,按标题统计,和你的需求不完全一致,不过应该也能达到目的吧

```dataviewjs 
let files = dv.pages(`"DailyNotes"`) 
HeaderAggregation(files,['标题1','标题2']) 

async function HeaderAggregation(files,headers) { 
	let d = await Promise.all(files.map(async function(file) { 
		let contents = [] 
		for(let i in headers) { 
			let content = await app.vault.readRaw(file.file.path) 
			let header = content.match(/^#+ .*$/mg) 
			if(!header) return 
			header = header.map(p=>[p.split(' ')[0].length,p.slice(p.split(' ')[0].length+1)]) 
			content = content.split(/^#+ /m) 
			let index = header.indexOf(header.find(p=>p[1]==headers[i])) 
			if(index==-1) continue 
			let num = [] 
			for(let j =index+1;header[j]&&header[j][0]>header[index][0];j++) num.push(header[j]); 
			let c = content.find(p=>p.startsWith(headers[i])) 
			for(let j=0;header[index+1+j] && j<num.length;j++) 
				c+='#'.repeat(header[index+1+j][0])+' '+content.find(p=>p.startsWith(header[index+1+j][1]))
			contents.push(c?.slice(headers[i].length)??'') 
		}
		if(contents.every(p=>p.replace(/\s+/,'')=='')) return 
		return [file.file.link,...contents] 
	})) 
	d=d.filter(p=>p) 
	dv.table(['标题',...headers],d) 
} 
1 个赞