業務自動化

GASでGoogleカレンダー→Slack朝会リマインド自動化 週1時間の連絡を削減

制作会社・士業・小規模チーム・店舗運営など、毎朝の予定共有を手動で行っている中小企業/個人事業主 の業務自動化レシピ
業種制作会社・士業・小規模チーム・店舗運営など、毎朝の予定共有を手動で行っている中小企業/個人事業主
ツールGoogle Apps Script
難易度★★☆ 中
設定時間約 25 分

毎朝「今日の予定どうなってる?」とSlackで聞かれる、あるいは自分でカレンダーを開いて手打ちで共有する——この繰り返しは、Google Apps Script に朝会リマインドを任せるだけで消えます。外部の自動化サービスを契約せず、月額¥0のまま、週あたり約1時間の連絡工数を削減する方法をコードごと公開します。

読了時間 約8分 / 設定所要時間 約25分 / 月額固定費 ¥0

編集長の見解:朝会が長引く原因の多くは、議論ではなく「今日は誰が何時に何をするか」の確認に時間を取られていることです。ここで重要なのは、朝会そのものを無くすことではなく、確認作業だけを自動化することです。Slackを開けば予定が並んでいる状態を作れば、朝会は本題からすぐ始められます。

🔍 なぜ「無料でできる」ことを知っておくべきか

朝会リマインドの自動化は、専用の自動化サービスを使えばクリックだけで組めます。ただし多くは連携数やタスク実行回数に応じた課金です。チームが増えるほど、通知のための費用も増えていきます。

Google Apps Script(以下 GAS)は、Googleアカウントに無料で付いてくるプログラム実行環境です。カレンダーに直接ひも付き、追加契約なしで「毎朝〇時に実行」という定期処理を組めます。

代わりに支払う対価は「コードを貼る」という一手間だけです。次のセクションで、その仕組み全体を図で確認します。

🗺 全体フロー — 3ステップで完結

構造は驚くほど単純です。毎朝決まった時刻に GAS が起動し、その日のカレンダー予定を取得して Slack の受け口(Incoming Webhook)へメッセージを送ります。

毎朝の定時実行→Slack朝会リマインドの全体像
01
時間主導型トリガー起動
毎朝指定時刻に GAS が自動実行
📅
02
今日の予定を取得
CalendarApp で当日の予定を整形
💬
03
Slack へ通知
指定チャンネルに朝会リマインドを自動投稿

設定後は毎朝自動実行、人の操作はゼロ

登場する部品は 2 つだけです。役割を整理します。

部品役割公式ドキュメント
時間主導型トリガー毎朝決まった時刻に関数を自動実行時間主導型トリガー
Slack Incoming Webhook受け取った内容をチャンネルに投稿Incoming Webhooks

この 2 つをつなぐのが、次のセクションで示すコードです。コピーして貼り付けるだけで済みます。

💰 必要なものと費用の目安

このレシピは、追加の支出が一切発生しない構成です。用意するものを表で確認してください。

必要なもの役割費用の目安
Googleアカウント(無料 or Workspace)カレンダー・GAS の実行無料(Workspace は既存契約で可)
Google Apps Script定時実行・通知処理の実行環境無料
Slack ワークスペースチームへの通知先無料プランで可

Slack の無料プランでも Incoming Webhook は利用できます。料金体系は変更されることがあるため、最新の条件はSlack 公式の料金ページで確認してください。

💡 編集部の判断材料:すでにMake.comやZapierなどの自動化サービスを契約中なら、無理に乗り換える必要はありません。GASが向くのは「これから始める」「通知だけのために課金したくない」「チーム全体のカレンダー予定共有を軽く済ませたい」ケースです。画面操作だけで済ませたい方はZapierでGoogleカレンダー予定→Slack自動通知するレシピを参照してください。

判断がついたら、実際の構築に進みます。

🛠 設定手順 — 約25分で完成

作業は「Slack 側で受け口を作る」「GAS 側でコードと定時トリガーを設定する」の 2 段階です。プログラミングの知識は不要で、コードは本記事のものをそのまま貼り付ければ動きます。

GAS × Slack 朝会リマインドの構築手順
STEP 1
Slack アプリを作成
Slack API の管理画面で「Create New App」→「From scratch」を選び、アプリ名と対象ワークスペースを指定します。
STEP 2
Incoming Webhook を有効化
左メニューの「Incoming Webhooks」をオンにし、「Add New Webhook to Workspace」で通知先チャンネル(例: #朝会)を選びます。発行された URL を控えます。
STEP 3
Apps Script プロジェクトを作成
script.google.comで新規プロジェクトを作成するか、共有カレンダーの設定画面から紐づけて作成します。
STEP 4
コードを貼り付けて保存
下記のコードを丸ごと貼り付け、Webhook URL とカレンダーID をスクリプトプロパティに登録します(手順は次項)。
STEP 5
時間主導型トリガーを設定
エディタ左の時計アイコンから「トリガーを追加」、イベントのソースに「時間主導型」、時間の間隔に「日付ベースのタイマー」→「午前8時〜9時」など希望の時間帯を選んで保存します。
STEP 6
手動実行でテスト
エディタ上部の実行ボタンで postMorningReminder を1回手動実行し、Slack に今日の予定が届くか確認します。

貼り付けるコード(そのまま動きます)

以下を Apps Script エディタの コード.gs に貼り付けてください。時間主導型トリガーから呼ばれる postMorningReminder が本体です。

/**
 * 毎朝の定時実行 → 今日のGoogleカレンダー予定をSlackへ通知
 * トリガー: 時間主導型(日付ベースのタイマー、例: 午前8時〜9時)に
 *           postMorningReminder を実行
 */
function postMorningReminder() {
  const webhookUrl = PropertiesService
    .getScriptProperties()
    .getProperty('SLACK_WEBHOOK_URL');
  const calendarId = PropertiesService
    .getScriptProperties()
    .getProperty('TARGET_CALENDAR_ID') || 'primary';

  if (!webhookUrl) {
    throw new Error('SLACK_WEBHOOK_URL がスクリプトプロパティに未設定です');
  }

  const calendar = CalendarApp.getCalendarById(calendarId);
  if (!calendar) {
    throw new Error('カレンダーが見つかりません。TARGET_CALENDAR_ID を確認してください');
  }

  const today = new Date();
  const startOfDay = new Date(today.getFullYear(), today.getMonth(), today.getDate());
  const endOfDay = new Date(startOfDay.getTime() + 24 * 60 * 60 * 1000);

  const events = calendar.getEvents(startOfDay, endOfDay);

  const dateLabel = Utilities.formatDate(
    today, 'Asia/Tokyo', 'yyyy/MM/dd(E)'
  );

  let body;
  if (events.length === 0) {
    body = '本日の登録済み予定はありません。';
  } else {
    body = events.map(function (ev) {
      const time = ev.isAllDayEvent()
        ? '終日'
        : Utilities.formatDate(ev.getStartTime(), 'Asia/Tokyo', 'HH:mm');
      return '・' + time + ' ' + ev.getTitle();
    }).join('\n');
  }

  const message = [
    ':calendar: 本日 (' + dateLabel + ') の朝会リマインド',
    '',
    body,
    '',
    '良い1日を!'
  ].join('\n');

  postToSlack_(webhookUrl, message);
}

/**
 * Slack Incoming Webhook へ送信(失敗時はエラーを投げる)
 */
function postToSlack_(webhookUrl, text) {
  const options = {
    method: 'post',
    contentType: 'application/json',
    payload: JSON.stringify({ text: text }),
    muteHttpExceptions: true
  };

  const res = UrlFetchApp.fetch(webhookUrl, options);
  const code = res.getResponseCode();

  if (code !== 200) {
    console.error('Slack 送信失敗 code=' + code + ' body=' + res.getContentText());
    throw new Error('Slack への送信に失敗しました (HTTP ' + code + ')');
  }
}

Webhook URL とカレンダーIDの登録(コードに直書きしない)

STEP 2 で控えた URL と、通知したいカレンダーの ID は、コードに直接書かず「スクリプトプロパティ」に保存します。この URL を知っている人は誰でもチャンネルに投稿できてしまうため、コードへの直書きは避けるのが安全です。

  1. Apps Script エディタ左の**歯車アイコン(プロジェクトの設定)**を開く
  2. 最下部の「スクリプト プロパティ」で「スクリプト プロパティを追加」をクリック
  3. プロパティ名に SLACK_WEBHOOK_URL、値に STEP 2 の URL を入力
  4. 個人のマイカレンダーで通知するだけなら TARGET_CALENDAR_ID は省略可(自動的に primary を使用)。チーム共有カレンダーを使う場合は、カレンダーの設定画面にある「カレンダーの統合」欄のカレンダーIDをプロパティ名 TARGET_CALENDAR_ID として追加

💡 編集部メモ:個人ではなくチームの共有カレンダーを通知元にすると、朝会リマインドが「その日チームに入っている予定の一覧」になります。担当者ごとにカレンダーを分けている場合は、コード中の calendarId の部分を配列にして複数カレンダーをまとめて読み込む形に拡張できます。

保存とトリガー設定が終わったら、必ず自分で手動実行してテストしてください。次のセクションで、つまずきやすい点を整理します。

⚠️ 失敗パターンと運用上の注意

GAS は無料で強力ですが、初回だけ引っかかりやすい関門があります。編集部が特に注意すべきと考える 2 点を挙げます。

⚠️ 失敗パターン1:トリガーの時刻設定が「日付ベースのタイマー」の意味を誤解している。GASの時間主導型トリガーは「午前8時〜9時に実行」のように幅を持った時間帯でしか指定できず、秒単位で「8時ちょうど」に固定はできません。始業時刻より前に届いてほしい場合は、余裕を持って1時間早い帯(例: 午前7時〜8時)を選んでください。

⚠️ 失敗パターン2:個人のマイカレンダーを既定のまま使ってしまうTARGET_CALENDAR_ID を設定しないと自分個人の予定だけが通知されます。チーム全体の予定を共有したい場合は、共有カレンダーを作成し、そのカレンダーIDを明示的に設定してください。個人の予定と混在させたくない場合は、通知専用の共有カレンダーを分けるのが安全です。

初回設定時には、Google から「このアプリは確認されていません」という趣旨の警告が出ます。これは自分で書いたスクリプトに、自分のデータへのアクセスを許可するための画面です。詳細を開いてプロジェクト名が自分のものであることを確認し、承認すれば先へ進めます。

トラブル起こりやすい原因編集部の対策
通知が届かないトリガー未作成、または種類が誤りイベントのソースが「時間主導型」か確認
エラーメールが届くWebhook URL 未設定・失効スクリプトプロパティの値を再登録
予定が1件も出ないカレンダーIDの誤り、または終日予定の扱いTARGET_CALENDAR_ID を再確認、終日予定は「終日」表示になる仕様
個人の予定しか出ないTARGET_CALENDAR_ID 未設定共有カレンダーのIDを明示的に設定

なお GAS には 1 日あたりの実行時間や外部通信回数の上限がありますが、通知1件あたりの処理は数秒で終わるため、通常のチーム規模では上限に届きません。詳細はApps Script の割り当てと制限を確認してください。次のセクションで、この25分の投資が経営上どう返ってくるかを整理します。

🚀 経営者はこの25分をどう回収するか

編集部の想定シナリオを1つ挙げます。従業員6名の制作会社で、管理者が毎朝各担当者に「今日の予定」を口頭やチャットで個別確認しているケースです(実在の企業の事例ではありません)。

かかった費用は¥0、かかった時間は初回の25分だけです。基本形が動いたら、次の応用も同じコードの延長で組めます。

当サイトでは、カレンダー・Slack連携系の自動化を複数紹介しています。あわせて読むと設計の引き出しが増えます。

編集部のまとめ:このレシピの本質は「予定確認という毎日の反復作業を、口頭からシステムへ移す」ことです。GAS を選べば、その仕組みを月¥0で、チームが増えても値上がりしない形で持てます。まずは通知が届く体験を作り、そのうえで担当者振り分けや要約といった応用へ進むのが堅実な順序です。

出典・参考情報


Mira / AI経営ラボ 編集長