Obsidian Dataviewの使い方完全ガイドでは、DQLのLIST→WHERE→SORT→TABLEという基本4ステップを紹介しました。この4つを使えるようになると、Vault内の情報を一覧化・集計できるようになります。
ただ、使い込んでいくと「今日締切のタスクだけ出したい」「レビュー期限を重要度順に並べたい」といった、DQLだけでは少し表現しにくい要望も出てきますよね。そこで今回は、DQLの一歩先にあるDataviewJSの実践的な使い方を6つ紹介します。後半では、Templater・QuickAdd・AutoMoverとの組み合わせパターンにも触れていきます。
- DQLとDataviewJSの向き不向きの線引き
dv.current()・dv.taskList()・groupBy()・dv.view()を使った実践6パターン- Templater・QuickAdd・AutoMoverとDataviewJSを組み合わせる運用アイデア
DataviewJSは「何でもJSで書く場所」ではない
まず誤解しやすいポイントを先に整理しておきます。DataviewJSは、DQLをJavaScriptで書き直すための機能ではありません。DQLでは表現しにくい判断・集計・表示を、ノートの中に小さなビューとして組み込むための機能です。
単純な一覧や絞り込みまで無理にJavaScript化すると、コード量が増えるだけで読みにくくなります。向き不向きは次のように整理できます。
| やりたいこと | 選ぶもの |
|---|---|
| プロジェクトの一覧を表示する | DQL |
| 現在のノートと同じ著者を探す | DataviewJS |
| 期限切れタスクだけを表示する | DataviewJS |
| ステータスごとに件数を集計する | DataviewJS |
| 直接リンクされたノートを見る | DQLまたはfile.inlinks |
| 数段先のリンクまで探索する | DataviewJS |
| 同じビューを複数MOCで使う | dv.view() |
条件によって表示を変えたい、件数や平均を計算したい、現在のノートを基準に検索したい——こういった「判断」が必要になった瞬間がDataviewJSの出番です。逆に、単純な一覧ならDQLのままで十分だと覚えておきましょう。
現在のノートを起点に関連情報を表示する
1つ目は、dv.current()を使って「表示中のノートを基準に関連ノートを探す」パターンです。読書ノートや人物ノート、プロジェクトノートなど、1つのノートを中心に関連情報を確認したい場面に向いています。
dv.pages()がVault全体から対象を探すAPIであるのに対し、dv.current()は「このノートを基準にする」ためのAPIです。両者の役割の違いを押さえておくと、使い分けに迷いません。
例えば、書籍ノートに同じ著者の本をまとめて表示したい場合はこのように書けます。
const current = dv.current();
const author = current.author;
if (!author) {
dv.paragraph("著者が設定されていません");
} else {
const related = dv.pages("#book")
.where(p =>
p.author === author &&
p.file.path !== current.file.path
)
.sort(p => p.file.name);
dv.header(3, `${author}の関連書籍`);
if (related.length === 0) {
dv.paragraph("関連書籍はありません");
} else {
dv.table(
["タイトル", "状態", "評価"],
related.map(p => [
p.file.link,
p.status ?? "未設定",
p.rating ?? "未評価"
])
);
}
}
同じ考え方は、同じプロジェクトに属するノートや、同じゲーム・MODに関するノートなど、「共通プロパティ」による関連付けにも応用できます。タグでは拾いにくい関連性を、プロパティ経由で見つけられるのが強みです。
参考: Dataview公式ドキュメント(Code Reference)
今日処理すべきタスクだけを動的に抽出する
タスク管理で本当に必要なのは、全タスクの一覧ではありません。今すぐ処理すべきタスクだけを、発生元のプロジェクトと一緒に見られることです。
ここで気をつけたいのが、Tasksプラグインの絵文字記法とインラインフィールドの使い分けです。Dataviewが対応する絵文字は🗓️(期日)など日付関連の5種類に限られており、優先度には絵文字ショートハンドが用意されていません。優先度を使いたい場合は[priority:: high]のようなインラインフィールドで記述する必要があります。
- [ ] 仕様を確認する [priority:: high] 🗓️ 2026-09-26
- [ ] スクリーンショットを整理する [priority:: medium] 🗓️ 2026-09-28
今日までに期限が来ている未完了タスクを集めるコードはこうなります。
const today = dv.date("today");
const tasks = dv.pages("#project")
.file.tasks
.where(t =>
!t.completed &&
t.due &&
t.due <= today
);
dv.header(3, "今日処理するタスク");
if (tasks.length === 0) {
dv.paragraph("期限切れ・期限当日のタスクはありません");
} else {
dv.taskList(tasks, false);
}
dv.taskList()は、ページのfile.tasksから取得したタスクを表示するためのAPIです。第2引数にfalseを渡すと、ファイル単位で自動グループ化せず、1つのリストとしてまとめて表示できます。
高優先度のタスクだけを別枠にしたい場合は、priorityの条件を加えるだけで対応できます。プロジェクトノート側のタスクを書き換える必要はなく、プロパティを付けるだけで表示が自動的に変わるのが便利なところです。
参考: Metadata on Tasks and Lists
プロジェクトの状態を1枚のダッシュボードで確認する
プロジェクト用MOCでは、一覧表よりも先に「全体の状態」を確認したいことがあります。そんなときはgroupBy()を使うと、ステータスごとに件数と内訳を同時に表示できます。
const projects = dv.pages("#project");
const groups = projects.groupBy(p => p.status ?? "未設定");
for (const group of groups) {
dv.header(3, `${group.key}(${group.rows.length}件)`);
dv.list(
group.rows
.sort(p => p.file.name)
.map(p => p.file.link)
);
}
ステータスの種類が増えるたびにactive・completed・paused……と個別に変数を用意していくと、保守が大変になります。groupBy()でまとめておけば、ステータスが増減してもコード側を書き換える必要がなく、長く使い続けられる書き方になります。
リンクをたどって関連ノートを探す/繰り返し使うビューを部品化する
ここからは少し応用的な内容です。初心者の方は読み飛ばしても本編の理解に支障はありません。
タグやFrontmatterに頼らず、リンクをたどって関連ノートを見つけたい場面もあります。通常のfile.inlinks・file.outlinksは直接リンクしているノートだけを取得しますが、数段先までたどりたい場合は、集合とスタックを使った深さ優先探索が使えます。
const start = dv.current().file.path;
const visited = new Set([start]);
const stack = [start];
while (stack.length > 0) {
const path = stack.pop();
const page = dv.page(path);
if (!page) continue;
const links = page.file.inlinks
.concat(page.file.outlinks)
.array();
for (const link of links) {
if (visited.has(link.path)) continue;
visited.add(link.path);
stack.push(link.path);
}
}
const related = Array.from(visited)
.filter(path => path !== start)
.map(path => dv.page(path))
.filter(Boolean);
dv.header(3, "リンクをたどって見つかったノート");
dv.list(
related
.sort((a, b) => a.file.name.localeCompare(b.file.name))
.map(p => p.file.link)
);
これは「検索」というより、自分が作ったリンク構造を探索するビューです。リンクが多いVaultでは結果が広がりすぎるため常用には向きませんが、ノート整理前に影響範囲を確認するような場面では力を発揮します。
もう一つの応用が、同じビューを複数のMOCで使い回すdv.view()による部品化です。同じコードを2か所以上に貼っている、修正のたびに複数ノートを編集している——そんな状態に気づいたら外部化してみましょう。
_views/
project-list.js
// project-list.js
const source = input.source ?? "#project";
const status = input.status;
let pages = dv.pages(source);
if (status) {
pages = pages.where(p => p.status === status);
}
pages = pages.sort(p => p.priority === "high" ? 0 : 1);
dv.table(
["プロジェクト", "優先度", "期限"],
pages.map(p => [
p.file.link,
p.priority ?? "未設定",
p.deadline ?? "未設定"
])
);
呼び出し側では、inputに渡す値だけを変えれば条件を切り替えられます。
await dv.view("_views/project-list", {
source: "#project",
status: "active"
});
dv.view()はファイルI/Oを伴う非同期処理なので、呼び出し時はawaitを忘れないようにしましょう。同じフォルダにview.cssを置けば、スタイルもビュー単位で管理できます。
スクリプトが書けなくても、生成AIに頼れば大丈夫
私もそうですが、「こんなスクリプトなんて書けない」という人は多いと思います。そんなときは、生成AI(Claude・ChatGPT・Geminiなど)に「DataviewJSを使ってこういうことをしたいから、スクリプトを書いて」とお願いしてみましょう。たいていの要望はバッチリ書いてくれます。
DataviewJSと組み合わせると相性がいいプラグイン
DataviewJSは単体で使うよりも、すでに使っているプラグインと組み合わせたときに運用がさらに化けます。ここでは私が実際に運用しているTemplater・QuickAdd・AutoMoverとの組み合わせパターンを紹介します。いずれも「入力はGUIやテンプレートに任せ、表示はDataviewJSが担当する」という役割分担が軸になっています。
Templater:ノート作成時の初期値をDataviewJSの集計結果から決める
新規プロジェクトノートを作るとき、Templater側で既存プロジェクトの件数をカウントして連番を自動採番する、といった組み合わせです。DataviewJSで数えた結果をTemplaterのテンプレート側に渡せば、手入力の手間をなくせます。QuickAddとTemplaterの役割分担を整理した記事でも触れているように、Templaterは「ノート作成時の初期値を決める」役割です。DataviewJSの表示機能とはちょうど補い合う関係になります。
QuickAdd:マクロで更新したステータスをそのままダッシュボード化する
QuickAddのステータス変更マクロでノートの状態を更新し、その結果をDataviewJSの優先順位付けビューで表示する——これも「入力はGUI、表示はコード」という分担の一例です。ステータスをコマンド一発で切り替えられるQuickAdd側の手軽さと、DataviewJSの柔軟な表示を組み合わせれば、手入力の揺らぎを抑えたまま優先順位が自動で反映されます。こうしたQuickAdd・Templater・AutoMoverの連携全体像は以前のプラグイン連携ガイドで詳しく解説しています。気になった方は覗いてみてください。
AutoMover:タグで自動移動されたノートを、移動後にDataviewJSで一覧化する
タグを付けるとAutoMoverが自動でフォルダを移動してくれますが、移動した後のノート群をどう把握するかは別問題です。そこでDataviewJSのgroupBy()を使い、移動後のノートをタグ種別ごとに件数・一覧表示するビューを作っておくと、「入力の手間はゼロ、表示だけ自分で作る」というループが完成します。
入力(タグ付け→自動移動)と表示(DataviewJSの集計)を分けて考えられるようになると、Vault運用全体がかなり楽になるはずです。
まとめ
DataviewJSは、Dataviewとは別の独立した機能ではありません。既存のプラグイン構成に「判断・表示の層」を1枚足すものだと捉えると、便利な使い方ができると思います。
今回紹介した6つの使い方をすべて一度に試す必要はありません。まずは自分がよく行う判断——「今日のタスクだけ見たい」「レビュー期限順に並べたい」といった要望から1つだけ選んで、実際にノートに組み込んでみてください。小さく始めるほど、DataviewJSの手触りがつかみやすくなります。
- Obsidian Base Boardの使い方|プロパティ駆動カンバンでブログ管理を可視化する
— この記事の直接の前編、カンバンでの可視化管理を扱う実践編 - Obsidian Dataviewの使い方完全ガイド|クエリの基本からBases連携まで
— この記事の前提となるDQL基本編を読みたい方向け - QuickAddとTemplaterって何が違うの?役割を分けて考えるとObsidianが一気に使いやすくなる
— Templater連携をさらに深掘りしたい方向け - Obsidianのノート管理を自動化する方法|4つのプラグイン連携ガイド
— QuickAdd連携をさらに深掘りしたい方向け
