Templater插件详细指南

Obsidian Templater 插件 - 高级模板与脚本自动化完全指南

#resource / obsidian #type / howto #status / evergreen

Templater 插件详细指南

核心功能:基于 JavaScript 的高级模板引擎,支持动态内容、变量替换、脚本自动化
难度级别:⭐⭐⭐⭐
推荐指数:⭐⭐⭐⭐⭐
必装程度:必装(自动化必备)


📋 快速导航


功能概览

核心特性

功能说明使用场景
变量替换自动填充日期、标题、选中文本等快速创建结构化笔记
JavaScript 脚本编写自定义逻辑与自动化复杂的笔记生成
条件语句if/else 逻辑判断动态内容选择
循环for/while 循环生成重复内容批量生成列表项
函数调用调用 Node.js API高级自动化
用户输入交互式输入提示动态参数收集

Templater vs Obsidian 原生模板

特性Obsidian 模板Templater
日期变量⭐⭐⭐⭐⭐⭐⭐
自定义脚本⭐⭐⭐⭐⭐
JavaScript⭐⭐⭐⭐⭐
条件判断⭐⭐⭐⭐
用户交互⭐⭐⭐⭐
学习成本中-高

安装与配置

安装插件

  1. 打开社区插件浏览器

    • Settings → Community plugins → Browse
  2. 搜索并安装

    • 搜索 “Templater”
    • 点击 Install → Enable
  3. 允许执行脚本

    • Settings → Templater → 勾选”Script files folder location”

基础配置

Settings → Templater

# 模板文件夹路径
Template folder location: "templates"

# 快捷键
Trigger templater: Alt+E (从当前笔记触发)
Open insert template modal: Alt+T (打开模板选择)

# 脚本文件夹(可选)
Script files folder location: "scripts"

# 输出路径
Trigger template in active file: 

# 其他选项
System command timeout: 5 (秒)
Empty file template: (可选,新文件默认模板)

基础用法

内置变量

变量说明示例
{{date}}当前日期2025-12-08
{{date:YYYY-MM-DD}}自定义日期格式2025-12-08
{{time}}当前时间14:30:45
{{title}}笔记标题My Note
{{file_name}}文件名my-note
{{file_path}}文件路径z/my-note.md
{{file_folder}}文件夹路径z/

简单模板示例

创建文件 templates/article.md

---
title: "{{title}}"
created: {{date:YYYY-MM-DD HH:mm:ss}}
updated: {{date:YYYY-MM-DD HH:mm:ss}}
tags:
  - 
---

# {{title}}

> 一句话总结

## 导读

## 内容

## 总结

---

标签:#draft

使用方法

1. 打开命令面板:Ctrl+P
2. 搜索:Templater: Create new note from template
3. 选择 article.md
4. 输入笔记标题
5. 自动生成笔记,日期和标题已填充

高级特性

1. JavaScript 变量

语法<% js 代码 %>

# <% tp.file.title %>

创建时间:<% tp.date.now("YYYY-MM-DD HH:mm") %>
最后修改:<% tp.file.creation_date("YYYY-MM-DD") %>
文件夹:<% tp.file.folder("") %>

2. 条件判断

<% if (tp.file.title.includes("日记")) { %>
## 每日反思
- 今天的收获:
- 明天的计划:
<% } else { %>
## 标准笔记结构
## 背景
## 内容
## 总结
<% } %>

3. 循环生成

## 本周任务

<% for (let i = 1; i <= 7; i++) { %>
- [ ] 周<% 
  const days = ['一', '二', '三', '四', '五', '六', '日'];
  %><%= days[i-1] %>的任务
<% } %>

4. 用户输入提示

<% 
  const author = await tp.system.prompt("作者名称");
  const category = await tp.system.prompt("内容分类");
%>

---
author: <% author %>
category: <% category %>
---

5. 文件操作

最近修改的文件:
<% 
  const recent = await tp.system.listFiles("z/");
  const sorted = recent.sort((a, b) => 
    tp.file.creation_date(b) - tp.file.creation_date(a)
  );
%>
<% for (let i = 0; i < 5; i++) { %>
- [[<% sorted[i] %>]]
<% } %>

6. 插入其他模板

# 主模板

<% await tp.file.include("[[templates/header]]") %>

主体内容...

<% await tp.file.include("[[templates/footer]]") %>

常用脚本示例

脚本 1:自动生成日记

templates/daily.md

---
title: "{{date:YYYY-MM-DD}} 日记"
created: {{date:YYYY-MM-DD HH:mm:ss}}
type: "daily"
mood: ""
tags:
  - daily
  - {{date:YYYY-MM}}
---

# <%+ tp.date.now("YYYY-MM-DD dddd") %>

> 每日反思与总结

## 📅 今日计划

- [ ] 任务 1
- [ ] 任务 2
- [ ] 任务 3

## 📝 今日日志

### 上午

### 下午

### 晚上

## 💡 今日灵感

- 想法 1
- 想法 2

## 📊 今日数据

- 完成任务: ? / 3
- 学习时间: ? 小时
- 阅读时间: ? 分钟

## 🎯 明日重点

- 

## 📌 反思

> 今天最大的收获是什么?

---

**心情**: <%+ await tp.system.prompt("今天的心情 (😊/😐/😢)") %>

脚本 2:文章模板(带目录)

templates/article.md

---
title: "<%+ await tp.system.prompt("文章标题") %>"
author: "Your Name"
date: <%+ tp.date.now("YYYY-MM-DD") %>
updated: <%+ tp.date.now("YYYY-MM-DD") %>
category: "<%+ await tp.system.prompt("分类 (Tech/Life/Reading)") %>"
tags:
  - <%+ await tp.system.prompt("标签 (用逗号分隔)") %>
status: "draft"
---

# <%+ tp.file.title %>

> <%+ await tp.system.prompt("一句话总结") %>

## 导读

## 正文

### 

## 总结

---

**相关链接**
- [[]]

脚本 3:获取最近笔记列表

templates/recent-notes.md

# 最近修改的笔记

<% 
  const files = await tp.system.listFiles("z/");
  const mdFiles = files.filter(f => f.endsWith('.md'));
  const sorted = mdFiles
    .map(f => ({
      name: f.replace('.md', ''),
      path: `z/${f}`
    }))
    .slice(0, 10);
%>

<% for (let file of sorted) { %>
- [[<% file.name %>]]
<% } %>

脚本 4:动态链接插入

templates/with-links.md

---
title: "<%+ tp.file.title %>"
created: <%+ tp.date.now("YYYY-MM-DD") %>
related:
  - 
---

# <%+ tp.file.title %>

<% 
  const relatedPrompt = await tp.system.prompt(
    "相关文件 (用逗号分隔)"
  );
  const related = relatedPrompt
    .split(',')
    .map(s => s.trim())
    .filter(s => s.length > 0);
%>

## 相关笔记

<% for (let note of related) { %>
- [[<% note %>]]
<% } %>

API 参考

tp.date(日期操作)

tp.date.now("YYYY-MM-DD")           // 当前日期
tp.date.now("HH:mm:ss")             // 当前时间
tp.date.now("dddd")                 // 星期几 (Monday)
tp.date.now("ddd")                  // 星期几 (Mon)
tp.file.creation_date("YYYY-MM-DD") // 创建日期
tp.file.last_update_date("YYYY")    // 最后修改日期

tp.file(文件操作)

tp.file.title                   // 文件标题
tp.file.path("relative")        // 相对路径
tp.file.folder("relative")      // 文件夹路径
tp.file.name("include_extension") // 文件名
tp.file.exists("path")          // 检查文件是否存在

tp.system(系统交互)

await tp.system.prompt("提示文本")        // 用户输入
await tp.system.listFiles("folder")      // 列出文件夹
await tp.system.suggester(array, items)  // 下拉选择

tp.obsidian(Obsidian API)

await tp.obsidian.getActiveFile()        // 获取当前文件
await tp.obsidian.getActiveView()        // 获取当前视图
await tp.obsidian.existsOpenFile("path") // 检查文件是否打开

常见问题

Q1:如何调试脚本错误?

打开开发者工具

Settings → About → 检查"Show performance" 和"Enable debug mode"
View → Toggle Developer Tools (Ctrl+Shift+I)

查看错误

点击 Console 标签页,查看错误信息
通常会显示第几行出错

Q2:如何在脚本中获取用户输入?

<% 
  const input = await tp.system.prompt("请输入内容");
  if (!input) {
    // 用户取消
  }
%>
用户输入了:<% input %>

Q3:如何在脚本中读取其他文件内容?

const vault = tp.obsidian.app.vault;
const file = await vault.getAbstractFileByPath("path/to/file.md");
const content = await vault.read(file);

Q4:如何生成随机内容?

<% 
  const quotes = [
    "坚持就是胜利",
    "每天进步一点点",
    "生活就是实验"
  ];
  const random = quotes[Math.floor(Math.random() * quotes.length)];
%>

今日鸡汤:<% random %>

Q5:脚本太复杂,怎么办?

拆分成多个函数

<% 
  function getGreeting() {
    const hour = new Date().getHours();
    if (hour < 12) return "早上好";
    if (hour < 18) return "下午好";
    return "晚上好";
  }
  
  const greeting = getGreeting();
%>

<% greeting %>,祝你有美好的一天!

Q6:如何实现动态日期(相对日期)?

<% 
  const today = tp.date.now("YYYY-MM-DD");
  const tomorrow = new Date();
  tomorrow.setDate(tomorrow.getDate() + 1);
  const tomorrowStr = tp.date.now(
    "YYYY-MM-DD", 
    tomorrow
  );
%>

今天:<% today %>
明天:<% tomorrowStr %>

最佳实践

  1. 模板放在独立文件夹

    templates/
    ├── article.md
    ├── daily.md
    ├── reading.md
    └── project.md
  2. 为模板添加标准元数据

    ---
    template_type: "article"
    version: 1.0
    ---
  3. 使用提示收集信息

    避免硬编码的值,使用 prompt 让用户输入
  4. 测试脚本

    创建一个测试笔记,验证模板正确运行
  5. 记录脚本说明

    在模板顶部添加注释,解释各个变量的用途

📚 相关文档


创建于 2025/12/8 更新于 2026/5/27