GASでGoogleカレンダー→Slack朝会リマインド自動化 週1時間の連絡を削減
毎朝「今日の予定どうなってる?」とSlackで聞かれる、あるいは自分でカレンダーを開いて手打ちで共有する——この繰り返しは、Google Apps Script に朝会リマインドを任せるだけで消えます。外部の自動化サービスを契約せず、月額¥0のまま、週あたり約1時間の連絡工数を削減する方法をコードごと公開します。
- 毎朝決まった時刻に、その日のGoogleカレンダー予定をSlackへ自動投稿(人の操作ゼロ)
- 外部の自動化サービスは不要。Google 標準機能だけで月¥0、予定件数による課金なし
- 本記事のコードはそのままコピーして動く(時間主導型トリガー+Slack Webhook)
- 設定は約25分、必要なのは Googleアカウントと Slack のワークスペース管理権限のみ
- チーム全員が同じ情報を同じタイミングで見るため、朝会の「予定確認」に費やす時間そのものが減る
編集長の見解:朝会が長引く原因の多くは、議論ではなく「今日は誰が何時に何をするか」の確認に時間を取られていることです。ここで重要なのは、朝会そのものを無くすことではなく、確認作業だけを自動化することです。Slackを開けば予定が並んでいる状態を作れば、朝会は本題からすぐ始められます。
🔍 なぜ「無料でできる」ことを知っておくべきか
朝会リマインドの自動化は、専用の自動化サービスを使えばクリックだけで組めます。ただし多くは連携数やタスク実行回数に応じた課金です。チームが増えるほど、通知のための費用も増えていきます。
Google Apps Script(以下 GAS)は、Googleアカウントに無料で付いてくるプログラム実行環境です。カレンダーに直接ひも付き、追加契約なしで「毎朝〇時に実行」という定期処理を組めます。
- 費用: 個人向け Googleアカウントでも無料で利用可能
- 件数: 予定の件数やメンバー数による従量課金がなく、チームが増えても金額は変わらない
- 停止リスク: 外部サービスの値上げや仕様変更に振り回されない
代わりに支払う対価は「コードを貼る」という一手間だけです。次のセクションで、その仕組み全体を図で確認します。
🗺 全体フロー — 3ステップで完結
構造は驚くほど単純です。毎朝決まった時刻に GAS が起動し、その日のカレンダー予定を取得して Slack の受け口(Incoming Webhook)へメッセージを送ります。
設定後は毎朝自動実行、人の操作はゼロ
登場する部品は 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 段階です。プログラミングの知識は不要で、コードは本記事のものをそのまま貼り付ければ動きます。
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 を知っている人は誰でもチャンネルに投稿できてしまうため、コードへの直書きは避けるのが安全です。
- Apps Script エディタ左の**歯車アイコン(プロジェクトの設定)**を開く
- 最下部の「スクリプト プロパティ」で「スクリプト プロパティを追加」をクリック
- プロパティ名に
SLACK_WEBHOOK_URL、値に STEP 2 の URL を入力 - 個人のマイカレンダーで通知するだけなら
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名の制作会社で、管理者が毎朝各担当者に「今日の予定」を口頭やチャットで個別確認しているケースです(実在の企業の事例ではありません)。
- 導入前: 管理者が1人あたり約2分かけて予定を確認して回る。5名分で毎朝約10分、週5日で週50分
- 導入後: Slackに届く朝会リマインドを見れば全員分の予定が一覧できるため、個別確認そのものが不要に
- 効果: 管理者の個別確認作業(週約50分)がほぼ丸ごとなくなり、週あたり概ね1時間相当の工数削減
かかった費用は¥0、かかった時間は初回の25分だけです。基本形が動いたら、次の応用も同じコードの延長で組めます。
- 担当者ごとの振り分け: 予定のタイトルに含まれる担当者名で、通知メッセージを分岐
- 前日リマインド化: 実行時刻や取得範囲を「翌日分」に変えれば、前日夕方のリマインドにも転用可能
- AI で要約: 予定が多い日は、件数が多いブロックだけAIで要約してから通知する
当サイトでは、カレンダー・Slack連携系の自動化を複数紹介しています。あわせて読むと設計の引き出しが増えます。
- Google Apps ScriptでGoogleフォーム回答をSlack即時通知するレシピ
- ZapierでGoogleカレンダー予定→Slack自動通知するレシピ
- Make.comで前日リマインド自動化するレシピ
- ZapierでCalendly予約→Slack通知→担当者アサインを自動化するレシピ
編集部のまとめ:このレシピの本質は「予定確認という毎日の反復作業を、口頭からシステムへ移す」ことです。GAS を選べば、その仕組みを月¥0で、チームが増えても値上がりしない形で持てます。まずは通知が届く体験を作り、そのうえで担当者振り分けや要約といった応用へ進むのが堅実な順序です。
出典・参考情報
- Google Apps Script 公式サイト
- Apps Script 時間主導型トリガー
- Apps Script CalendarApp リファレンス
- Apps Script の割り当てと制限
- Slack Incoming Webhooks 公式ドキュメント
- Slack アプリ管理画面
- Slack 料金プラン(日本語)
- Googleカレンダー 公式サイト
Mira / AI経営ラボ 編集長