Obsidian 插件篇 -Dataview 联合 Templater 脚本示例
来源
- 触发点:在学习 Dataview 与 Templater 插件后,尝试结合使用,记录此文
- 首次记录:2025-02-21
- 作者:huan
洞见
Dataview 和 Templater 两个插件在 Obsidian 的插件市场中都举足轻重,那么联动后起到的作用自然是 1+1>2 的。本篇文章主要介绍 Dataview 联合 Templater 的使用。研究的不多,只收集却没有深入验证,以下是具体的脚本内容。
详情
📌 提示:以下代码中用
js作为语言标识,以避免本地自动执行。若要在 Obsidian 中测试运行,请将代码块的标识从```js改为```dataviewjs。
Dataview 联合 Templater
-
步骤
- 同时安装了 Templater 以及 Dataview ,并启用。
- 将代码放在模板文件中,用 Templater 调用这个模板即可。
-
预期效果
- 可以快速输出包含搜索关键词的文件,且生成表格,以下为对应的代码。
<%* const query = await tp.system.prompt("请输入要搜索的关键词"); if (!query) return; const escapedQuery = query.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); -%> ## 搜索结果:“<%- query %>" ```js const query = "<%- escapedQuery %>"; const files = app.vault.getMarkdownFiles(); dv.paragraph("🔍 搜索关键词: " + query); dv.paragraph("📂 扫描文件数: " + files.length); const results = []; const MAX_RESULTS = 50; for (const file of files) { if (file.path === "<%- tp.file.path(true) %>") continue; try { const basename = file.basename; const cache = app.metadataCache.getFileCache(file); const frontmatter = cache?.frontmatter; const id = frontmatter?.id ?? ""; const matchInName = basename.toLowerCase().includes(query.toLowerCase()); const matchInId = id.toString().toLowerCase().includes(query.toLowerCase()); if ((matchInName || matchInId) && results.length < MAX_RESULTS) { const displayId = id ? String(id) : ""; results.push([`[[${file.path}]]`, displayId]); } } catch (e) { console.warn("处理文件失败:", file.path, e); } } dv.paragraph("✅ 匹配文件数(预估): ≥" + results.length); if (results.length === 0) { dv.paragraph("❌ 未找到文件名或 id 包含 \"" + query + "\" 的笔记。"); } else { if (results.length === MAX_RESULTS) { dv.paragraph(`⚠️ 结果较多,仅显示前 ${MAX_RESULTS} 条。`); } dv.table(["文件", "id"], results); }
演化日志
- v0.1 (2025-02-21):初始版本
- v0.2 (2025-03-13):增删内容,润色笔记语句
- v0.3 (2025-10-27):补充来源、洞见、详情、演化日志、待办事项,完善笔记结构
- v0.4 (2025-10-27):重写示例脚本并验证正确性
待办事项
- 发掘更多 Dataview 与Templater 插件结合的需求,提高效率。