grasys blog

n8nで毎日のリマインダーを作ってみた

こんにちは、ilhamhkです。

この記事では、n8nを使って毎朝の予定や天気、未読メールを通知してくれる、簡単なDiscordリマインダーボットの作り方をご紹介します。

n8nとは?

最近、n8nというノーコードの自動化プラットフォームを使い始めました。n8nは、シンプルなDiscordボットからコンテンツ自動化まで、さまざまな自動化を実現できる豊富なノードとライブラリを備えています。

n8nが他の自動化サービス(たとえばZapier)より優れている点は、オープンソースでセルフホスティングが可能なため、柔軟性が高く、特に開発者にとってはカスタマイズしやすいところです。

n8nセルフホスティング

私のすべてのワークフローでは、Google CloudのCompute Engineインスタンスを使ってn8nをセルフホスティングしています。

この方法を選んでいる主な理由は、カスタマイズの自由度が高いことに加えて、n8nの公式ホスティングサービスを利用するよりもコストを抑えられるからです。

n8nのホスティングで最も安いプランは月額24ユーロ(約4,129円)ですが、アクティブに使用できるワークフローは最大5つまでです。

一方で、セルフホスティングを選べば、すぐにコミュニティエディションを利用でき、インスタンスのサイズにもよりますが、月額およそ7〜10ドル(約1,024〜1,464円)で無制限のワークフローが実行可能になります。

私は現在「e2-medium」を使っており、今のところすべてのワークフローを問題なくホストできています。

認証情報について

ワークフローの説明に入る前に、まず認証情報について触れておきます。

n8nのノードの多くは基本的にAPIの呼び出しなので、当然ながら認証情報の設定が必要になります。

とはいえ、n8nでは一度設定した認証情報が保存されるため、ノードを追加するたびに毎回認証を設定する必要はありません。

また、公式ドキュメントには各ノードごとの認証設定について詳しいガイドが用意されているため、本記事ではその部分の説明は省略します。

ワークフローの概要

こちらが、私が共有したい毎朝のリマインダー用 n8n ワークフローです。
主なアイデアは、起床後にその日の予定や新着メールをリマインドしてくれることです。さらに、外出前に服装を決める参考として、天気情報も含めています。

このワークフローは、以下の手順で実行されます:

  1. Cronスケジューラーが毎朝7時にワークフローをトリガーする
  2. 最新の未読メール、当日の予定、そして現在の天気予報を取得する
  3. それらの情報をまとめて、Discordボットに送信する

ワークフローの構成

Cronトリガーノード

このノードは、ワークフローのトリガーとして機能します。

毎日午前7時に起動するよう設定しており、私のアラームとタイミングを合わせています。

トリガーが動作すると、その後に接続されたノードが順番に実行されます。

今回のワークフローでは、「メール取得」「イベント取得」「天気情報の取得」の3つが続けて実行されます。

GmailのGet Manyノード

このノードは、メールボックス内の最新のメールを取得するために使用します。
設定項目は以下のようになっています:

  • Credentials:Gmail API用に設定した認証情報を使用します。
  • Resource:「Message」を選択し、メール本文を取得します。
  • Operation:「Get Many」を選択して、複数のメールを取得します。
  • Return All:すべてのメールを取得するかどうかの設定です。今回は最新メールのみ取得したいので、オフにします。
  • Limit:取得するメール数の上限を指定します。ここでは「3」に設定し、最新3件のメールを取得します。
  • Simplify:メール本文などの情報を簡略化して取得します。Discordへの出力が長くなりすぎないよう、有効にしておきます。
  • Filters:今回は「Unread emails only」ように、既読ステータスをフィルターとして設定します。

設定が完了したら、「Back to Canvas」でノードを閉じるか、「Execute step」で動作テストを行うことができます。
テスト結果として、メール情報が含まれたJSON形式の出力が表示されれば、このノードは正しく設定されています。 

Google CalenderのGet Eventノード

このノードでは、Googleカレンダーから本日のスケジュールを取得します。
設定内容は以下の通りです:

  • Credential:GoogleカレンダーAPI用に設定した認証情報を使用します
  • Resource:Event を選択して、予定を取得します
  • Operation:Get Many を選択し、当日のすべてのイベントを取得します
  • Calendar:予定を取得するカレンダーを選びます。自分のカレンダーを使う場合は「From List」を選択し、使用しているメールアドレスを指定します
  • Return All:その日のすべてのイベントを取得したいため、有効にします
  • After / Before:式(Expression)を使って、当日のイベントだけが取得されるように設定します

このノードの出力も、他と同様にJSON形式で返されます。

Open Weatherノード

n8nで天気情報を取得する最も簡単な方法は、OpenWeatherMapノードを使うことです。

このノードでは、風速や気圧などの詳しい天気情報を取得できますが、今回は「現在の気温」と「天気予報」のみを使用します。

Codeノード

Discordに情報を送る前に、フォーマットがDiscordボットの仕様に合っているかを確認する必要があります。
Discordではさまざまなパラメーターを含めることができますが、今回は「content」と「embed」のみを使用します。
「content」はカードのタイトル部分、「embed」はその中身(本文)にあたります。

生成されるJSONは動的な内容になるため、その日によって取得されるメールやイベントの数が変わります。
そのため、Codeノードを使ってJavaScriptでJSONを再構成します。

具体的には、次のような処理を行います:

  • メール:「Subject」と「From」を取得し、それぞれをメール用の配列に追加。
  • イベント:「summary」と「start」を取得し、イベント用の配列に追加。
  • 天気:「weather」と「main.temp」を取得し、天気変数として保持。
const emails = [];
const events = [];
let weather = null;

for (const item of items) {
  const data = item.json;

  if (data.Subject && data.From) {
    emails.push(`• *${data.Subject}* — ${data.From}`);
  }

  else if (data.summary && data.start) {
    const dt = data.start.dateTime || data.start.date;
    const timeOnly = dt.split("T")[1]?.split("+")[0] || dt;
    events.push(`• ${data.summary} at ${timeOnly}`);
  }

  else if (data.weather && data.main) {
    weather = `${data.weather[0].description}, ${data.main.temp}°C`;
  }
}

上記すべてを使って「embed」パラメーターを構築し、これがDiscordメッセージの本文となります。

const embed = {
  title: "☀️ Your Daily Briefing",
  color: 16776960, 
  fields: []
};

if (emails.length > 0) {
  embed.fields.push({
    name: "📬 Latest Emails",
    value: emails.join("\n")
  });
}

if (events.length > 0) {
  embed.fields.push({
    name: "📅 Today's Events",
    value: events.join("\n")
  });
}

if (weather) {
  embed.fields.push({
    name: "🌤 Weather in Tokyo",
    value: weather
  });
}

return [
  {
    json: {
      content: "📋 Here is your morning briefing!",
      embeds: [embed]
    }
  }
];

HTTPS Requestノード

この機能をDiscordボットに接続するには、HTTPSノードを使用します。
「Send Message to Discord」ノードではなくHTTPSノードを選ぶ理由は、送信するメッセージの形式をより柔軟にカスタマイズできるためです。

設定方法は、通常のAPIコールとほぼ同じです:

  • Header:認証用のボットトークンを設定します
  • Body:「content」と「embed」のパラメーターを設定します(前のノードで整形した内容)

このノードが実行されると、
その日のスケジュールと新着メール、そして天気情報を含んだメッセージがDiscordボットに送られます。

ワークフローを有効化

前の手順でノードをすべて接続したら、ワークフローを有効化しましょう。

これで、毎朝7時になると自動的に実行され、1日の予定や情報をまとめた通知が届くようになります。

まとめ

今回は、n8nを使って毎日のリマインダーを作り、それをDiscordボットに送るワークフローを紹介しました。
これはあくまで基本的な構成なので、自分好みにいくらでもカスタマイズできます。
たとえば、ToDoリストを追加したり、モチベーションになる一言をランダムに送ったりしても面白いかもしれません。

n8nはこういった「ちょっとした自動化」をすごく手軽に実現できるので、生活や仕事を少しでも楽にしたいと思っている人は、ぜひ試してみてください!

※記載している金額は全て執筆時点のものです。


採用情報
お問い合わせ