初めての本格的n8nワークフロー ③

n8nによる「本格的ワークフロー」のハンズオン第3回です。
今回はCodeノードについて見ていきます。
なお、前回までで、下記の内容を実装してきました。

  • クリックトリガーノードの設置
  • HTTP Requestノードによるブログ記事の取得
  • 2つのHTMLノードによるHTMLのparse。連想配列で扱えるように。

ここまでで作成したワークフローは下図のとおりです。


ワークフローの現時点の出力、つまり、これから作成するノードの入力は下記のようなものです。
ブログのサムネイルページからスクレイピングで取得した記事の情報が、記事ごとにタイトル・記事本文URL・公開日が連想配列で保持されており、全体として配列で扱える状態になっています。

[
  { // 1番めのブロックのparse済情報のHash
    "articleTitle": "Gmailの新しいガイドライン:新しいメール要件を満たすには?",
    "articleURL": "https://blog.future.ad.jp/gmailの新しいガイドライン新しいメール要件を満たすには",
    "articleDate": "2024-06-11"
    },
    { // 2番めのブロックのparse済情報のHash
               ・・・・
    },

               ・・・・

    { // n番めのブロックのparse済情報のHash
               ・・・・
    }
]

ブログのサムネイルページからスクレイピングで取得した記事の情報が、記事ごとにタイトル・記事本文URL・公開日が連想配列で保持されており、全体として配列で扱える状態になっています。

5. Codeノード:データの整形・取捨選択・ソート

後続の処理をやりやすくするために、さらにデータを調整・精査していきます。
具体的には、下記を実施します。

  • 重複をチェック。排除。
  • 公開日付をDateオブジェクトに変換
  • 公開日付によるデータの降順ソート
  • 取得する件数を絞り込む

例によって、既存ワークフローの右側『+』に、新しくCodeノードを接続していきましょう。

Codeノードの設定が開きます。
まずは、ModeとLanguageを選択していきます。

  • Mode:Run Once for All Items
  • Language:JavaScript
Codeノードの動作モード

Modeは2つから選択します。

■Run Once for all Items
記述したプログラムが1度だけ動作します。
入力値が配列等で複数item存在している場合でも、1度だけ実行されます。
特殊変数$inputには、前ノードの出力値が(少し語弊がありますが)全て渡されます。

■Run Once for each Item
入力値が複数存在している場合、その回数分だけプログラムが実行されます。
つまり、暗黙的なループ処理となります。
特殊変数$inputには、前ノードから渡された入力値としての配列を、先頭から順に取り出した値が格納されます。

今回は暗黙的なLoopではなく、自前で細かく処理を行いたいので、「Run Once for All Items」を選択肢、記述するJavaScriptコードの中で明示的にループ処理を行います。

Codeノードへのソースコード記述

プログラムする言語はJavaScriptとPythonが選択できますが、Pythonは一応βの扱いなので、今回はJavaScriptを選択しておきます。(2025年10月時点)

const customOutput = []; // Output用配列
const checkArray = [];   // URL重複チェック用
const returnNum = 7;     // 新しい記事から◯件返す

// 重複チェックで重複を排除しつつ、Output用の配列を作る
for (const item of $input.all()) {
  if(! checkArray.includes(item.json["articleURL"])) {
    
    // 後続の処理のために、記事公開日付をDateオブジェクトにしておく
    item.json.objDate = new Date(item.json["articleDate"] || 0);
    
    customOutput.push(item.json);
    checkArray.push(item.json["articleURL"]);
  }
}

// 記事公開日付でOutput用配列をソート
customOutput.sort((a,b) => b.objDate - a.objDate);

return customOutput.slice(0,returnNum).map(r => r);

製品レベルでの開発であれば、各連想配列内で値が存在していないケースなどを考慮した記述が必要ですが、今回はスクレイピングやJavaScriptコードの解説が主ではないので、ほぼ正常系だけのシンプルな記述にしています。

Codeノードで使える特殊変数

■$input:カレントノードへの入力オブジェクト

文字通り、カレントCodeノードへの入力値が格納されています。
ただし、値がそのまま格納されているのではなく、n8nの入力値オブジェクトです。
上記で解説したCodeノードのModeにより、振る舞いが異なっています。

「Run Once for all Items」(1回だけ動作)モードの場合は、$inputには、入力値の全Itemが含まれていて、下記のような関数を用いて各値にアクセスします。

  • items = $input.all(): 全アイテムを配列で取得します。
  • item = $input.first():最初のアイテムを取得します。
  • item = $input.last():最後のアイテムを取得します。

「Run Once for each Item」(アイテムの数だけ動作)モードの場合は、$inputには、各アイテムの値がループでそれぞれ渡されます。この場合は、下記の関数で値にアクセスします。

  • item = $input.item:カレントアイテムを取得します。

このitem自体もオブジェクトなので、生の値をJSON形式で取得するには

  • $item.json

で取り出します。

$input.items.jsonと同義の $json という特殊変数も用意されています。
また、 $input.params で「直前ノードのパラメーター」(つまり直前ノードの設定値)を取得できたりします。


■$('前処理ノード名'):「過去」の処理済みノードの「出力値」オブジェクト

今回の例でいうと、 $('Http Request') でHttp Requestノードの出力値を、$('HTML') で1つめのHTMLノードの出力値を、このCodeノードのなかで取得できます。
ちなみに、$('HTML get-list') は直前のノードに相当するため、$('HTML get-list') と $input は等価です。

この特殊変数の存在により、Codeノードは処理済みの過去のノードの出力値の全てにアプローチできるため、柔軟な処理を記述することができます。
ただし、キャンバスで見えているワークフローの流れを無視したデータ処理を多用すると、ワークフローとしての見通しが悪くなり、n8nを利用しているメリットが低下していくことになるため注意が必要です。

なお、これら$input や $('....') などの特殊変数は Codeノードだけでなく、コードが記述可能な場所であれば、あらゆるノードで利用可能です。つまりexpressions が選択できてコードが書ける場所であれば、どこでも利用できます。

 

試運転してみる

ここまでの設定をしたうえで、「Execute Step」で試運転してみましょう。

右辺に期待した結果が出力されている事を確認しましょう。
この例では、Dateオブジェクトが各アイテムに追加されていて、降順ソートした上で上位7件に絞り込まれていることがわかります。

キャンバス上でも、データが 12items → 7items と、Codeノード通過後に変化していることが見て取れます。

このようにCodeノードにおいて、JavaScriptやpythonで自由にコードを書き、柔軟な処理を行わせることが出来るところが、n8nの強力なところであり、エンジニア向けのワークフローツールと言われる所以でもあります。

今回はここまでにしましょう。次回はLoopを扱っていきます。

  • トリガーの設置【Done】
  • 特定のURLから内容を取得する ▶ HTTP Request ノード【Done】
  • HTMLから要素を部会・取得する ▶ HTMLノード【Done】
  • 配列データの扱い方と暗黙的ループ処理【Done】
  • コードによる自由な処理 ▶ Codeノード【Done:今回解説】
  • 明示的なループ処理 ▶ Loopノード → NEXT
  • フィールド生成・制御 ▶ MakeFieldsノード
  • AIノードへの情報連携 ▶ Basic LLM Chain
  • 処理済みの任意ノードの値の活用する【Done:今回解説】
  • Googleスプレッドシートへのレコード出力 ▶ Google Sheetノード
  • Google Sheet API への アクセス許可の手順 ▶ Google Sheets account 設定