0. はじめに
こんにちは!n8nで業務自動化を担当しているシニアエンジニアです。
皆さんは、Webhookトリガーで「Hello World」と表示する最初のワークフロー作成に成功された頃でしょうか。あの、URLを叩いたらn8nの画面がキラリと光り、実行成功の緑のチェックマークが表示された瞬間の喜びは格別ですよね。素晴らしい第一歩です!
しかし、そこから一歩進んで「実用的なワークフロー」を作ろうとすると、多くの初心者が最初の壁にぶつかります。
「Webhookで受け取ったデータって、どうやって使うの?」
「あるノードの結果を、次のノードでいい感じに加工したい…」
「{{ $json.body.name }}
みたいな謎の呪文は何?」
この壁の正体、それはn8nの最も重要かつ根幹をなす概念、「データフロー」の理解です。
今回の記事は、このn8nの心臓部とも言える 「アイテム(Items)」と「JSONデータ」、そしてそれを自在に操るための「式(Expressions)」 について、徹底的に解説します。
この記事を読み終える頃には、あなたは「Hello World」を卒業し、受け取ったデータに応じて動的に振る舞いを変えるワークフローを構築する第一歩を踏み出しているはずです。さあ、一緒にn8nマスターへの道を歩み始めましょう!
1. n8nの血液:「アイテム(Items)」と「JSON」を解剖する
ワークフローは人間の体に似ています。各ノードが臓器だとすれば、それらの間を流れるデータは血液です。n8nにおいて、この血液の正体が 「アイテム(Items)」であり、その成分が「JSON」 です。
1-1. アイテム(Item)とは?
アイテムとは、n8nが処理するデータの1単位です。
スプレッドシートの 「1行」
データベースの 「1レコード」
メールの 「1通」
このようにイメージすると分かりやすいでしょう。
例えば、Webhookノードが1回のリクエストを受け取った場合、それは1つのアイテムを生成します。RSSリーダーノードが10件の新着記事を取得した場合、それは10個のアイテムを生成します。
n8nの多くのノードは、入力されたアイテムの数だけ処理を繰り返すように設計されています。この「アイテムごとに処理が実行される」という感覚は、今後のステップでループ処理を理解する上で非常に重要になります。
1-2. アイテムの中身「JSON」を覗いてみよう
では、その「アイテム」という箱の中には何が入っているのでしょうか。それがJSON (JavaScript Object Notation) 形式のデータです。
JSONは { "キー": "値" }
のペアで構成される、非常にシンプルで人間にも機械にも分かりやすいデータ形式です。
実際に、あなたが作成した「Hello World」ワークフローで見てみましょう。
n8nのワークフローエディタを開きます。
Webhookノードをクリックし、「Execute Node」または「Listen for Test Event」でテスト実行します。
実行が成功したら、ノードの右側に表示される出力(Output)データに注目してください。
(画像はn8n公式ドキュメントより引用。UIはバージョンによって若干異なります)
ここには「Table」と「JSON」というタブがありますね。
- Tableビュー: データをスプレッドシートのように見やすく表示してくれます。初心者に優しい表示ですが、これはあくまで簡易的な表現です。
- JSONビュー: データの真の姿です。私たちは、今後常にこのJSONビューを確認する癖をつけましょう。
WebhookノードのJSONビューを開くと、おそらく以下のようなデータが表示されているはずです。(LibreChatからの呼び出し方によって内容は異なります)
[
{
"headers": {
"host": "your-n8n-instance.com",
"user-agent": "curl/7.81.0",
"accept": "*/*"
},
"params": {},
"query": {},
"body": {
"message": "こんにちは",
"user": "Taro"
}
}
]
これが、Webhookノードが生成した1つのアイテムであり、その中身のJSONデータです。
外側が [ ] (角括弧) で囲まれているのは、アイテムが複数になる可能性を考慮した「配列(リスト)」形式であることを示しています。
【最重要ポイント】
ワークフローを構築・デバッグする際は、必ず各ノードの実行後にJSONビューを開き、データがどのような構造で、どのキーに格納されているかを確認する習慣をつけましょう。 これができるかどうかが、初心者と中級者を分ける最初の関門です。
2. データを操る魔法の杖「式(Expressions)」を使いこなす
データの構造が分かったら、次はその中から目当ての値を取り出す方法を学びます。ここで登場するのが 「式(Expressions)」 です。
式とは、{{ }}
(二重中括弧)で囲まれた特別な文字列で、ワークフローの動的なデータを参照するためのn8nの魔法の杖です。
2-1. 式の基本: {{ $json.key }}
最も頻繁に使う式が $json です。これは、現在処理中の1つのアイテムに含まれるJSONデータ全体を指します。
先ほどのJSONデータを例に、bodyの中のmessage("こんにちは")を取り出したい場合、式は以下のようになります。
{{ $json.body.message }}
{{ ... }}
: 「これは式ですよ」という宣言。
$json
: 現在のアイテムのJSONデータを指すオブジェクト。
.body
: $jsonオブジェクトの中のbodyというキーにアクセス。
.message
: bodyオブジェクトの中のmessageというキーにアクセス。
ドット(.)でキーを繋いでいくことで、JSONの階層を掘り進んでいくイメージです。
もし、ユーザー名を取り出したい場合は {{ $json.body.user }}
となります。簡単ですね!
2-2. 式はどこで使える?
n8nの多くのノードの入力フィールドで式を利用できます。フィールドの横に六角形のようなアイコンが表示されていれば、そこが式の使い所です。
(画像はn8n公式ドキュメントより引用)
このフィールドに {{ ... }}
を入力すると、n8nが自動的に式エディタを起動してくれます。エディタ上では、過去のノードの出力データから目的の値をポチポチとクリックするだけで、複雑な式も簡単に入力できるので非常に便利です。
2-3. $json 以外の便利な変数
n8nには $json
以外にも便利な組み込み変数が用意されています。いくつか紹介しておきましょう。
{{ $now }}
: 現在の日時を取得します。ログのタイムスタンプなどに便利です。
{{ $workflow.id }}
: 現在のワークフローのIDを取得します。
{{ $execution.id }}
: 現在の実行IDを取得します。エラー追跡に役立ちます。
これらを組み合わせることで、さらに柔軟なワークフローが作成可能になります。
3. 実践!キーワードで応答を変えるチャットボットを作ってみよう
それでは、ここまで学んだ知識を総動員して、最初の「Hello World」ワークフローを改造してみましょう。
目標
LibreChatから受け取ったメッセージに「天気」というキーワードが含まれていたら「お天気ですね!」と返し、含まれていなければ「ご用件をどうぞ」と返す。
Step 1: ワークフローの全体像
完成形のワークフローは以下のようになります。
[Webhook] -> [IF] -> (true) -> [Set (天気用)] -> [Respond to Webhook]
|
-> (false) -> [Set (通常用)] -> [Respond to Webhook]
※ Setノードの出力をRespond to Webhookノードで返信します。
Step 2: IFノードの設定
既存のWebhookノードの後に、+ボタンからIFノードを追加します。
IFノードの設定画面を開き、Conditions(条件)を設定します。
Value 1 の入力欄をクリックし、式エディタを開きます。
左側のCurrent Node > Input Data > JSONと辿り、bodyの中のmessageをクリックします。
すると、自動的に {{ $json.body.message }}
という式が入力されます。
Operation(操作)のドロップダウンからString > contains(含む)を選択します。
Value 2 に、キーワードである 天気 と入力します。
これで、「bodyの中のmessageに天気という文字列が含まれているか?」という条件設定が完了しました。
(この部分はUIのスクリーンショットを想定)
Step 3: 分岐後のSetノードの設定
IFノードからはtrueとfalseの2つの出力パスが伸びています。
【trueパス(天気が含まれる場合)】
trueの出力から+ボタンでSetノードを追加します。ノード名を「Set: 天気用」などと分かりやすく変更しておきましょう。
Add Valueをクリックし、Nameに response_message と入力します。
Valueに お天気ですね! と入力します。Keep Only SetはONにしておくと、出力がシンプルになるのでおすすめです。
【falseパス(天気が含まれない場合)】
falseの出力から同様にSetノードを追加します。ノード名は「Set: 通常用」とします。
Add Valueで、Nameに同じく response_message と入力します。
Valueに ご用件をどうぞ と入力します。
なぜ同じresponse_messageという名前を使うかというと、後続の処理(この場合は返信)を共通化できるからです。
Step 4: Webhookへの返信
最後に、生成したメッセージをLibreChatに返します。これには Respond to Webhook ノードを使います。
2つのSetノードの出力を、1つのRespond to Webhookノードに繋ぎます。
Respond With オプションで Last Node in Workflow を選択します。
Response Body に、Setノードで作成したresponse_messageを式で指定します。
{{ $json.response_message }}
これで完成です!
LibreChatから「今日の東京の天気は?」と送ってみてください。「お天気ですね!」と返ってくるはずです。次に「こんにちは」と送れば、「ご用件をどうぞ」と返ってくるでしょう。
4. まとめ:データは友達、怖くない
今回は、n8nで脱初心するための最初の、そして最も重要なステップを解説しました。
n8nは「アイテム」というデータ単位で情報を処理する。
アイテムの中身は「JSON」形式。必ずJSONビューで構造を確認する癖をつける。
「式 ({{ }}
)」を使えば、JSONの中から自由自在にデータを取り出せる。
IFノードと式を組み合わせることで、データに応じた条件分岐が可能になる。
ここまでをマスターすれば、あなたはもう単純な「Hello World」を繰り返すだけの初心者ではありません。ワークフローに流れる「血液」であるデータを読み解き、その流れをコントロールする力を手に入れたのです。
このデータの流れを意識できるようになると、複雑なワークフローのデバッグも格段に楽になります。「どこでデータがおかしくなったのか?」を、ノードの出力を一つずつ追いかけていけば必ず原因に辿り着けるからです。
次回は、このロジックをさらに拡張するための Switchノードや、複数のアイテムを効率的に扱うループ処理 の考え方について解説していく予定です。
ぜひ、今回作成したワークフローを元に、「もし『ありがとう』と言われたら、『どういたしまして』と返す」のような分岐を追加して、データと式にさらに慣れ親しんでみてください。
それでは、良き自動化ライフを!