数式 - Obsidian ヘルプ数式を使うと、他の[[プロパティ]]のデータを使用して[[Basesの紹介|ベース]]で計算プロパティを作成できます。計算の実行、テキストの操作、日付の処理などが可能です。
## 数式でできること
数式は以下のことに役立ちます:
- **値を計算する** — 価格の加算、合計の計算、数学演算の実行。
- **テキストを操作する** — 文字列の結合、大文字小文字の変更、部分文字列の抽出。
- **日付を扱う** — 日付の差の計算、日付のフォーマット、期限の算出。
- **ロジックを適用する** — 条件文を使って異なる値を表示。
- **リストを処理する** — リストデータのフィルタリング、並べ替え、マッピング、集計。
## 数式プロパティの作成
数式プロパティを作成するには:
1. ベースで、ツールバーの**プロパティ**をクリックします。
2. メニューの下部にある**数式を追加**をクリックします。
3. 数式プロパティの名前を入力します。
4. **数式**フィールドに数式を入力します。
5. ダイアログを閉じます。
数式エディタは、入力中に[[関数]]やプロパティ名を自動補完し、数式の構文を検証します。数式が有効な場合、緑色のチェックマークが表示されます。
作成後、数式プロパティはベース内の他のプロパティと同様に使用できます。[[ビュー]]に追加したり、フィルターで使用したり、並べ替えに使ったりすることができます。
## 数式を書く
数式エディタで、プロパティ、演算子、関数を使った式を入力します。
### プロパティの参照
数式ではさまざまな種類のプロパティを参照できます:
- **ノートプロパティ** — ノートの[[プロパティ|フロントマター]]からのプロパティ。
- **ファイルプロパティ** — `file.name`、`file.size`、`file.mtime`などのビルトインプロパティ。
- **数式プロパティ** — `formula.formula_name`を使った他の数式。
**例:**
- `price * quantity` — 2つのノートプロパティを掛ける
- `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構文#演算子|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] 循環参照を避ける
> 数式は、直接的にも他の数式を介して間接的にも、自分自身を参照することはできません。