n8nで前のノードのJSONをGmail本文に埋め込む方法|$jsonとExpressionの基本

「n8nで前のノードのJSONをGmail本文に埋め込む方法|$jsonとExpressionの基本」の内容を表す技術イラスト

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の処理全体がかなり理解しやすくなります。

参考になったらシェアしてください
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

機械設計・油圧・CAD・Python・AIなど、ものづくりに関わる技術を扱っています。工学知識を整理・構造化し、設計や自動化に再利用できる形へ変えていくことを目指しています。

目次