1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【コピペで即稼働】n8nで作る実務自動化フルセット:要約→抽出→通知→レポート→監視

Posted at

この記事でできること (TL;DR)

本記事では、 n8nのJavaScript Codeノードを中心に、実務で頻出する5つの自動化タスクを組み合わせた 「実務自動化フルセット」 のワークフローを構築します。

  1. 要約: 長文テキスト(例: ニュース記事、議事録)をGPT系APIで自動要約
  2. 抽出: 要約文から主要キーワードを自動抽出
  3. 通知: 結果をSlackにリアルタイム通知
  4. レポート: 日々の結果をGoogleスプレッドシートに蓄積
  5. 監視: 処理結果が正常かどうかをチェックし、異常があればアラート

すべての主要ロジックをコピペ可能なコードスニペットとして提供するため、すぐにあなたの業務に応用できます。

はじめに

こんにちは!Qiitaでは主にAPI連携や業務自動化に関する記事を投稿している @YushiYamamoto です。

n8nの魅力は豊富な標準ノードにありますが、実務の細かい要件に応えようとすると、「この部分だけ、ちょっとしたロジックを書きたい…」という場面が必ず出てきます。そんな時に絶大な威力を発揮するのがJavaScript Codeノードです。

この記事では、Codeノードを使いこなし、ノーコードの手軽さとコードの柔軟性を両立させた、実践的な自動化ワークフローの作り方を解説します。

ワークフロー全体像

今回構築するワークフローの全体像は以下の通りです。トリガー(定期実行やWebhook)を起点に、一連の処理が順番に実行されます。

前提となる環境設定

ワークフローを動かす前に、以下の設定を済ませておいてください。

  • n8n Credentials:
    • OpenAI API: apiKeyを設定
    • Google Sheets OAuth2: Googleアカウントと連携
  • 環境変数 (.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- ') }}
    

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(', ') }}

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 }}"
      }
      

4. 運用と拡張のポイント

  • 複数テキストの処理: トリガーで複数のテキストを受け取った場合は、SplitInBatchesノードで1件ずつ処理するように分割すると、APIへの負荷を分散できます。
  • レポートの可視化: Googleスプレッドシートに蓄積したデータを、Looker StudioやGASを使ってグラフ化し、週次・月次レポートを自動生成することも可能です。
  • 異常検知の高度化: 監視チェックのロジックをより高度にし、キーワードのトレンド差分(前日比)などを分析して、よりインテリジェントなアラートを実装できます。

まとめ

本記事では、n8nのJavaScript Codeノードを駆使して、「要約→抽出→通知→レポート→監視」という一連の実務自動化フローを構築しました。

標準ノードだけでは難しい細かなデータ加工や条件分岐も、JavaScriptを組み合わせることで自由自在に実現できます。ぜひ、このフルセットをベースに、あなたの業務に合わせた最強の自動化ワークフローを構築してみてください。

最後までお読みいただきありがとうございました!この記事が役に立ったと思ったら、ぜひLGTMをお願いします!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?