Obsidian v1.5で追加されたビジュアルテーブルエディタは基本的な編集機能を提供しますが、Enhanced Tablesプラグインは閲覧モードのテーブルに対して、さらに多くの制御機能を追加します。例:
- データの装飾:より直感的な方法で内容を表示できます。
- テーブルのページネーション:ページ制御により、多数のデータを表示する際にスクロールし続ける必要がなくなります。
- 列のソート:特定の列を昇順または降順で並べ替えることができます。
- データのフィルタリング:フィルタリングする列の条件を指定できます。
- データの検索:キーワードを入力してデータをフィルタリングできます。
Enhanced Tablesプラグインは最近リリースされたばかりですが、機能はほぼ完成しています。まだ改善の余地はありますが、その利便性は非常に有望です。
1. Templater Hotkeysにリフレッシュ用ホットキーを追加する
現在、Enhanced Tableを使用したテーブルでは、テーブルのプロパティを変更した後、レンダリングが失敗することがよくあります。特に左右分割パネル(左側パネルがライブプレビューモード、右側パネルが閲覧モード)の場合、右側の表示が正しく行われないことが頻繁にあります。
この場合、ページを再読み込み(リフレッシュ)する必要がありますが、現在Obsidianにはページをリフレッシュするコマンドが提供されていません。Templaterスクリプトを使用してホットキーを割り当てる必要があります(関連リンクのウェブページを参照してください。User Pluginsプラグインを使用した別の解決策もあります)。
- Templaterプラグインの設定ウィンドウを開き、Template folder locationを確認し、そのフォルダ内にスクリプトファイル
Cmd-reload-page.mdを作成します。 Cmd-reload-page.mdの内容は以下の通りです:
< %*
app.workspace.activeLeaf.rebuildView();
%>
- Templaterプラグイン設定ウィンドウ内のTemplate Hotkeysリストで、Add new hotkey for templateをクリックし、
Cmd-reload-page.mdを見つけて <span class='keybs'>Enter</span> キーを押します。 - 設定 → ホットキー に移動し、
Cmd-reload-page.mdを見つけてホットキー(例:<span class='keybs'> Ctrl+R</span>)を割り当てます。 - ついでに「変更を破棄して再読み込み」にもホットキー(例:<span class='keybs'>Ctrl+Alt+R</span>)を割り当てておくと、将来Obsidianアプリケーションを再起動する必要がある場合に、キー操作だけで実行できます。
2. コードブロックの設定
Enhanced Tablesを使用するには、テーブルの上にコードブロックを追加します。コードブロックとテーブルの間には空行が1行必要です。コードブロックはYAML形式で、基本的な構造は以下の通りです:
2.1. テーブル構造
```yaml enhanced-tables
date-format: YYYY-MM-DD # デフォルトの日付フォーマット
datetime-format: YYYY-MM-DD HH:mm # デフォルトの日時フォーマット
yes-format: "Y" # デフォルトの真の値フォーマット
no-format: "N" # デフォルトの偽の値フォーマット
editable: [true | false] # テーブル全体を編集可能にするか
columns: # 列の定義
# ここに列ごとの設定を記述
filter: # デフォルトのフィルター条件 (例: $row.列名 > 100)
filters: # フィルターメニューの設定
# フィルター名: 条件 (例: Small numbers: $row.amount < 1200)
sort: # デフォルトのソート列名 (例: 列名, 降順は -列名)
pagination: # ページネーション設定
page-size: 10 # 1ページあたりの行数
page-sizes: # ページ行数の選択肢
- 10
- 25
- 50
style: | # カスタムCSSスタイル (複数行)
/* 例: ヘッダーのスタイル */
th {
background-color: lightgray;
}
hide-controls: [true | false] # コントロール行(検索、フィルターなど)を隠すか
hide-configuration: [true | false] # この設定コードブロック自体を隠すか
2.2. 列の設定
テーブルの最初の行(ヘッダー行)の列定義:
列名: # テーブルヘッダーの列名
alias: 別名 # 表示上の別名 (オプション)
type: 型 # 列のデータ型 [[string] | number | date | datetime | time | enum | bool] (デフォルト: string)
hidden: [true | false] # この列を隠すか (デフォルト: false)
nowrap: [true | false] # セルの内容を折り返さないか (デフォルト: false)
editable: [true | false] # この列を編集可能にするか (テーブル全体のeditable設定を上書き)
searchable: [true | false] # この列を検索対象にするか (デフォルト: true)
number-format: "書式設定文字列" # typeがnumberの場合の書式 (Intl.NumberFormat) 例: "style:'currency', currency: 'JPY'"
date-format: "書式設定文字列" # typeがdate/datetime/timeの場合の書式 (Moment.js) 例: "YYYY年MM月DD日"
yes-format: "表示文字列" # typeがboolの場合の真の値の表示 (デフォルト: テーブル設定のyes-format)
no-format: "表示文字列" # typeがboolの場合の偽の値の表示 (デフォルト: テーブル設定のno-format)
enum: # typeがenumの場合の選択肢と表示のマッピング
値1: 表示1
値2: 表示2
formatter: "フォーマット式" # セルの表示をカスタマイズする式 (JavaScriptテンプレートリテラル)
2.3. 式
- 変数:
$row(行データオブジェクト),$cell(現在のセルの値) - 列へのアクセス:
$row.列名(列名にスペースや特殊文字が含まれる場合は$row['列 名']のように記述)
2.4. 例
```yaml enhanced-tables
date-format: YYYY-MM-DD
yes-format: "Y"
no-format: "N"
# editable: true # テーブル全体を編集可能にする場合
columns:
Amount:
alias: amount # 別名
type: number # 型: 数値
number-format: "style:'currency', currency: 'TWD', minimumFractionDigits:0" # 数値フォーマット: 通貨(TWD), 小数点以下0桁
searchable: true # 検索可能
UnitPrice:
alias: price
type: number
Quantity:
alias: qty
type: number
SubTotal:
alias: subtotal
type: number
number-format: "style:'currency', currency: 'TWD', minimumFractionDigits:0"
formatter: "eval(`${$row.price}*${$row.qty}`)" # フォーマッター: price * qty を計算して表示
Date:
type: date # 型: 日付
date-format: YYYY年MM月DD日 # 日付フォーマット
Color:
formatter: "`<span style='color:${$cell}'>${$cell}</span>`" # フォーマッター: セルの値を色付きで表示
nowrap: true # 折り返さない
Formatted:
formatter: "`#${$row.Id}) ${$cell}`" # フォーマッター: IDとセルの値を組み合わせて表示
nowrap: true
Hidden:
hidden: true # 非表示列
Rating:
type: enum # 型: 列挙型
enum: # 列挙型のマッピング
'1': '⭐️'
'2': '⭐️⭐️'
'3': '⭐️⭐️⭐️'
'4': '⭐️⭐️⭐️⭐️'
'5': '⭐️⭐️⭐️⭐️⭐️'
searchable: true
真假值: # 列名: 真偽値
type: bool # 型: 真偽値
yes-format: "✔️" # 真の表示
no-format: "❌" # 偽の表示
filter: $row.amount > 1200 # デフォルトフィルター: amountが1200より大きい
filters: # フィルターメニュー
Small numbers: $row.amount < 1200 # フィルター1: amountが1200未満
High rating: Number($row.Rating) > 3 # フィルター2: Ratingが3より大きい (Ratingはenumで文字列なのでNumber()で数値化)
sort: Rating # デフォルトソート: Rating列 (昇順)
# sort: -Rating # Rating列を降順でソートする場合
pagination: # ページネーション
page-size: 3 # 1ページあたり3行
page-sizes: # ページ行数オプション
- 3
- 10
style: | # カスタムスタイル
th { /* ヘッダーセル */
background-color: var(--color-base-50) !important; /* 背景色 */
color: var(--color-base-70) !important; /* 文字色 */
}
# hide-controls: true # コントロール行を隠す場合
hide-configuration: true # 設定コードブロックを隠す
```
| Id | Amount | UnitPrice | Quantity | SubTotal | Date | Rating | Color | Formatted | Hidden | 真假值 |
| :-: | -----: | --------: | -------: | -------: | ---------- | :----- | ------ | -------------------------------- | :----------------: | :------: |
| 1 | 500 | 500 | 10 | | 2024-03-05 | 2 | red | _**bold**_ | Text you won't see | |
| 2 | 1000 | 1000 | 12 | | 2024-04-10 | 5 | orange | | | N |
| 3 | 1504 | 1504 | 9 | | 2024-03-15 | 1 | yellow | <font color="#ff0000">red</font> | | Y |
| 4 | 10000 | 10000 | 4 | | 2024-05-01 | 4 | green | ~~strike~~ | | whatever |
| 5 | 12000 | 12000 | 7 | | 2024-05-02 | 3 | blue | $1\frac {4}{5}+\frac {2}{3}=?$ | | Y |
| 6 | 13000 | 13000 | 22 | | 2024-05-03 | 4 | purple | `{js} alert('123');` | | N |
2.5. formatter
formatterはJavaScriptのテンプレートリテラルを使用します。
テンプレートリテラルは、式を埋め込むことができる文字列リテラルです。${変数} で変数の値を取得します。
`テンプレートリテラルの例: 文字列テキスト ${式} 文字列テキスト`
SubTotalのformatter:
formatter: "eval(`${$row.price}*${$row.qty}`)"
$row.priceが500、$row.qtyが10の場合、リテラル文字列は `500*10` となります。
eval(\500*10`)` を使用してJavaScriptの計算を実行します。
3. 関連リンク
💡 解説記事: https://jdev.tw/blog/8350/
✅ obsidian-enhanced-tables: https://github.com/pistacchio/obsidian-enhanced-tables
✅ NumberFormat: https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat
✅ Creating command to reload page: https://forum.obsidian.md/t/creating-command-to-reload-page/57906