Obsidian v1.5で追加されたビジュアルテーブルエディタは基本的な編集機能を提供しますが、Enhanced Tablesプラグインは閲覧モードのテーブルに対して、さらに多くの制御機能を追加します。例:

  1. データの装飾:より直感的な方法で内容を表示できます。
  2. テーブルのページネーション:ページ制御により、多数のデータを表示する際にスクロールし続ける必要がなくなります。
  3. 列のソート:特定の列を昇順または降順で並べ替えることができます。
  4. データのフィルタリング:フィルタリングする列の条件を指定できます。
  5. データの検索:キーワードを入力してデータをフィルタリングできます。

Enhanced Tablesプラグインは最近リリースされたばかりですが、機能はほぼ完成しています。まだ改善の余地はありますが、その利便性は非常に有望です。

gh|900

1. Templater Hotkeysにリフレッシュ用ホットキーを追加する

現在、Enhanced Tableを使用したテーブルでは、テーブルのプロパティを変更した後、レンダリングが失敗することがよくあります。特に左右分割パネル(左側パネルがライブプレビューモード、右側パネルが閲覧モード)の場合、右側の表示が正しく行われないことが頻繁にあります。

この場合、ページを再読み込み(リフレッシュ)する必要がありますが、現在Obsidianにはページをリフレッシュするコマンドが提供されていません。Templaterスクリプトを使用してホットキーを割り当てる必要があります(関連リンクのウェブページを参照してください。User Pluginsプラグインを使用した別の解決策もあります)。

  1. Templaterプラグインの設定ウィンドウを開き、Template folder locationを確認し、そのフォルダ内にスクリプトファイル Cmd-reload-page.md を作成します。
  2. Cmd-reload-page.mdの内容は以下の通りです:
< %*
  app.workspace.activeLeaf.rebuildView();
%>
  1. Templaterプラグイン設定ウィンドウ内のTemplate Hotkeysリストで、Add new hotkey for templateをクリックし、Cmd-reload-page.md を見つけて <span class='keybs'>Enter</span> キーを押します。
  2. 設定 → ホットキー に移動し、Cmd-reload-page.md を見つけてホットキー(例:<span class='keybs'> Ctrl+R</span>)を割り当てます。
  3. ついでに「変更を破棄して再読み込み」にもホットキー(例:<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

4. チュートリアル動画