n8nでワークフローを作っていると、前のノードで取得・加工したJSONデータを、そのままメール本文へ入れたくなることがあります。
たとえば、
データ取得
↓
データ加工
↓
Gmailで送信
というワークフローです。
このとき、Gmailノードへ固定文字列を入力するだけではなく、前のノードから渡されたデータを動的に本文へ埋め込むには、n8nの Expression を使用します。
この記事では、前のノードのJSONをGmail本文へ埋め込む方法を通して、n8nで重要な $json とExpressionの基本を整理します。
n8nではノード間をJSONデータが流れる
n8nでは、ノードからノードへデータが渡されます。
イメージとしては次のようになります。
前のノード
{
"name": "Taro",
"result": "OK"
}
↓
Gmailノード
↓
メール本文
名前: Taro
結果: OK
Gmailノード側から、この入力データを参照するために使用する代表的な変数が $json です。
たとえば、前のノードから次のデータが渡されているとします。
{
"name": "Taro",
"result": "OK"
}
name を取得したい場合は、
{{ $json.name }}
と記述します。
result なら、
{{ $json.result }}
です。
つまり、
$json
は、現在のノードへ渡されてきたJSONデータを参照するための基本的な入口と考えると分かりやすいです。
まず前のノードを実行する
Gmailノードを開いたときに、
No input data
と表示されていることがあります。
これは、Gmailノードへ渡される入力データがまだ存在していない状態です。
この場合は、先に前段のノードを実行します。
Gmailノードの画面から Execute previous nodes を実行すると、前のノードまでが実行され、GmailノードのINPUT欄にJSONデータが表示されます。
Expressionを設定するときは、先に入力データを表示させておくと非常に分かりやすくなります。
GmailノードのMessageをExpressionで設定する
Gmailノードでは、メール本文を入力する Message 項目があります。
通常の固定テキストだけでなく、n8nの式を使いたい場合はExpressionを利用します。
Message欄でExpressionを使用できる状態にすると、
{{ }}
の中へJavaScriptベースの式を記述できます。
ここから前ノードのJSONデータを参照できます。
JSONの特定項目だけをメール本文へ入れる
たとえば入力データが次の内容だったとします。
{
"name": "Taro",
"result": "OK"
}
メール本文を、
名前: Taro
結果: OK
としたい場合は、Messageに次のように記述できます。
名前: {{ $json.name }}
結果: {{ $json.result }}
HTMLメールの場合は、たとえば次のようにも書けます。
名前: {{ $json.name }}<br>
結果: {{ $json.result }}
固定テキストとExpressionを組み合わせられるのがポイントです。
つまり、
固定文字列
+
動的データ
という形でメール本文を組み立てられます。
JSON全体をメール本文へ入れる
デバッグや処理結果の確認では、JSONの一部ではなく、JSON全体をメールで確認したい場合があります。
単純に、
{{ $json }}
とすると、期待した形式の文字列にならないことがあります。
そこでJavaScriptの JSON.stringify() を使います。
{{ JSON.stringify($json) }}
これでJSONオブジェクトを文字列へ変換できます。
JSONを見やすく整形する
さらに、メールで確認しやすい形に整形したい場合は、
{{ JSON.stringify($json, null, 2) }}
とします。
null, 2 を指定することで、インデント付きの読みやすいJSONになります。
たとえば、
{
"name": "Taro",
"result": "OK"
}
のような形式で出力できます。
ワークフローのデバッグ結果やAPIレスポンスなどをメールで確認するときに便利です。
HTMLメールならpreタグを使う
GmailノードのメールタイプをHTMLにしている場合、JSONをそのまま本文へ表示すると改行やスペースが崩れることがあります。
その場合は <pre> タグで囲みます。
<pre>{{ JSON.stringify($json, null, 2) }}</pre>
<pre> は空白や改行を維持して表示するため、JSONの確認に向いています。
ただし、単純にJSONの内容を確認したいだけなら、最初はText形式で試した方が構造を理解しやすいでしょう。
INPUTからドラッグ&ドロップする方法
Expressionをすべて手入力する必要はありません。
前のノードを実行すると、GmailノードのINPUT欄に入力データが表示されます。
そこに、
name
result
email
title
などの項目が表示されている場合、それらをMessage欄へドラッグ&ドロップできます。
n8nが自動的に、
{{ $json.name }}
のようなExpressionを生成してくれます。
最初のうちは、この方法を使うとExpressionの書き方を覚えやすくなります。
$json → Expression → Gmailという流れ
今回の処理を整理すると、次のようになります。
前ノード
↓
JSON
↓
$json
↓
Expression
↓
Message
↓
Gmail
重要なのはGmailそのものではありません。
n8nでは、前段で作ったデータを後段ノードで参照し、必要に応じて加工して利用します。
Gmailは、その出力先の一例です。
同じ考え方は、
Slack
Notion
Google Sheets
HTTP Request
Discord
データベース
などでも利用できます。
$jsonの特定フィールドを取得する
基本形は、
{{ $json.キー名 }}
です。
たとえば、
{
"title": "n8n Test",
"status": "success",
"count": 5
}
なら、
{{ $json.title }}
で、
n8n Test
を取得できます。
同様に、
{{ $json.status }}
なら、
success
です。
JSON.stringifyはなぜ必要なのか
JSONデータは、n8n内部では単なる文章ではなく、構造を持ったデータとして扱われています。
たとえば、
{
"name": "Taro",
"result": "OK"
}
は、
ただの文字列
ではなく、
オブジェクト
です。
メール本文は最終的には文字として送る必要があります。
そこで、
JSON.stringify()
を使って、
JavaScriptオブジェクト
↓
文字列
へ変換しています。
この違いを理解すると、n8nのデータ処理がかなり分かりやすくなります。
JSONを扱うときは「値」と「構造」を区別する
n8nを使い始めたときに混乱しやすいのが、
{{ $json.name }}
と、
{{ JSON.stringify($json, null, 2) }}
の違いです。
前者はJSONの中から特定の値を取得しています。
$json
↓
nameだけ取得
↓
Taro
後者はJSON全体を文字列へ変換しています。
$json
↓
JSON全体
↓
整形された文字列
目的によって使い分けます。
通常のメール通知なら必要なフィールドだけを取り出し、
処理名: {{ $json.name }}
結果: {{ $json.result }}
とした方が読みやすくなります。
一方、デバッグやログ確認なら、
{{ JSON.stringify($json, null, 2) }}
が便利です。
複数itemsの場合は注意する
n8nを理解するうえで重要なのが item です。
n8nでは、1つのJSONだけでなく複数のデータがノード間を流れることがあります。
たとえば、
[
{
"name": "A"
},
{
"name": "B"
},
{
"name": "C"
}
]
のようなデータです。
この場合、
{{ $json.name }}
は基本的に現在処理しているitemの name を参照します。
つまり、データの流れによってはGmailノードが複数回処理され、複数通のメールが送信される可能性があります。
「複数itemを1通のメールへまとめたい」という場合は、事前にデータを1つへまとめる処理が必要になります。
この、
JSON
↓
item
↓
複数items
という考え方は、n8nを使ううえで非常に重要です。
Gmailへ送る処理からn8nの基本構造が見える
今回行った処理自体は単純です。
JSONを取得
↓
Expressionで参照
↓
Gmail本文へ埋め込み
↓
送信
しかし、この中にはn8nの重要な考え方がいくつも含まれています。
- ノード間をJSONが流れる
$jsonで現在のデータを参照する- Expressionでデータを加工する
- 必要な値だけ取り出す
- オブジェクトを文字列化する
- 出力ノードへ渡す
Gmailはその確認にちょうどよいノードです。
この仕組みが理解できると、
APIからデータ取得
↓
必要な情報を加工
↓
条件判定
↓
Slack通知
↓
Notionへ保存
↓
メール送信
といった、より複雑なワークフローも同じ考え方で組み立てられるようになります。
まとめ
n8nで前のノードのJSONデータをGmail本文へ埋め込むには、Message欄でExpressionを使用します。
特定の値を取得する基本形は、
{{ $json.name }}
です。
JSON全体を文字列として出力するなら、
{{ JSON.stringify($json) }}
見やすく整形するなら、
{{ JSON.stringify($json, null, 2) }}
を使います。
HTMLメールで整形を保つ場合は、
<pre>{{ JSON.stringify($json, null, 2) }}</pre>
という形も利用できます。
今回重要なのは、単に「GmailへJSONを送れた」ということではありません。
前ノードのデータ
↓
$json
↓
Expression
↓
次のノード
というn8nの基本的なデータフローを理解できる点です。
この仕組みを理解すると、Gmailだけでなく、Slack、Notion、Google Sheets、HTTP APIなど、さまざまなサービスへ同じ考え方を応用できます。
n8nでは「ノードをつなぐ」こと以上に、「ノード間をどのデータが流れているか」を理解することが重要です。
JSONとExpressionを意識してワークフローを見ると、n8nの処理全体がかなり理解しやすくなります。

