Dataviewjs的奇技淫巧

比如显示未完成代办事项且不包括本文件中的代办事项

task
where !completed and file.name != this.file.name

我想筛选出一段时间内的笔记。因此在YAML区设置了creationTime(格式为“YYYY-MM-DD HH:mm” )、Startdate和Enddate(格式为“YYYY-MM-DD”),过滤语句为const files = app.vault.getMarkdownFiles().filter(f => (moment(f.creationTime).format(‘YYYY-MM-DD’) >= moment(dv.current().Startdate.ts).format(‘YYYY-MM-DD’)) && (moment(f.creationTime).format(‘YYYY-MM-DD’) <= moment(dv.current().Enddate.ts).format(‘YYYY-MM-DD’))),但是检索不到任何结果。应该怎么修改呢?

你这样弄错了,单纯比较大小不用格式化成字符串

const files = dv.pages().filter(f => f.creationTime.ts >= dv.current().Startdate.ts && f.creationTime.ts <= dv.current().Enddate.ts)

出错了。

“Evaluation Error: TypeError: Cannot read properties of undefined (reading ‘ts’)”

好吧,看起来不是所有笔记都有creationTime,导致访问出错了

const files = dv.pages().filter(f => f.creationTime?.ts >= dv.current().Startdate?.ts && f.creationTime?.ts <= dv.current().Enddate?.ts)

出错了。

“Evaluation Error: TypeError: Cannot read properties of undefined (reading ‘ts’)”

完整代码只有这一行吗,单这一行不可能报错,顶多没有结果

应该是这个原因导致出错。我把creationTime改成了file.cday,错误提示没有了,变成了啥都没有的一个空白行。

const files = dv.pages().filter(f => f.creationTime && f.creationTime.ts >= dv.current().Startdate.ts && f.creationTime.ts <= dv.current().Enddate.ts)

这样呢,这样还会报相同的错就奇怪了

其他代码就是用的 Obsidian 插件之 Dataview - 知乎 (zhihu.com)中“ 输出所有带有标签的文件名以及对应行且形成表格”部分的代码。现在想增加限制,筛选出某一时间段的文件。

我说呢,你咋不按dvjs的套路来写,起手一个 app.vault.getMarkdownFiles()

这样改之后错误提示没了,留下一个空白行。

用app.vault.getMarkdownFiles()也是一样的毛病

let files_p = dv.pages().filter(f => f.creationTime && f.creationTime.ts >= dv.current().Startdate.ts && f.creationTime.ts <= dv.current().Enddate.ts).map(p=>p.path)

// 修改标签
const tag = "#active"
// 获取 Obsidian 中的所有 Markdown 文件
const files = app.vault.getMarkdownFiles().filter(p=>files_p.includes(p.path))
// 将带有标签的文件筛选出来
const taggedFiles = new Set(files.reduce((acc, file) => {
    const tags = app.metadataCache.getFileCache(file).tags
    if (tags) {
      let filtered = tags.filter(t => t.tag === tag)
      if (filtered) {
        return [...acc, file]
      }
    }
    return acc
}, []))

// 创建带有标签的行数组
const arr = Array.from(taggedFiles).map(async(file) => {
  const content = await app.vault.cachedRead(file)
const lines = await content.split("\n").filter(line => line.includes(tag))
return [file.name, lines]
})

// 生成表格
Promise.all(arr).then(values => {
dv.table(["file", "lines"], values)
})

现在不出错,但是什么都没找到,提示“No results to show for table query.”

啊这,好像又漏了点东西

let files_p = dv.pages().filter(f => f.creationTime && f.creationTime.ts >= dv.current().Startdate.ts && f.creationTime.ts <= dv.current().Enddate.ts).map(p=>p.file.path)

还是No results to show for table query.

这不对劲啊,我这好好的

还是日期格式惹的祸。

我的creationTime是“2023-10-16 23:30”这样的格式。如果写成“2023-10-16”,您给的代码就能起作用了。

那么,针对“2023-10-16 23:30”这样的格式,应该怎么修改代码呢?

这玩意最后还是字符串,说明luxon(dv引入的时间库)不能自动解析这种格式的字符串,换moment就行了

f.creationTime.ts 都换成 moment(f.creationTime).unix()