はじめに (対象読者・この記事でわかること)

この記事は、プログラミングの基本的な知識があり、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を設定します。

  1. Notionのワークスペースで「Integration」を作成します。 - https://www.notion.so/my-integrations にアクセス - 「New integration」ボタンをクリック - Integration名を入力(例:「Discord Notion Notifier」) - 「Associated workspace」で対象のワークスペースを選択 - 「 capabilities」で「Content」のみチェック - 「Submit」ボタンをクリック

  2. Integrationのトークンをコピーします。 - 作成したIntegrationを選択 - 「Internal Token」の横にある「Show」ボタンをクリック - トークンをコピーし、安全な場所に保存

  3. NotionデータベースにIntegrationを共有します。 - 通知を送りたいNotionデータベースを開く - データベースの右上にある「...」をクリックし、「Add connections」を選択 - 先ほど作成したIntegrationを選択

ステップ2:Discord Webhookの設定

次に、通知を受け取るDiscordチャンネルにWebhookを設定します。

  1. Discordサーバーの対象チャンネルで「編集アイコン」を右クリック
  2. 「アプリケーション統合」→「ウェブフック」を選択
  3. 「ウェブフックを作成」をクリック
  4. Webhook名を入力(例:「Notion通知」)
  5. 「ウェブフックURLをコピー」をクリックし、URLをコピー
  6. 必要であれば、アイコンを変更
  7. 「保存」ボタンをクリック

ステップ3:Google Apps Scriptの作成

次に、Google Apps Scriptのスクリプトを作成します。

  1. Googleドライブに移動
  2. 「新規」→「その他」→「Google Apps Script」を選択
  3. スクリプトエディタが開くので、以下のコードを貼り付けます
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(); }
  1. スクリプトの設定項目に必要な情報を入力します - NOTION_TOKEN:ステップ1で取得したトークン - DISCORD_WEBHOOK_URL:ステップ2で取得したWebhook URL - NOTION_DATABASE_ID:通知対象のNotionデータベースのID(データベースのURLから取得可能)

ステップ4:スクリプトの実行とトリガーの設定

  1. スクリプトエディタの「保存」ボタンをクリック
  2. 「実行」ボタンをクリックし、承認を求められたらGoogleアカウントで承認
  3. 「main」関数を実行して、正常に動作するか確認
  4. トリガーを設定して自動実行を有効化 - 「トリガー」アイコン(アラームマーク)をクリック - 「トリガーを追加」ボタンをクリック - 以下のように設定
    • 実行する関数: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を使用することで、簡単に通知機能を実装できる
  • 通知内容をカスタマイズすることで、必要な情報だけを効率的に共有できる

この仕組みを活用することで、チームでの情報共有がより円滑になり、タスク管理の効率化が期待できます。今後は、さらに高度な通知条件の設定や、複数のデータベース連携など、発展的な活用方法もご紹介できればと思います。

参考資料