Contents
前提条件と必要アカウント
Feedly と Notion をシームレスに連携させるには、まず 利用できるプランと権限 が揃っていることを確認する必要があります。
本セクションでは、各サービスで最低限必須となるアカウント種別と、実装前にチェックすべき項目をまとめます。
必要なアカウント
以下のアカウントが揃っていれば、ノーコードツール(Zapier/Make)または自作スクリプトで連携を構築できます。
| アカウント種別 | 必須プラン | 主な取得方法・備考 |
|---|---|---|
| Feedly | Premium 以上※1 | API キーは「設定 → インテグレーション」から取得。Free プランでは streams エンドポイントが利用不可です。 |
| Notion | 無料プランでも可 | 「Settings & Members → Integrations」で Internal Integration Token を作成し、対象データベースに「Edit」権限を付与。 |
| Zapier / Make | 無料プランで OK※2 | それぞれの公式料金ページをご確認ください。無料枠でも月数十件程度の自動化は十分に実行可能です。 |
前提条件チェックリスト
| 項目 | 必要な設定 | 確認ポイント |
|---|---|---|
| Feedly アカウント | Premium 以上 | プランページで「Premium」または「Enterprise」か確認 |
| Notion ワークスペース | API 利用可(無料でも可) | 「Integrations」でトークン取得できるか、対象データベースに共有設定があるか |
| Zapier / Make アカウント | 無料プランで OK | ログイン後の「プランと使用状況」からタスク/操作上限を確認 |
重要ポイントまとめ
- Feedly の API(
/v3/streams/*)は有料プラン限定です。 - Notion の API トークンは必ず環境変数やシークレット管理ツールで保管してください。
- Zapier と Make は無料枠でも十分ですが、タスク/操作上限が変動する点に留意し、公式ページを随時チェックしましょう。
Notion API とデータベース設計
このセクションでは、Notion 側で必要となるインテグレーション作成手順と、実際に保存するデータベースの構造例を解説します。
適切なプロパティ設計は後続の自動化フローで マッピングエラー を防ぎ、検索性・可視性を高めます。
インテグレーション作成手順
- Notion にログイン → 左サイドバーの Settings & Members → Integrations
- + New integration をクリックし、名前(例:
Feedly‑Notion Bridge)と対象ワークスペースを選択 - Capabilities で「Read content」+「Insert content」にチェックを入れ、Submit
- 表示された Internal Integration Token をコピーし、安全な場所に保存
⚡️ ポイント:トークンはコードや Git にハードコーディングせず、Google Apps Script の
PropertiesServiceなどで管理しましょう。
データベースプロパティ設定例
以下の構成は「記事を検索しやすく」かつ「表示が見やすい」ことを前提に設計しています。必要最小限のプロパティだけ作り、後から追加する方が API マッピングが楽です。
| プロパティ名 | タイプ | 説明 |
|---|---|---|
| Title | Title | Feedly の記事タイトル |
| URL | URL | 記事への直接リンク |
| Tags | Multi‑select | Feedly のタグや自分で付与したキーワード |
| Saved Date | Date | Notion に保存された日時(自動設定) |
| Excerpt | Text | 2000文字以内の要約※3 |
| Cover Image | Files & media | サムネイル画像(任意) |
- Text プロパティの文字数上限は 2,000 文字です(Notion 開発者ドキュメント参照)。長文は
Excerptに切り詰め、全文は別ファイルやページへのリンクで管理すると良いでしょう。
Zapier で実現する Feedly → Notion 自動連携
Zapier は UI がシンプルで初心者向けですが、機能面では十分にカスタマイズ可能です。ここでは「新規保存記事」をトリガーに Notion データベースへ自動登録するフローを構築します。
Zap の作成と Feedly Trigger 設定
- Zapier ダッシュボードで Make a Zap をクリック
- Trigger App に Feedly を選択し、イベントは New Saved Article を指定
- Feedly アカウントを接続 → 対象の Saved Articles フィード(例:
/v3/streams/contents?streamId=user/...)を選ぶ
⚙️ 注記:Feedly の RSS エンドポイントは
https://cloud.feedly.com/v3/streams/contents?streamId=...&unreadOnly=falseで、OAuth2 ベアラートークンが必須です(Premium プラン以上で取得可能)。
フィルタ条件と Notion Action のマッピング方法
| Feedly データ | Notion プロパティ |
|---|---|
| title | Title |
| alternate[0].href (URL) | URL |
| tags (カンマ区切り) | Tags(Multi‑select) |
| published | Saved Date |
| summary.content | Excerpt |
- フィルタ:
FilterステップでTags contains "Marketing"など条件を追加すると、不要な記事は除外できます。
テスト手順・デバッグ時のエラー対処
- Test Trigger → 最新保存記事が正しく取得できるか確認
- Run Action → Notion に送信される JSON をプレビューし、プロパティ名やデータ型にミスがないかチェック
- エラー例と対策
- 権限エラー:Notion のインテグレーションが対象データベースに「Edit」権限を持っているか確認。
- URL 形式不正:
http://だけの場合はFormatter → Text → Replaceでhttps://に統一。 - 文字数超過:Notion の Text プロパティは最大 2,000 文字(※3)。長文は
Excerptを 1,800 文字程度に切り詰め、残りは外部リンクで管理。
📌 ポイント:Zapier の無料プランは 月間 100 タスク が上限です(最新情報は Zapier 料金ページ参照)。タスク数が足りない場合はフィルタで対象記事を絞るか、Make への切替をご検討ください。
Make (Integromat) で構築する同等フロー
Make はビジュアルエディタと高度な条件分岐が特徴です。Zapier と比べて大量データや複雑ロジックの処理に向いています。
シナリオ全体像
- Watch Articles (Feedly) → 新規保存記事を取得
- Filter → タグ・キーワードで絞り込み
- Iterator(必要なら)→ 複数タグを展開
- Create a Database Item (Notion) → データベースへ登録
RSS/Feedly モジュール設定
| 設定項目 | 説明 |
|---|---|
| Connection | Feedly の API キー(Premium 以上で取得) |
| Trigger | Saved Articles → New article saved |
| Options | 取得件数上限、ポーリング間隔(デフォルトは 5 分) |
📎 注記:Make の無料プランは 月間 1,000 操作 が上限です(最新情報は Make 料金ページ参照)。
Notion モジュールへのデータマッピング
| Feedly フィールド | Notion プロパティ |
|---|---|
| title | Title |
| url | URL |
| tags (array) | Tags(Multi‑select) |
| saved_at | Saved Date |
| summary | Excerpt |
- Iterator を利用すると、
tags配列を個別に展開でき、Notion のmulti_selectに正しく渡せます。
Zapier との比較ポイント
| 項目 | Zapier | Make |
|---|---|---|
| UI の直感性 | ステップ形式でシンプル | ビジュアルフローダイアグラム |
| カスタマイズ度 | 基本的なフィルタのみ | 複雑な条件分岐・スクリプト実装可 |
| 料金体系(2024 年 10 月時点) | 無料で月 100 タスク | 無料で月 1,000 操作 |
| エラーハンドリング | Zap の履歴画面にまとめられる | シナリオごとに詳細ログを取得可能 |
ポイント:初めて自動化する方は Zapier、数百件以上の定期実行や高度な分岐が必要な場合は Make が適しています。
カスタム実装と運用ベストプラクティス
コードレベルで自由度を確保したい方向けに、Google Apps Script(GAS)と Notion API を組み合わせたサンプル実装を紹介します。公式ドキュメントや制限事項へのリンクも併記しています。
Google Apps Script と Notion API を使った自作連携概要
以下のスクリプトは、Feedly の 認証済み RSS エンドポイント から最新記事を取得し、Notion データベースにページを作成する例です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
/** * Feedly → Notion 同期バッチ(Google Apps Script) */ function syncFeedlyToNotion() { // ==== 環境変数の取得 ==== const NOTION_TOKEN = PropertiesService.getScriptProperties() .getProperty('NOTION_TOKEN'); // ← シークレット管理推奨 const DATABASE_ID = 'YOUR_DATABASE_ID'; // Notion データベース ID // ==== Feedly RSS エンドポイント(認証付き) ==== // URL の構築例: https://cloud.feedly.com/v3/streams/contents?streamId=user/<USER_ID>/category/global.saved&unreadOnly=false const FEEDLY_ENDPOINT = 'https://cloud.feedly.com/v3/streams/contents?...'; // ← 必要に応じて streamId とクエリを設定 const FEEDLY_TOKEN = PropertiesService.getScriptProperties() .getProperty('FEEDLY_TOKEN'); // OAuth2 ベアラートークン const feedResponse = UrlFetchApp.fetch(FEEDLY_ENDPOINT, { method: 'get', headers: { Authorization: `OAuth ${FEEDLY_TOKEN}` }, muteHttpExceptions: true }); if (feedResponse.getResponseCode() !== 200) { console.error('Feedly fetch error:', feedResponse.getContentText()); return; } const items = JSON.parse(feedResponse.getContentText()).items; // ==== Notion への送信ループ ==== items.forEach(item => { // 重複チェック(URL がすでに存在するか検索) if (isDuplicateUrl(DATABASE_ID, item.alternate[0].href, NOTION_TOKEN)) return; const payload = { parent: { database_id: DATABASE_ID }, properties: { Title: { title: [{ text: { content: item.title } }] }, URL: { url: item.alternate[0].href }, Tags: { multi_select: (item.tags || []).map(t => ({ name: t.label })) }, "Saved Date": { date: { start: new Date(item.published).toISOString() } }, Excerpt: { rich_text: [{ text: { content: truncate(item.summary?.content, 1800) } }] } } }; const options = { method: 'post', contentType: 'application/json', headers: { Authorization: `Bearer ${NOTION_TOKEN}`, 'Notion-Version': '2022-06-28' // 最新の API バージョンを指定 }, payload: JSON.stringify(payload), muteHttpExceptions: true }; const resp = UrlFetchApp.fetch('https://api.notion.com/v1/pages', options); if (resp.getResponseCode() !== 200) { console.error('Notion create error:', resp.getContentText()); } // Notion のレートリミット(60 req/分)に合わせて 1 秒待機 Utilities.sleep(1000); }); } /** * 指定 URL がデータベース内に存在するか確認 */ function isDuplicateUrl(databaseId, url, notionToken) { const query = { filter: { property: 'URL', url: { equals: url } }, page_size: 1 }; const opts = { method: 'post', contentType: 'application/json', headers: { Authorization: `Bearer ${notionToken}`, 'Notion-Version': '2022-06-28' }, payload: JSON.stringify(query), muteHttpExceptions: true }; const res = UrlFetchApp.fetch(`https://api.notion.com/v1/databases/${databaseId}/query`, opts); const data = JSON.parse(res.getContentText()); return data.results && data.results.length > 0; } /** * 文字列を指定長さに切り詰めるユーティリティ */ function truncate(str, maxLen) { if (!str) return ''; return str.length > maxLen ? str.slice(0, maxLen) + '…' : str; } |
ポイント解説
- RSS エンドポイントはプレースホルダーではなく、
streamId=user/<USER_ID>/category/global.savedのように自分の保存記事ストリームを指定します。 - 認証には OAuth2 ベアラートークン が必須で、取得方法は Feedly の開発者ドキュメント(Feedly API Auth)をご参照ください。
- Notion へのリクエストは 1 秒ごとに 1 件送信し、公式のレートリミット 60 リクエスト/分 を遵守します(※4)。
画像・本文取得方法と Notion ページへの埋め込みベストプラクティス
- サムネイル画像:Feedly の
visualUrlフィールドを取得し、Notion ページ作成時にcover: { external: { url: visualUrl } }を追加するとカバー画像として表示できます。推奨サイズは 1200×630px(横長)です。 - 本文抜粋:
content:encodedから<p>タグのテキストだけ抽出し、200文字程度に要約してExcerptに格納します。長文は Google Docs に保存し、その共有リンクを別プロパティ(例:Full Text Link)で保持すると閲覧性が向上します。 - Markdown 変換:GAS の
HtmlService.createHtmlOutput(content).getContent()を使って HTML を取得し、簡易的に正規表現でタグ除去した後 Notion のrich_textに渡すと見た目が整います。
エラー対処とレートリミット・データ重複防止策
| 発生箇所 | 典型的なエラーメッセージ | 対策 |
|---|---|---|
| Notion API 呼び出し | 429 Too Many Requests |
Utilities.sleep(1000) を挿入し、1 分間に 60 件以下に抑える。 |
| Feedly RSS 取得 | 401 Unauthorized |
OAuth トークンの有効期限切れ → 再取得スクリプトを定期実行。 |
| 重複登録 | データベース検索結果が空でない場合に作成しようとすると失敗 | isDuplicateUrl() 関数で事前チェックし、重複はスキップ。 |
実装後の活用例
- 週次ニュースダイジェスト:Notion のビューで「Saved Date」別に集計し、Make のスケジュールモジュールで毎週月曜に自動的にサマリーページを生成。
- プロジェクト情報ボード:
Tagsにプロジェクト名を付与すれば、Kanban ボードやカレンダー表示が即座に作成可能。 - チーム共有テンプレート:データベース自体をテンプレート化し、新規メンバーはコピーして自分の Feedly アカウントだけを連携させると、情報サイロ化防止につながります。
📚 参考リンク
1. Feedly API ドキュメント – https://developer.feedly.com/v3/(Premium 以上でstreamsエンドポイント利用可)
2. Notion API リクエスト制限 – https://developers.notion.com/reference/request-limits(Text プロパティ 2000 字、60 req/分)
3. Zapier 無料プランタスク上限 – https://zapier.com/pricing
4. Make 無料プラン操作数上限 – https://www.make.com/en/pricing
全体まとめ(重要ポイント)
- Feedly の API 利用は Premium/Enterprise プランが必須です。公式ページでプランごとの機能比較を確認してください。
- Notion の Text プロパティは最大 2,000 文字、API は 60 リクエスト/分のレートリミットがあります。超えると 429 エラーになるのでスリープ処理で調整しましょう。
- Zapier と Make の無料枠は変動する可能性があるため、最新の料金ページへのリンクを必ず添付し、上限に達したらプラン変更や別ツールへの移行を検討してください。
- コード内のプレースホルダーは実際のストリーム ID とトークンで置き換える必要があります。サンプルでは
FEEDLY_ENDPOINTとFEEDLY_TOKENがその役割です。 - 「ポイント」系の説明は各セクション末尾に統合し、冗長さを排除しました。
以上で、Feedly と Notion をノーコード/ローコード・どちらでも安全かつ拡張性のある形で連携できる手順が整いました。ぜひご自身のワークフローに組み込んで、生産性向上に活用してください。