如何用插件简单地批量添加元数据?

遇到的问题

如何用obsidian内的插件或机制修改或添加元数据?
我用的metaedit插件似乎主要用来修改单个笔记的元数据,如果是选中多个笔记,就没有此功能。如果使用ctrl+p打开Metaedit,也是只能修改
其实也不是没有办法用metaedit插件修改多个笔记的方法:只要将所有要修改元数据的笔记放到一个文件夹里,然后右键就能弹出来一个“将YAML属性添加到此文件(及子文件)中的所有文件"的选项,这样子才行。这么反人类的操作不是不行,只是想到我每次都得来这么一遍,就十分的不爽。去找了找有没有人开发了插件,惊讶地发现除了一个22年的已经停止维护的插件https://forum-zh.obsidian.md/t/topic/5948,就没有此类其他插件了,当然也可能是我没找到。

预期的效果

我希望的是选中的几个文件,然后操作给每个笔记添加一个相同的YAML 属性值
这个功能肯定是可以做到的,metaedit有一个api,不知道有没有用,使用quickadd也行

已尝试的解决方案

其实我是会通过Trae这种AI代码工具的,理论上写个批量修改的脚本也不难,我只单纯觉得这样实在太麻烦了,感觉这也不是没人用的功能,唯一符合要求的插件,批量添加的功能居然这么反人类。这才是让我惊讶的一点
当然了,最简单的做法就是使用templater在创建的时候就用模板,但这就不符合我的要求了,我要添加元数据的笔记还挺多的

1 个赞

一个解决方案

步骤1:多选目标笔记

步骤2:向右拖动笔记到当前文件,生成目标笔记列表的字符串

步骤3:复制字符串,在控制台输入命令

const str = `[[A 马克思主义、列宁主义、毛泽东思想、邓小平理论]]
[[C 社会科学总论]]
[[F 经济]]`

步骤4:输入如下的命令

function getTargetFiles(str){
    const files = app.vault.getFiles()
    const targetFiles = str.split("\n").map(line=>{
        const path = DataviewAPI.parse(line).path;
        const file = files.find(f=>f.path.endsWith(path+".md"))
        return file;
    })
    return targetFiles;
}

const createYamlProperty = app.plugins.plugins.metaedit.api.createYamlProperty;

getTargetFiles(str).forEach(targetFile=>{
    createYamlProperty("属性名","属性值", targetFile)
})

结果:成功批量添加了元属性(属性名: 属性值)

补充:如果反悔了,可运行如下代码可批量删掉元属性(更高明的操作是使用Git版本管理回滚变化)

getTargetFiles(str).forEach(targetFile=>{
    app.fileManager.processFrontMatter(targetFile, (frontmatter)=>{
        delete frontmatter["属性名"]
    })
})

谢谢,我就使用这个插件就可以了