公式 - Obsidian 說明公式讓你可以在[[資料庫介紹|資料庫]]中使用其他[[屬性]]的資料來建立計算屬性。你可以執行運算、處理文字、操作日期等。
## 公式能做什麼
公式可以幫助你:
- **計算數值**,加總價格、計算總額或執行數學運算。
- **處理文字**,組合字串、更改大小寫或擷取子字串。
- **操作日期**,計算時間差、格式化日期或確定截止日期。
- **套用邏輯**,使用條件判斷式來顯示不同的值。
- **處理清單**,篩選、排序、對應或彙總清單資料。
## 建立公式屬性
要建立公式屬性:
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` — 或
在[[資料庫語法#運算子|資料庫語法]]中深入了解。
### 使用函式
函式對值執行操作。可用的函式取決於你正在處理的值的類型。請參閱完整的[[函式]]清單。
**常見函式類別:**
- **全域函式** — `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] 避免循環參照
> 公式不能直接或透過其他公式間接參照自身。