公式 - Obsidian 中文帮助公式允许你在[[Bases 简介|数据库]]中使用其他[[属性]]的数据创建计算属性。你可以执行计算、处理文本、操作日期等。
## 公式能做什么
公式可以帮助你:
- **计算数值**,相加价格、计算总额或执行数学运算。
- **处理文本**,合并字符串、更改大小写或提取子字符串。
- **操作日期**,计算时间差、格式化日期或确定截止日期。
- **应用逻辑**,使用条件语句来显示不同的值。
- **处理列表**,筛选、排序、映射或聚合列表数据。
## 创建公式属性
要创建公式属性:
1. 在你的数据库中,点击工具栏中的**笔记属性**。
2. 点击菜单底部的**添加公式**。
3. 为公式属性输入名称。
4. 在**公式**字段中输入你的公式。
5. 关闭对话框。
公式编辑器会在你输入时自动补全[[函数]]和属性名称,以验证公式语法。当公式有效时,会显示一个绿色勾号。
创建后,你可以像使用数据库中的其他属性一样使用公式属性。将其添加到[[视图]]中,在筛选中使用它,按它排序等。
## 编写公式
在公式编辑器中,使用属性、运算符和函数输入表达式。
### 引用属性
你可以在公式中引用不同类型的属性:
- **笔记属性** — 来自笔记[[属性|前置元数据]]的属性。
- **文件属性** — 内置属性,如 `file.name`、`file.size` 或 `file.mtime`。
- **公式属性** — 使用 `formula.formula_name` 引用其他公式。
**示例:**
- `price * quantity` — 将两个笔记属性相乘
- `file.name + " - " + description` — 将文件名与笔记属性组合
- `formula.price_per_unit * 1.1` — 使用另一个公式属性
### 使用运算符
**算术运算符**对数字执行数学运算:
- `price + tax` — 加法
- `price - discount` — 减法
- `price * quantity` — 乘法
- `price / quantity` — 除法
- `(part / whole) * 100` — 使用括号控制运算顺序
**比较运算符**比较值:
- `price > 100` — 大于
- `age < 18` — 小于
- `status == "Done"` — 等于
- `status != "Done"` — 不等于
- `file.mtime > now() - '7d'` — 比较日期
**布尔运算符**组合逻辑条件:
- `!completed` — 非
- `price > 0 && quantity > 0` — 且
- `urgent || important` — 或
在[[Bases 语法#运算符|数据库语法]]中了解更多。
### 使用函数
函数对值执行操作。可用的函数取决于你正在处理的值的类型。请参阅完整的[[函数]]列表。
**常见函数类别:**
- **全局函数** — `if()`、`now()`、`date()`、`link()`、`max()`、`min()`
- **字符串函数** — `contains()`、`replace()`、`split()`、`lower()`、`title()`
- **数字函数** — `round()`、`ceil()`、`floor()`、`abs()`、`toFixed()`
- **日期函数** — `format()`、`relative()`、`date()`、`time()`
- **列表函数** — `filter()`、`map()`、`sort()`、`join()`、`unique()`
**示例:**
- `if(price, "
quot; + price.toFixed(2), "")` 定义带有数字格式化的条件。
- `file.name.lower()` 转换为小写。
- `tags.contains("urgent")` 检查标签列表是否包含某个值。
- `due_date.format("YYYY-MM-DD")` 格式化日期。
## 公式示例
### 计算截止日期
将项目的截止日期设为开始日期后的 2 周:
```js
start_date + "2w"
```
### 显示逾期状态
如果截止日期已过且状态不是"Done",则显示"Overdue":
```js
if(due_date < now() && status != "Done", "Overdue", "")
```
### 格式化货币
以 2 位小数和货币符号显示价格:
```js
if(price, "quot; + price.toFixed(2), "")
```
### 计算列表项数
计算列表属性中的项目数量:
```js
tasks.length
```
### 计算优先级分数
将多个因素组合为优先级分数:
```js
(impact * urgency) / effort
```
### 合并文本字段
从名和姓创建全名:
```js
first_name + " " + last_name
```
### 计算总费用
将月费用乘以拥有的月数:
```js
monthlyUses * formula.Owned.round()
```
## 数据类型
公式可以处理不同类型的数据:
- **字符串** — 用引号括起来的文本:`"hello"` 或 `'world'`
- **数字** — 数值:`42`、`3.14`、`(2 + 2)`
- **布尔值** — 真或假:`true`、`false`
- **日期** — 使用 `date()`、`today()` 或 `now()` 创建
- **列表** — 值的集合:`[1, 2, 3]`
- **对象** — 键值对:`{"name": "value"}`
公式的输出类型由所使用的数据和函数决定。
## 引用其他公式
公式可以引用其他公式,创建派生计算。例如,如果你有一个名为 `price_per_unit` 的公式:
```js
price / quantity
```
你可以在另一个公式中引用它:
```js
formula.price_per_unit * 1.1
```
> [!warning] 避免循环引用
> 公式不能直接或通过其他公式间接引用自身。