はじめに (対象読者・この記事でわかること)
この記事は、プログラミングの基本的な知識があり、NotionとDiscordを日常業務で利用している方を対象としています。特に、チームでのタスク管理や情報共有を効率化したい方に向けています。
この記事を読むことで、Notion APIとGoogle Apps Script(GAS)を連携させ、Notionデータベースの更新情報をDiscordに自動通知する方法を習得できます。具体的には、Notionデータベースから情報を取得し、DiscordのWebhookを利用して通知を送信する仕組みを構築できるようになります。これにより、チームコミュニケーションが円滑になり、タスク管理の効率化が期待できます。
前提知識
この記事を読み進める上で、以下の知識があるとスムーズです。 前提となる知識1: JavaScriptの基本的な知識 前提となる知識2: GoogleアカウントとGoogleドライブの基本的な操作 前提となる知識3: Notionの基本的な操作とデータベースの作成方法 前提となる知識4: Discordのサーバー作成とWebhookの設定方法
NotionとDiscordの連携とは?
NotionとDiscordを連携させることで、Notionデータベースの更新情報をリアルタイムでDiscordに通知できます。チームでタスク管理を行っている場合、タスクの進捗や更新がDiscordのチャンネルに通知されることで、メンバー間の情報共有が効率化されます。
Notionデータベースにはプロジェクトの進捗、タスクリスト、スケジュールなど様々な情報を格納できます。これらの情報をDiscordに通知することで、チームの連携がより円滑になります。
Google Apps Script(GAS)は、Googleの各サービスを自動化するためのツールです。これを利用することで、Notion APIを呼び出してデータベースから情報を取得し、DiscordのWebhookを使用して通知を送信するという流れを実現できます。
具体的な手順や実装方法
ステップ1:Notion APIの設定
まずはNotion APIを設定します。
-
Notionのワークスペースで「Integration」を作成します。 - https://www.notion.so/my-integrations にアクセス - 「New integration」ボタンをクリック - Integration名を入力(例:「Discord Notion Notifier」) - 「Associated workspace」で対象のワークスペースを選択 - 「 capabilities」で「Content」のみチェック - 「Submit」ボタンをクリック
-
Integrationのトークンをコピーします。 - 作成したIntegrationを選択 - 「Internal Token」の横にある「Show」ボタンをクリック - トークンをコピーし、安全な場所に保存
-
NotionデータベースにIntegrationを共有します。 - 通知を送りたいNotionデータベースを開く - データベースの右上にある「...」をクリックし、「Add connections」を選択 - 先ほど作成したIntegrationを選択
ステップ2:Discord Webhookの設定
次に、通知を受け取るDiscordチャンネルにWebhookを設定します。
- Discordサーバーの対象チャンネルで「編集アイコン」を右クリック
- 「アプリケーション統合」→「ウェブフック」を選択
- 「ウェブフックを作成」をクリック
- Webhook名を入力(例:「Notion通知」)
- 「ウェブフックURLをコピー」をクリックし、URLをコピー
- 必要であれば、アイコンを変更
- 「保存」ボタンをクリック
ステップ3:Google Apps Scriptの作成
次に、Google Apps Scriptのスクリプトを作成します。
- Googleドライブに移動
- 「新規」→「その他」→「Google Apps Script」を選択
- スクリプトエディタが開くので、以下のコードを貼り付けます
Javascript// 設定項目 const NOTION_TOKEN = 'ここにNotionのトークンを貼り付け'; // ステップ1で取得したトークン const DISCORD_WEBHOOK_URL = 'ここにDiscordのWebhookURLを貼り付け'; // ステップ2で取得したURL const NOTION_DATABASE_ID = 'ここにNotionデータベースのIDを貼り付け'; // データベースのURLから取得 const CHECK_INTERVAL = 60000; // チェック間隔(ミリ秒)- 1分ごとにチェック // Notionからデータを取得する関数 function getNotionData() { const url = `https://api.notion.com/v1/databases/${NOTION_DATABASE_ID}/query`; const options = { 'method': 'post', 'contentType': 'application/json', 'headers': { 'Authorization': `Bearer ${NOTION_TOKEN}`, 'Notion-Version': '2022-06-28' } }; const response = UrlFetchApp.fetch(url, options); const json = JSON.parse(response.getContentText()); return json.results; } // Discordにメッセージを送信する関数 function sendToDiscord(message) { const payload = { 'content': message }; const options = { 'method': 'post', 'contentType': 'application/json', 'payload': JSON.stringify(payload) }; UrlFetchApp.fetch(DISCORD_WEBHOOK_URL, options); } // メイン処理 function main() { const notionData = getNotionData(); if (notionData.length > 0) { let message = '🔔 Notionデータベースの更新通知\n\n'; notionData.forEach(item => { const title = item.properties.Name.title[0].plain_text; const url = item.url; const created = new Date(item.created_time).toLocaleString('ja-JP'); message += `**${title}**\n`; message += `作成日時: ${created}\n`; message += `URL: ${url}\n\n`; }); sendToDiscord(message); } } // トリガー設定用関数 function setupTrigger() { // 既存のトリガーをすべて削除 const triggers = ScriptApp.getProjectTriggers(); triggers.forEach(trigger => { ScriptApp.deleteTrigger(trigger); }); // 1分ごとに実行するトリガーを作成 ScriptApp.newTrigger('main') .timeBased() .everyMinutes(1) .create(); }
- スクリプトの設定項目に必要な情報を入力します
-
NOTION_TOKEN:ステップ1で取得したトークン -DISCORD_WEBHOOK_URL:ステップ2で取得したWebhook URL -NOTION_DATABASE_ID:通知対象のNotionデータベースのID(データベースのURLから取得可能)
ステップ4:スクリプトの実行とトリガーの設定
- スクリプトエディタの「保存」ボタンをクリック
- 「実行」ボタンをクリックし、承認を求められたらGoogleアカウントで承認
- 「main」関数を実行して、正常に動作するか確認
- トリガーを設定して自動実行を有効化
- 「トリガー」アイコン(アラームマーク)をクリック
- 「トリガーを追加」ボタンをクリック
- 以下のように設定
- 実行する関数:main
- イベントの種類:時間主導型
- 時間ベースのトリガーのタイプ:分タイマー
- 時間の間隔:1分ごと
- 「保存」ボタンをクリック
ハマった点やエラー解決
Notion APIの認証エラー
- エラー内容:「Invalid token」や「Unauthorized」といったエラーが発生
- 原因:Notionのトークンが無効、またはデータベースとの共有設定が不適切
- 解決策: 1. Integrationのトークンが正しいか確認 2. 対象のデータベースにIntegrationが共有されているか確認 3. Notion APIのバージョン('Notion-Version'ヘッダー)が最新か確認
Discord Webhookの送信エラー
- エラー内容:「HTTP 400 Bad Request」や「HTTP 403 Forbidden」
- 原因:Webhook URLが無効、またはメッセージ形式が不適切
- 解決策: 1. Webhook URLが正しいか確認 2. メッセージの形式がDiscordの仕様に合っているか確認 3. Webhookの有効期限が切れていないか確認
GASの実行制限エラー
- エラー内容:「Execution exceeded quota」や「Execution timed out」
- 原因:GASの実行時間やリクエスト数の制限に達した
- 解決策: 1. 不要な処理を削減して実行時間を短縮 2. チェック間隔を長く設定 3. スプレッドシートなど外部サービスへの依存を減らす
通知内容のカスタマイズ
通知内容をカスタマイズするには、main関数内のメッセージ生成部分を変更します。
例えば、Notionデータベースの特定のプロパティを通知に含めたい場合は、以下のようにコードを修正します。
Javascript// メイン処理 function main() { const notionData = getNotionData(); if (notionData.length > 0) { let message = '🔔 Notionデータベースの更新通知\n\n'; notionData.forEach(item => { const title = item.properties.Name.title[0].plain_text; const url = item.url; const created = new Date(item.created_time).toLocaleString('ja-JP'); // ステータスプロパティを追加 const status = item.properties.Status.select.name; // 担当者プロパティを追加 const assignee = item.properties.Assignee.people.map(p => p.name).join(', '); message += `**${title}**\n`; message += `ステータス: ${status}\n`; message += `担当者: ${assignee}\n`; message += `作成日時: ${created}\n`; message += `URL: ${url}\n\n`; }); sendToDiscord(message); } }
さらに、条件に応じて通知内容を変更することも可能です。例えば、特定のステータスのアイテムのみ通知する場合は、以下のようにフィルタリングを追加します。
Javascript// メイン処理 function main() { const notionData = getNotionData(); // ステータスが「未対応」のアイテムのみフィルタリング const filteredData = notionData.filter(item => { return item.properties.Status.select.name === '未対応'; }); if (filteredData.length > 0) { let message = '🔔 未対応のタスクがあります!\n\n'; filteredData.forEach(item => { const title = item.properties.Name.title[0].plain_text; const url = item.url; message += `**${title}**\n`; message += `URL: ${url}\n\n`; }); sendToDiscord(message); } }
まとめ
本記事では、Notionデータベースの更新をDiscordに自動通知する方法を解説しました。
- Notion APIとGoogle Apps Scriptを連携させることで、データベースの更新を監視できる
- Discord Webhookを使用することで、簡単に通知機能を実装できる
- 通知内容をカスタマイズすることで、必要な情報だけを効率的に共有できる
この仕組みを活用することで、チームでの情報共有がより円滑になり、タスク管理の効率化が期待できます。今後は、さらに高度な通知条件の設定や、複数のデータベース連携など、発展的な活用方法もご紹介できればと思います。
参考資料
- Notion API公式ドキュメント
- Google Apps Script公式ドキュメント
- Discord Webhook公式ドキュメント
- Notion APIの使い方 - Qiita
- Google Apps ScriptでDiscordに通知を送る方法 - Zenn