关于日记自定义日期文件名、代办任务排序、内容聚合等问题

第一个,desc 应该是有效的,不知道你是怎么写的
第二个就不知道了是什么原因了,至少在我自己的库里是没有问题的

能看一下你修改的代码吗

我就是修改了 dv.pages("文件夹") 里面的文件夹路径为我自己的路径,然后

await HeaderAggregation(files,['重要事项:','今日感悟:'])

这里换成了我自己的标题。改成了

await HeaderAggregation(files,['感悟与思考'])

这样的,就会报错。
不过已经在论坛其他大佬的帮助下搞定了,他教的代码是这样:

```dataview
table 
    L.text as 感悟和思考, 
    L.link as 链接
from "30-Life/每日笔记"
flatten file.lists as L
where 
    !L.parent and
    meta(L.section).subpath = "感悟和思考" and
    dateformat(date(file.link), "yyyy-'W'WW") = this.file.name   
这样是没问题的

那挺好,我就是好奇这个报错是怎么来的,没见过这个报错 :rofl:,不过经过测试发现缺了第二个双引号可以触发这样的报错

感谢大佬!正好需要!不过输出可以改成表格吗?不是很懂代码,尝试修改了几次都还没达到效果,请问方便指导一下怎么修改吗?

```dataviewjs
let files = dv.pages(`"600-日常/日记"`)
HeaderAggregation(files,['日程安排','日常记录'])

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)
            content = content.split(/^#+ /m).find(p=>p.startsWith(headers[i]))
            contents.push(content?.slice(headers[i].length)??'')
        }
        if(contents.every(p=>p.replace(/\s+/,'')=='')) return
        return [file.file.link,...contents]
    }))
    d=d.filter(p=>p)
    dv.table(['name',...headers],d)
}
```
1 个赞

成功了!感谢作者!

大佬,用了你这段代码发现一个问题
截取的内容下,如果再出现下级标题,则无法识别到了

亦即

## 重要事项
### 哈哈
真好笑
### 嘿嘿
悄悄的笑

则上述 二级标题 重要事项 下的内容,都无法提取出来

确实是这样,因为这段代码的逻辑是切分每一个标题,不管它是多少级,这会导致 重要事项 的内容到 哈哈 就停止了

```dataviewjs
let files = dv.pages(`"600-日常/日记"`)
HeaderAggregation(files,['日程安排','日常记录'])

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]))
            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(['name',...headers],d)
}
```

很奇怪,使用你这段代码,复制进去是正常的,可以看到已经实现了对应的内容(出现了dateview的表头)。
但是,将600-日常/日记修改为自己的目录,好像就连表头都显示不出来了
看了一下报错是这样的

我去,我又忘记设计当文件没有这个标题时的处理了

```dataviewjs
let files = dv.pages(`"600-日常/日记"`)
HeaderAggregation(files,['日程安排','日常记录'])

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(['name',...headers],d)
}
```

1 个赞

完美!谢谢
:grinning: :grinning: :grinning:

大佬 ,求助 :sob:
关于如何利用 dataviewjs 跨文件聚合memos的记录

memos 总是以这样的方式 插入日记文件中
image

官方定义

image

这个简单,我也用memos,只是不明白为什么要这样搞,memos里不是已经聚合了吗

```dataviewjs
let files = dv.pages(`"600-日常/日记"`) // 填入日记的文件夹或是标签
for(let file of files) {
	let content = await app.vault.readRaw(file.file.path)
	content = content.split('\n').filter(p=>/^- \d\d:\d\d /.exec(p.trim()))
	if(content.length!=0) {
		dv.header(2,file.file.link)
		dv.paragraph(content.join('\n'))
	}
}
```

大佬! 谢谢 ,代码可用!

是这样的,我把任务列表和memos 都记录在日记里
然后每周我做这样的复盘时, 抽取text ,会把这两个混在一起
所以我就想着把两个分开,大佬见笑了,是我太拙劣了 :rofl: :rofl:
image

大佬 我刚发现 memos 里自带检索式这种功能
我真是太拙劣了 :joy: :joy:

想问大佬,有没有办法改dataview里列的列宽啊……我用您的代码来聚合文献笔记,效果非常好,就是表格宽度太窄了导致单元格变得很长,读起来有点困难……
先谢谢大佬!

大佬你好,有个小问题想请教一下你:我的日记命名格式是”YYYY-MM-DD_dddd“,Calendar中周记的命名格式是”yyyy-[第]ww[周]“。因为有的日记的任务会被提前指派,所以日记不一定是当天创建的。所以想问一下这样的话如何在周记中根据日记的名称汇总当周7天的日记文件内指定标题下的内容呢?

这样试试

```dataviewjs
const weekDates = [];
const currentDate = moment();
const currentWeek = currentDate.week();
const currentYear = currentDate.year();

for (let i = 0; i < 7; i++) {
  const date = moment().year(currentYear).week(currentWeek).weekday(i);
  weekDates.push(date.format('YYYY-MM-DD_dddd'));
}

let files = dv.pages(`"600-日常/日记"`).filter(p=>weekDates.includes(p.file.name))
HeaderAggregation(files,['日程安排','日常记录'])

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(['name',...headers],d)
}
```

感谢大佬回复,不过修改套用后出现了查询不到内容的问题,这是我的文件情况,代码仅修改了红框里的内容: