このレッスンのロックを解除するには、まず「レッスン1: IFノードとSwitchノードによる条件分岐」を完了してください。前のレッスンに戻る

はじめに

n8nにおいて、式は生データと動的ロジックをつなぐ橋です。値をハードコーディングする代わりに、前のノードからデータを読み取り、変換を適用し、結果を次のステップに渡す式を書きます — そのすべてを本格的なCodeノードを使わずに実現できます。

n8nのすべての式は二重波括弧で囲まれ、ランタイムで評価されます。そのエンジンとなっているのは、組み込み変数とヘルパーメソッド群を備えた軽量なJavaScript環境です。この層を理解することが、もろいワークフローと実際のデータに対応できるワークフローを分ける鍵となります。

式構文と組み込み変数

最も頻繁に使う2つの重要な組み込み変数はjsonとjsonとinputです。jsonは現在処理中のアイテムのJSONボディを指します。jsonは現在処理中のアイテムのJSONボディを指します。inputは同じ実行内の他のアイテムへのアクセスを含む、入力オブジェクト全体へのアクセスを提供します。

現在のアイテムからフィールドを参照するには:

javascript
{{ $json.email }}

特定の前のノードから名前で出力を参照するには:

javascript
{{ $node["HTTP Request"].json.data.userId }}

バッチ内の現在のアイテムのインデックスにアクセスするには:

javascript
{{ $itemIndex }}

現在のノードに入力されるアイテムの総数を取得するには:

javascript
{{ $input.all().length }}

これらの変数は、式の切り替えが表示されるほぼすべてのフィールド — 入力フィールド、Setノードの値、IF条件、HTTP Requestのパラメータなど — で利用可能です。

3つのノード間を流れるデータに対して、$json、$input、$node[]変数がどのように対応するかを示すフローチャート

式によるデータ変換

単純なフィールドアクセスだけでなく、式はJavaScriptの文字列、配列、オブジェクトのAPIすべてをサポートします。これが、専用のCodeノードを使わずにインラインで変換を行う場面です。

文字列を大文字に変換する:

javascript
{{ $json.name.toUpperCase() }}

空白をトリムして条件を確認する:

javascript
{{ $json.status.trim() === "active" ? "send" : "skip" }}

複数のフィールドからフォーマット済み文字列を構築する:

javascript
{{ `Hello ${$json.firstName} ${$json.lastName}, your order #${$json.orderId} is ready.` }}

組み込みの$nowとLuxon統合を使って日付を解析し再フォーマットする:

javascript
{{ DateTime.fromISO($json.createdAt).toFormat("dd/MM/yyyy") }}

n8nは日付処理用のLuxonをバンドルしています。式内でDateTimeとして直接参照できます — インポートは不要です。

オプショナルチェイニングを使ってネストされたフィールドを安全にアクセスする:

javascript
{{ $json.address?.city ?? "Unknown" }}

オプショナルチェイニングとnullish合体演算子を組み合わせたこのパターンは、アップストリームのデータに一貫性がない場合に極めて重要です。式がエラーをスローして実行全体を停止するのを防ぎます。

式での配列の取り扱い

あるノードが複数のアイテムを出力する場合、ダウンストリームの式内からそれらを集約またはフィルタリングする必要があることがあります。$input.all()はオブジェクトの配列として全アイテムへのアクセスを提供し、各オブジェクトはjsonプロパティを持ちます。

バッチ内のすべてのアイテムからメールアドレスを配列として取得する:

javascript
{{ $input.all().map(item => item.json.email) }}

フィールドが条件を満たすアイテムをフィルタリングしてカウントする:

javascript
{{ $input.all().filter(item => item.json.score > 80).length }}

すべてのアイテムの数値フィールドを合計する:

javascript
{{ $input.all().reduce((acc, item) => acc + item.json.amount, 0) }}

これらの式はSetノードやMergeノード内で、バッチから単一の集約値を生成してからダウンストリームに渡したい場合によく機能します。

単一アイテム式($json.field)とバッチ式($input.all().map())を比較し、データフローを矢印で示す図

よくある間違い

最も多い問題は、一部のアイテムに存在しないフィールドを参照することです。式がTypeErrorをスローし、実行が停止します。フィールドが保証されていない場合は常にオプショナルチェイニングを使用してください。

もう一つのよくある間違いは、jsonがノード全体の出力を指すのではなく、現在のアイテムを指すことを忘れることです。あるノードが5つのアイテムを出力し、それらをjsonがノード全体の出力を指すのではなく、現在のアイテムを指すことを忘れることです。あるノードが5つのアイテムを出力し、それらをjson.valueで処理する場合、各アイテムは独立して処理されます — 5つの値の配列を取得しているのではなく、実行パスごとに1つの値を取得しているのです。

node["NodeName"].jsonとnode["NodeName"].jsonとjsonを混同することもバグのよくある原因です。$node[]は現在の実行パスに関係なく、特定のノードの最新の出力に固定されるため、分岐ワークフローでは古いデータを返す可能性があります。意図的に、そして慎重に使用してください。

最後に、複雑な多段階のロジックを単一の式の中に入れないでください。2つ以上のチェーン操作や副作用を持つループが必要になったら、そのロジックはCodeノードに移してください。式は変換のためのものであり、制御フローのためのものではありません。

まとめ

n8nの式を使うと、json、json、input、$node[]を主要なアクセスポイントとして、データを動的に読み取り、変換、結合できます。JavaScriptの文字列、配列、日付メソッドが二重波括弧内でネイティブに動作し、日付フォーマットにはLuxonが利用可能です。オプショナルチェイニングやnullish合体演算子のような安全なアクセスパターンが、一貫性のないアップストリームデータに対してもワークフローを堅牢に保ちます。変換ロジックが数回のチェーン操作を超えて肥大化する場合、Codeノードが正しい道具です — 式はそれ以外すべてをカバーします。

レッスンの練習

レッスンのチェックポイント

学んだ内容を復習し、回答へのフィードバックを受けましょう。

0/1
回答済み · 0/1
レッスン2:式とデータ変換の取り扱い