0
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でRSSフィードを取得してGoogleスプレッドシートに自動記録する実践ガイド

0
Posted at

AI時代における業務自動化への関心が高まる中、開発者でなくてもワークフローを構築できるn8nが注目されています。特に、情報収集からデータ蓄積まで一連の流れを自動化できれば、日々のルーティンワークから解放され、より創造的な業務に集中できるでしょう。今回は、RSSフィードの情報を定期的に取得し、Googleスプレッドシートに自動記録するワークフローを実際に構築していきます。

n8nとは

n8nは、オープンソースのワークフロー自動化ツールです。ノードベースのビジュアルエディタを使って、APIの呼び出しやデータ変換、通知送信などを組み合わせたワークフローを作成できます。

主な特徴

  • 視覚的な操作: ドラッグ&ドロップでノードを配置し、線で繋ぐだけ
  • 豊富な連携: 400以上のサービスとの統合が可能
  • 自由度の高いカスタマイズ: JavaScriptコードも記述可能
  • セルフホスト可能: 自分のサーバーで運用できるため、データの機密性を保てる

環境構築

Docker Composeでのセットアップ

最も簡単にn8nを起動する方法はDocker Composeを使用することです。

version: '3.8'

services:
  n8n:
    image: n8nio/n8n:latest
    container_name: n8n
    ports:
      - "5678:5678"
    environment:
      - N8N_BASIC_AUTH_ACTIVE=true
      - N8N_BASIC_AUTH_USER=admin
      - N8N_BASIC_AUTH_PASSWORD=changeme123
      - N8N_HOST=localhost
      - N8N_PORT=5678
      - N8N_PROTOCOL=http
      - WEBHOOK_URL=http://localhost:5678/
    volumes:
      - n8n_data:/home/node/.n8n
      - /var/run/docker.sock:/var/run/docker.sock

volumes:
  n8n_data:

以下のコマンドで起動します。

docker-compose up -d

起動後、http://localhost:5678にアクセスすると、n8nの管理画面にログインできます。

Google Sheets APIの設定

Googleスプレッドシートにデータを書き込むために、Google Cloud PlatformでAPIを有効化し、認証情報を取得します。

1. Google Cloud Platformでの設定

  1. Google Cloud Consoleにアクセス
  2. 新しいプロジェクトを作成または既存プロジェクトを選択
  3. APIとサービス > ライブラリから「Google Sheets API」を有効化
  4. 認証情報を作成 > サービスアカウントを選択
  5. サービスアカウントキー(JSON形式)をダウンロード

2. スプレッドシートの準備

  1. 新しいGoogleスプレッドシートを作成
  2. 以下のヘッダーを設定(A1セルから):
    • A1: タイトル
    • B1: URL
    • C1: 公開日
    • D1: 取得日時
  3. サービスアカウントのメールアドレスに共有権限(編集者)を付与

ワークフローの構築

ステップ1: RSS Feedノードの設定

新しいワークフローを作成し、「RSS Feed Read」ノードを配置します。

設定項目:

  • URL: 取得したいRSSフィードのURL(例:https://zenn.dev/feed
  • Limit: 一度に取得する記事数(例:10

ステップ2: データ変換ノードの追加

RSSから取得したデータをスプレッドシート用の形式に変換するため、「Code」ノードを追加します。

// RSS データを Sheets 形式に変換
const items = [];

for (const item of $input.all()) {
  const rssData = item.json;
  
  // 日付のフォーマット
  const publishedDate = new Date(rssData.pubDate || rssData.published);
  const currentDate = new Date();
  
  items.push({
    json: {
      title: rssData.title || '',
      url: rssData.link || rssData.guid || '',
      publishedDate: publishedDate.toISOString().split('T')[0],
      fetchedAt: currentDate.toLocaleString('ja-JP', {
        timeZone: 'Asia/Tokyo'
      })
    }
  });
}

return items;

ステップ3: 重複チェックの実装

既に記録済みの記事を除外するため、まず既存データを読み込みます。「Google Sheets」ノードを追加し、以下のように設定します。

操作設定:

  • Resource: Sheet
  • Operation: Read
  • Document ID: スプレッドシートのIDを入力
  • Sheet Name: シート1(または使用するシート名)

次に、重複を除外する「Code」ノードを追加します。

// 既存データと新しいデータから重複を除外
const existingItems = $node["Google Sheets"].json;
const newItems = $node["Code"].json;

// 既存URLのセットを作成
const existingUrls = new Set();
if (existingItems && existingItems.length > 0) {
  existingItems.forEach(item => {
    if (item.URL) {
      existingUrls.add(item.URL);
    }
  });
}

// 新しいアイテムから重複を除外
const uniqueItems = [];
newItems.forEach(item => {
  if (!existingUrls.has(item.url)) {
    uniqueItems.push({
      json: {
        values: [
          [item.title, item.url, item.publishedDate, item.fetchedAt]
        ]
      }
    });
  }
});

return uniqueItems;

ステップ4: スプレッドシートへの書き込み

新しいデータをスプレッドシートに追加する「Google Sheets」ノードを配置します。

操作設定:

  • Resource: Sheet
  • Operation: Append
  • Document ID: スプレッドシートのID
  • Sheet Name: シート1
  • Data: Define Below
  • Values: ={{ $json.values }}

認証設定:
先ほどダウンロードしたサービスアカウントキー(JSON)の内容を貼り付けます。

ステップ5: スケジュール実行の設定

定期実行のために「Schedule Trigger」ノードを追加し、RSS Feed Readノードの前に配置します。

設定例:

  • Trigger Interval: Hours
  • Hours Between Triggers: 6

これにより6時間ごとに自動実行されます。

実際のハマりポイントと対策

1. 文字化け問題

RSSフィードによっては文字エンコーディングの問題が発生する場合があります。

// 文字エンコーディングの対策
const title = rssData.title ? 
  decodeURIComponent(escape(rssData.title)) : '';

2. 日付フォーマットの統一

RSSフィードの日付フォーマットは標準化されていないことがあります。

// より堅牢な日付パース
function parseDate(dateString) {
  if (!dateString) return new Date();
  
  const date = new Date(dateString);
  if (isNaN(date.getTime())) {
    // フォールバック処理
    return new Date();
  }
  return date;
}

const publishedDate = parseDate(rssData.pubDate || rssData.published);

3. APIレート制限対策

Google Sheets APIにはレート制限があるため、大量データを処理する場合はバッチ処理を検討してください。

// バッチ処理での書き込み
const batchSize = 10;
const batches = [];

for (let i = 0; i < uniqueItems.length; i += batchSize) {
  batches.push(uniqueItems.slice(i, i + batchSize));
}

return batches.map(batch => ({
  json: {
    values: batch.map(item => item.values[0])
  }
}));

トラブルシューティング

よくあるエラーと解決方法

エラー: Google Sheets API has not been used in project
解決方法: Google Cloud ConsoleでGoogle Sheets APIが有効化されているか確認してください。

エラー: The caller does not have permission
解決方法: サービスアカウントに適切な権限が付与されているか、スプレッドシートの共有設定を確認してください。

エラー: RSS feed could not be fetched
解決方法: RSSフィードのURLが正しいか、フィード配信サイトがアクセス可能かを確認してください。

運用上の考慮事項

ログとモニタリング

本格運用では、エラーハンドリングとログ出力を追加することを推奨します。

try {
  // メイン処理
  const result = processRSSData(rssData);
  console.log(`成功: ${result.length}件の新しい記事を処理しました`);
  return result;
} catch (error) {
  console.error(`エラー発生: ${error.message}`);
  // エラー通知の実装(Slack、メールなど)
  return [];
}

データバックアップ

重要なデータを扱う場合は、定期的なバックアップ機能も併せて実装しましょう。

このワークフローにより、関心のあるサイトの更新情報を自動的に収集し、構造化されたデータとして蓄積できます。収集したデータは後でフィルタリングや分析にも活用できるため、情報収集の効率が大幅に向上します。n8nの柔軟性を活かして、さらなる自動化や他サービスとの連携にも挑戦してみてください。

0
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
0
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?