MENU
  • はじめての n8n
  • 作り方
  • エラー対処
  • Claude 活用
  • 運営者
n8n × Claude 自動化の実践記録 | 自動化ラボ
自動化ラボ
  • はじめての n8n
  • 作り方
  • エラー対処
  • Claude 活用
  • 運営者
  • はじめての n8n
  • 作り方
  • エラー対処
  • Claude 活用
自動化ラボ
  • はじめての n8n
  • 作り方
  • エラー対処
  • Claude 活用
  • 運営者
  1. ホーム
  2. ワークフローの作り方
  3. n8nでGoogleカレンダーの今日の予定をDiscordに通知するワークフロー

n8nでGoogleカレンダーの今日の予定をDiscordに通知するワークフロー

2026 10/07
ワークフローの作り方
Discord Google カレンダー
2026年10月1日2026年10月7日
当ページのリンクには広告が含まれています。
ワークフロー全体(Webhook → Today's Events → Make Message → Discord → Respond to Webhook)
  • 動作確認日:2026-10-01
  • n8nのバージョン:2.41.3(Docker、セルフホスト)
目次

① 結論:このワークフローでできること

Googleカレンダーから今日の予定を時刻順に取り出し、1通のメッセージにまとめてDiscordのチャンネルに送ります。

  • 読むカレンダーは、IDで1つに決めています。今回は、テスト用に作った n8nテスト カレンダーだけを読みました。
  • 終日の予定は「終日」と表示します。
  • 予定がない日は、「今日の予定はありません」と送ります。
  • 使う認証情報(Credentials)は、Google CalendarとDiscord Webhookの2つです。
  • 動作確認のため、起動にはWebhookを使っています。実際に使うときは、Schedule Triggerで毎朝実行する想定です。

② 完成イメージ

ワークフロー全体(Webhook → Today's Events → Make Message → Discord → Respond to Webhook)

テスト用のカレンダーに今日の予定を3件入れてから、WebhookのURLにGETでアクセスしました。Discordにメッセージが届きます。

Discordに届いた今日の予定

届いたメッセージは、次のとおりです(実際の内容です)。

📅 **2026-10-01 の予定(3件)**
・08:00〜09:00  travel
・10:00〜11:00  shopping
・12:00〜13:00  lunch

実行したときの件数の流れは、次のとおりです。

ノード出てきた件数
Webhook1
Google Calendar(Today’s Events)3
Make Message(Code)1(3件をまとめた1通分)
Discord1
Respond to Webhook1

③ 使うノードと必要なもの

必要なもの

  • n8n(今回はバージョン2.41.3をDockerで動かしました)
  • Googleカレンダーと、読みたいカレンダーのID
  • Discordのサーバーと、通知を送るチャンネルの「ウェブフックURL」
  • 認証情報:Google Calendar OAuth2 API(Google Cloudで作ったOAuthクライアントを使います)と、Discord Webhook

カレンダーのIDは、Googleカレンダーの「設定と共有」→「カレンダーの統合」にある「カレンダーID」で確かめられます。自分で作ったカレンダーは、…@group.calendar.google.com のような形です。いつものカレンダー(メインのカレンダー)を読みたいときは、自分のGmailアドレスがIDになります。

使うノード

ノード役割設定したこと
Webhook動作確認用の起動ボタンPath:test-calendar-discord、Respond:Using 'Respond to Webhook' Node
Google Calendar(Today’s Events)今日の予定を取るResource:Event、Operation:Get Many、Calendar:By ID、Return All:オン、After / Before:今日の0時〜23時59分
Code(Make Message)予定を1通のメッセージにまとめる下のコード
Discordメッセージを送るConnection Type:Webhook、Operation:Send a Message、Message:{{ $json.content }}
Respond to Webhook送った文章を返すRespond With:Text
Today's Events(Google Calendarノード)の設定画面

Today’s Eventsでは、「After」と「Before」で、今日の予定だけに絞っています。

項目値
After{{ $now.setZone('Asia/Tokyo').startOf('day').toISO() }}(今日の0時)
Before{{ $now.setZone('Asia/Tokyo').endOf('day').toISO() }}(今日の23時59分)
Order ByStart Time(開始時刻の順)
Recurring Event HandlingAll Occurrences(繰り返しの予定も1回ずつ取る)

このノードは、Google Calendarノードの「Settings」でオンにできる「Always Output Data」をオンにしています。予定が0件の日でも、次のノードが動くようにするためです。

Make Message(Codeノード)の設定画面

Make Messageでは、次の処理をしています。

// 今日の予定を1通のメッセージにまとめる(予定がないときも1通作る)
const events = $input.all().map(i => i.json).filter(e => e.summary);
const today = $now.setZone('Asia/Tokyo').toFormat('yyyy-MM-dd');
const fmt = iso => DateTime.fromISO(iso).setZone('Asia/Tokyo').toFormat('HH:mm');
const lines = events.map(e => {
  const when = e.start.dateTime ? `${fmt(e.start.dateTime)}〜${fmt(e.end.dateTime)}` : '終日';
  return `・${when}  ${e.summary}`;
});
const content = events.length
  ? `📅 **${today} の予定(${events.length}件)**\n` + lines.join('\n')
  : `📅 **${today}** 今日の予定はありません`;
return [{ json: { count: events.length, content } }];
  • 時刻のある予定は start.dateTime に、終日の予定は start.date に日付が入ります。start.dateTime がないものを「終日」としています。
  • 予定が0件の日は、Google Calendarノードから中身が空のデータが1つ届きます。filter(e => e.summary) で、件名のあるものだけを予定として数えています。

④ JSON

n8nの公開API(POST /api/v1/workflows)でこのJSONからワークフローを作成し、有効化してから、上の結果を確認しました。

使うときは、次の箇所を自分の環境に合わせて書き換えてください。

  • YOUR_CALENDAR_ID:読みたいカレンダーのID
  • YOUR_GOOGLE_CALENDAR_CREDENTIAL_ID:n8nに登録したGoogle Calendarの認証情報のID
  • YOUR_DISCORD_CREDENTIAL_ID:n8nに登録したDiscord Webhookの認証情報のID

読み込んだあとに、ノードの画面で認証情報を選び直しても大丈夫です。

{
  "name": "test-calendar-discord",
  "nodes": [
    { "parameters": { "path": "test-calendar-discord", "responseMode": "responseNode", "options": {} },
      "id": "b8000000-0001-4000-8000-000000000001", "name": "Webhook", "type": "n8n-nodes-base.webhook", "typeVersion": 2, "position": [0, 0], "webhookId": "b8000000-aaaa-4000-8000-000000000001" },
    { "parameters": {
        "operation": "getAll",
        "calendar": { "__rl": true, "value": "YOUR_CALENDAR_ID", "mode": "id" },
        "returnAll": true,
        "timeMin": "={{ $now.setZone('Asia/Tokyo').startOf('day').toISO() }}",
        "timeMax": "={{ $now.setZone('Asia/Tokyo').endOf('day').toISO() }}",
        "options": { "orderBy": "startTime", "recurringEventHandling": "expand" } },
      "id": "b8000000-0002-4000-8000-000000000002", "name": "Today's Events", "type": "n8n-nodes-base.googleCalendar", "typeVersion": 1.3, "position": [220, 0],
      "alwaysOutputData": true,
      "credentials": { "googleCalendarOAuth2Api": { "id": "YOUR_GOOGLE_CALENDAR_CREDENTIAL_ID", "name": "Google Calendar account" } } },
    { "parameters": { "jsCode": "// 今日の予定を1通のメッセージにまとめる(予定がないときも1通作る)\nconst events = $input.all().map(i => i.json).filter(e => e.summary);\nconst today = $now.setZone('Asia/Tokyo').toFormat('yyyy-MM-dd');\nconst fmt = iso => DateTime.fromISO(iso).setZone('Asia/Tokyo').toFormat('HH:mm');\nconst lines = events.map(e => {\n  const when = e.start.dateTime ? `${fmt(e.start.dateTime)}〜${fmt(e.end.dateTime)}` : '終日';\n  return `・${when}  ${e.summary}`;\n});\nconst content = events.length\n  ? `📅 **${today} の予定(${events.length}件)**\\n` + lines.join('\\n')\n  : `📅 **${today}** 今日の予定はありません`;\nreturn [{ json: { count: events.length, content } }];" },
      "id": "b8000000-0003-4000-8000-000000000003", "name": "Make Message", "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [440, 0] },
    { "parameters": { "authentication": "webhook", "content": "={{ $json.content }}", "options": {} },
      "id": "b8000000-0004-4000-8000-000000000004", "name": "Discord", "type": "n8n-nodes-base.discord", "typeVersion": 2, "position": [660, 0],
      "webhookId": "b8000000-bbbb-4000-8000-000000000004",
      "credentials": { "discordWebhookApi": { "id": "YOUR_DISCORD_CREDENTIAL_ID", "name": "Discord Webhook account" } } },
    { "parameters": { "respondWith": "text", "responseBody": "={{ $('Make Message').item.json.content }}", "options": {} },
      "id": "b8000000-0005-4000-8000-000000000005", "name": "Respond to Webhook", "type": "n8n-nodes-base.respondToWebhook", "typeVersion": 1.1, "position": [880, 0] }
  ],
  "connections": {
    "Webhook": { "main": [[{ "node": "Today's Events", "type": "main", "index": 0 }]] },
    "Today's Events": { "main": [[{ "node": "Make Message", "type": "main", "index": 0 }]] },
    "Make Message": { "main": [[{ "node": "Discord", "type": "main", "index": 0 }]] },
    "Discord": { "main": [[{ "node": "Respond to Webhook", "type": "main", "index": 0 }]] }
  },
  "settings": { "executionOrder": "v1" }
}

⑤ つまずきポイントと対処

このワークフロー自体は、1回目の実行でエラーなく動きました。ここでは、確認の途中で気をつけたことと、まだ確かめていないことを書きます。

いつものカレンダーの予定が、そのままDiscordに出てしまう

  • 気をつけること:メインのカレンダーを読むと、仕事や私用の予定の名前が、そのままDiscordに送られます。チャンネルにほかの人がいる場合は、全員に見えます。
  • 対処:今回は、テスト用に n8nテスト カレンダーを新しく作り、そのIDだけを指定して読みました。通知したい予定だけを入れるカレンダーを分けておくと安心です。

時刻がずれることがある

  • 気をつけること:Google Calendarノードの画面には、「n8nの設定のタイムゾーンを使う」という注意書きが出ます。n8nのタイムゾーンが日本時間になっていないと、「今日」の範囲がずれることがあります。
  • 対処:After / Beforeの式と、Make Messageの時刻の表示で、setZone('Asia/Tokyo') を使って日本時間に合わせています。

まだ確かめていないこと

今回のテストでは、時刻のある予定3件だけを使いました。終日の予定の見え方と、予定が0件の日の「今日の予定はありません」は、まだ実際には確かめていません。

⑥ 応用アイデア

どれも、まだ試していないアイデアです。

  • Webhookを「Schedule Trigger」に替えて、毎朝7時に通知する
  • Beforeを「明日の23時59分」にして、今日と明日の予定をまとめて送る
  • 予定の場所(location)も一緒に送る
  • 天気予報のワークフローと組み合わせて、「今日の天気と予定」を1通にまとめる
ワークフローの作り方
Discord Google カレンダー
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
  • n8nで今日の天気予報をDiscordに通知するワークフロー(APIキー不要)
  • n8nでブログの新着記事をLINEに通知するワークフロー(Messaging API・重複なし)

この記事を書いた人

自動化ラボ管理人のアバター 自動化ラボ管理人

コードは書けないけれど、n8n と Claude(Claude Code)で仕事とブログを自動化しています。実際に動かしたワークフローを、動作確認日・JSON・つまずいたところまで記録しています。

関連記事

  • n8nで通知を送る方法まとめ:Discord・LINE・Telegram・Slackを実際に試して比べた
    2026年10月3日
  • n8nのGoogle連携まとめ:Sheets・Gmail・Calendar・Driveを、1つのOAuthクライアントで使う
    2026年10月3日
  • ワークフロー全体(Webhook → Get Releases → Pick New → Has New → Discord / Respond None)
    n8nの新しいバージョンが出たらDiscordに通知するワークフロー(GitHub API・重複なし)
    2026年10月1日
  • ワークフロー全体(Webhook → Today's Events → Make Message → LINE Broadcast → Respond to Webhook)
    n8nでGoogleカレンダーの今日の予定をLINEに通知するワークフロー(Messaging API)
    2026年10月1日
  • ワークフロー全体(Webhook → RSS Read → Pick New → Has New → Discord / Respond None)
    n8nでブログの新着記事をDiscordに通知するワークフロー(重複なし)
    2026年10月1日
  • ワークフロー全体(Webhook → Get Weather → Make Message → Discord → Respond to Webhook)
    n8nで今日の天気予報をDiscordに通知するワークフロー(APIキー不要)
    2026年10月1日

記事の種類

  • Claude 活用
  • n8n リリース情報
  • はじめての n8n
  • エラー・つまずき対処
  • サーバー・WordPress
  • テンプレート配布
  • ワークフローの作り方
  • 運営記録
つなぐサービス
Google スプレッドシートRSSLINESlackGmailDiscordTelegramWebhookn8n API天気 APIGoogle カレンダーGoogle ドライブ
目次
  • プロフィール
  • お問い合わせ
  • プライバシーポリシー

© 自動化ラボ.

目次