この記事でできること (TL;DR)
本記事では、 n8nのJavaScript Codeノードを中心に、実務で頻出する5つの自動化タスクを組み合わせた 「実務自動化フルセット」 のワークフローを構築します。
- 要約: 長文テキスト(例: ニュース記事、議事録)をGPT系APIで自動要約
- 抽出: 要約文から主要キーワードを自動抽出
- 通知: 結果をSlackにリアルタイム通知
- レポート: 日々の結果をGoogleスプレッドシートに蓄積
- 監視: 処理結果が正常かどうかをチェックし、異常があればアラート
すべての主要ロジックをコピペ可能なコードスニペットとして提供するため、すぐにあなたの業務に応用できます。
はじめに
こんにちは!Qiitaでは主にAPI連携や業務自動化に関する記事を投稿している @YushiYamamoto です。
n8nの魅力は豊富な標準ノードにありますが、実務の細かい要件に応えようとすると、「この部分だけ、ちょっとしたロジックを書きたい…」という場面が必ず出てきます。そんな時に絶大な威力を発揮するのがJavaScript Codeノードです。
この記事では、Codeノードを使いこなし、ノーコードの手軽さとコードの柔軟性を両立させた、実践的な自動化ワークフローの作り方を解説します。
ワークフロー全体像
今回構築するワークフローの全体像は以下の通りです。トリガー(定期実行やWebhook)を起点に、一連の処理が順番に実行されます。
前提となる環境設定
ワークフローを動かす前に、以下の設定を済ませておいてください。
-
n8n Credentials:
-
OpenAI API:
apiKey
を設定 - Google Sheets OAuth2: Googleアカウントと連携
-
OpenAI API:
-
環境変数 (
.env
):-
SLACK_WEBHOOK_URL
: SlackのIncoming Webhook URL -
SHEET_ID
: 結果を記録するGoogleスプレッドシートのID -
MONITOR_THRESHOLD
: 監視用の閾値(例:3
)
-
3. 各ノードの設定とコードスニペット
Step 1: テキスト要約 (JavaScript Codeノード)
- 目的: 入力された長文テキストを、GPT系APIを使って200字以内に要約します。
-
入力:
items[0].json.text
に要約したいテキストが入っている想定です。 -
設定:
Execute Once
モードで実行します。
// OpenAIのライブラリをインポート
const { OpenAI } = require('openai');
// CredentialsからAPIキーを取得して初期化
const openai = new OpenAI({ apiKey: credentials.openAi.apiKey });
// メインの処理
try {
const response = await openai.chat.completions.create({
model: 'gpt-3.5-turbo',
messages: [
{ role: 'system', content: '以下のテキストを、重要なポイントを3つに絞り、200字以内で要約してください。' },
{ role: 'user', content: items[0].json.text }
]
});
// 結果を後続ノードで使えるようにitemsに追加
items[0].json.summary = response.choices[0].message.content;
} catch (error) {
console.error('OpenAI API Error:', error);
// エラーが発生した場合、後続の処理を止める
throw new Error('テキスト要約に失敗しました。');
}
return items;
Step 2: キーワード抽出 (JavaScript Codeノード)
- 目的: Step 1で生成された要約文から、主要なキーワードを抽出します。
-
入力:
items[0].json.summary
- ロジック: 正規表現で4文字以上の単語を抽出し、出現頻度が高い上位5つをキーワードとします。
const text = items[0].json.summary;
// 4文字以上の単語を抽出 (正規表現)
const words = text.match(/\b[^\s,.、。「」]{4,}\b/g) || [];
// 単語の出現頻度をカウント
const freq = {};
words.forEach(word => {
freq[word] = (freq[word] || 0) + 1;
});
// 頻度が高い順にソートし、上位5つを取得
const keywords = Object.entries(freq)
.sort((a, b) => b[1] - a[1])
.slice(0, 5)
.map(entry => entry[0]);
items[0].json.keywords = keywords;
return items;
Step 3: Slack通知 (Slackノード)
- 目的: 要約結果と抽出キーワードをSlackに通知します。
-
設定:
-
Authentication:
Webhook
-
Webhook URL (Expression):
{{ $env.SLACK_WEBHOOK_URL }}
- Text:
*【自動要約レポート】* *要約:* {{ $json.summary }} *主要キーワード:* - {{ $json.keywords.join('\n- ') }}
-
Authentication:
Step 4: レポート記録 (Google Sheetsノード)
- 目的: 日々の処理結果をGoogleスプレッドシートに追記し、データを蓄積します。
-
設定:
-
Authentication:
OAuth2
-
Operation:
Append
-
Spreadsheet ID (Expression):
{{ $env.SHEET_ID }}
-
Sheet Name:
DailyReport
(事前に作成しておく) -
Columns > Add Column:
-
Header:
Date
, Value (Expression):{{ $now.toFormat('yyyy-MM-dd HH:mm') }}
-
Header:
Summary
, Value (Expression):{{ $json.summary }}
-
Header:
Keywords
, Value (Expression):{{ $json.keywords.join(', ') }}
-
Header:
-
Authentication:
Step 5: 監視チェック (JavaScript Codeノード)
- 目的: 処理結果が期待通りか(キーワードが十分に抽出できているか)をチェックします。
- ロジック: 抽出されたキーワード数が環境変数で設定した閾値未満の場合、意図的にエラーを発生させます。
// 環境変数から閾値を取得 (未設定の場合はデフォルトで3)
const threshold = parseInt(process.env.MONITOR_THRESHOLD, 10) || 3;
const keywordCount = items[0].json.keywords.length;
if (keywordCount < threshold) {
// 閾値未満の場合、エラーを発生させる
throw new Error(`キーワード抽出数が閾値未満です。(抽出数: ${keywordCount}, 閾値: ${threshold})`);
}
// 正常な場合はそのままデータを返す
return items;
Step 6: エラーハンドリング (Error Trigger + Webhook)
- 目的: Step 5などでエラーが発生した場合に、別のWebhook(例: PagerDuty, Opsgenieなど)を呼び出し、障害として通知します。
-
設定:
- Error Triggerノード: ワークフロー全体のエラーを捕捉するトリガーを別途作成します。
-
HTTP Requestノード:
-
Method:
POST
- URL: 障害通知用のWebhook URL
-
Body Content Type:
JSON
- Body (Expression):
{ "text": "❗️n8nワークフローでエラー発生:\n> ワークフロー名: {{ $json.workflow.name }}\n> エラーメッセージ: {{ $json.error.message }}" }
-
Method:
4. 運用と拡張のポイント
-
複数テキストの処理: トリガーで複数のテキストを受け取った場合は、
SplitInBatches
ノードで1件ずつ処理するように分割すると、APIへの負荷を分散できます。 - レポートの可視化: Googleスプレッドシートに蓄積したデータを、Looker StudioやGASを使ってグラフ化し、週次・月次レポートを自動生成することも可能です。
- 異常検知の高度化: 監視チェックのロジックをより高度にし、キーワードのトレンド差分(前日比)などを分析して、よりインテリジェントなアラートを実装できます。
まとめ
本記事では、n8nのJavaScript Codeノードを駆使して、「要約→抽出→通知→レポート→監視」という一連の実務自動化フローを構築しました。
標準ノードだけでは難しい細かなデータ加工や条件分岐も、JavaScriptを組み合わせることで自由自在に実現できます。ぜひ、このフルセットをベースに、あなたの業務に合わせた最強の自動化ワークフローを構築してみてください。
最後までお読みいただきありがとうございました!この記事が役に立ったと思ったら、ぜひLGTMをお願いします!