毎日の日報作成を自動化!Googleカレンダーから予定と時間を抽出してSlackに通知するGASを作ってみた
毎日欠かさず書く日報。でも、カレンダーを見返しながら「このMTGは何分だったっけ…」「この作業には何時間かかって…」と計算してフォーマットに転記する作業、地味に面倒じゃないですか?
特に新卒や中途の受け入れ、トレーナー業務などで予定がぎっしり詰まっている日は、日報を書く時間すら惜しいものです。
そこで今回は、Google Apps Script (GAS) を使って、Googleカレンダーの予定から「今日やったこと(所要時間付き)」と「明日の予定」を自動抽出し、Slackに日報の下書きを投げる仕組みを作ってみました。
構成イメージ
- 毎日夕方(17時ごろ)にGASが自動起動
- 自分のGoogleカレンダーから今日の予定と明日の予定を取得
- 今日の予定は開始〜終了時刻から「所要時間(分)」を自動計算
- 指定した日報フォーマットに埋め込んで、SlackにWebhookで送信
完全に自動化することはできませんが(「今日の学び」や「困っていること」は人間が書かないといけないので)、一番面倒な「予定の転記と時間計算」を機械に任せるだけでも楽になります。
手順1:SlackのIncoming Webhookを取得
まずは、日報の下書きを送りたいSlackチャンネル(自分専用のDMやプライベートチャンネルがおすすめ)のWebhook URLを取得しておきます。 SlackのAppディレクトリから「Incoming WebHooks」を追加してURLをコピーしておくだけです。(詳細は割愛します)
手順2:GASの作成とコードの貼り付け
Googleドライブから「Google Apps Script」を新規作成します。プロジェクト名は分かりやすく「日報作成」などにしました。


開いたエディタに、以下のコードをコピペします。

function createDailyReportDraft() { // 1. 設定 const slackWebhookUrl = "ここにコピーしたWebhook URLを貼り付けてください"; const calendarId = "primary"; // 自分のデフォルトカレンダー const today = new Date(); const tomorrow = new Date(today); tomorrow.setDate(today.getDate() + 1); // 翌日 // 2. 今日の予定を取得して所要時間を計算 const todayEvents = CalendarApp.getCalendarById(calendarId).getEventsForDay(today); let todayTaskText = ""; todayEvents.forEach(event => { if (!event.isAllDayEvent()) { const diffMs = event.getEndTime().getTime() - event.getStartTime().getTime(); const diffMin = Math.round(diffMs / (1000 * 60)); todayTaskText += `・${event.getTitle()} ${diffMin} min\n`; } }); // 3. 翌日の予定を取得(時間は不要なのでタイトルのみ) const tomorrowEvents = CalendarApp.getCalendarById(calendarId).getEventsForDay(tomorrow); let tomorrowTaskText = ""; tomorrowEvents.forEach(event => { if (!event.isAllDayEvent()) { tomorrowTaskText += `・${event.getTitle()}\n`; } }); // 4. メッセージフォーマットの組み立て const dateStr = Utilities.formatDate(today, "JST", "yyyy年MM月dd日"); const monthStr = Utilities.formatDate(today, "JST", "MM月"); const message = `${dateStr}\n\n` + `【月間目標: ${monthStr}】\n` + `・トレーナー業務を覚える\n` + `・改善対応\n` + `・ブログ\n\n` + `【今日やったことと達成度】\n` + `${todayTaskText || "・特になし\n"}\n` + `【今日の学び(考察)】\n` + `・\n\n` + `【今日対応したことで困っていること・アラートを出したいこと】\n` + `・\n\n` + `【翌営業日の予定】\n` + `${tomorrowTaskText || "・特になし\n"}\n` + `【諸連絡】\n` + `・なし`; // 5. Slackへ送信 const payload = { text: "本日の日報の下書きが作成されました!追記して提出してください。\n```\n" + message + "\n```" }; const options = { method: "post", contentType: "application/json", payload: JSON.stringify(payload) }; UrlFetchApp.fetch(slackWebhookUrl, options); }
※ slackWebhookUrl の部分だけ、手順1で取得したURLに書き換えます。
手順3:初回実行と権限の承認
コードが書けたら「実行」ボタンを押してテストしてみます。 GASがGoogleカレンダーや外部サービス(Slack)にアクセスするため、初回だけ警告画面が出ます。

「Advanced(詳細)」から「Go to 日報作成 (unsafe)」をクリックし、カレンダーへのアクセスなどを「Allow(許可)」して進めます。
手順4:トリガー(定期実行)の設定
手動で実行してもうまみがないので、毎日自動で動くように設定します。 左側のメニューから時計マークの「トリガー」を選択します。

右下の「トリガーを追加」ボタンを押し、以下のように設定します。

- 実行する関数:
createDailyReportDraft - イベントのソース:
時間主導型 - ベースのトリガー:
週ベースのタイマー - 曜日を選択:
毎週月曜日 - 時刻を選択:
午後5時~6時(退勤時間に合わせてお好みで)
このトリガーを 火曜〜金曜分も作成します。

これで設定は完了!
実行結果
実際に自動でSlackに飛んできた通知がこちらです。

カレンダーに登録していた「朝会」や「AWS Update確認」などの予定が拾われ、しっかり「◯◯ min」と所要時間まで計算されて出力されています。
あとはこのコードブロック内のテキストをコピーし、「今日の学び」や「アラート」の項目だけを自分の言葉でサクッと書き足して、本番の日報チャンネルに投稿すれば完了です。 web-hook 名などは好きなものに変えましょう。
おわりに
今回やってみて、日報作成のハードルがグッと下がりました。 ただ、実行結果のスクショを見ると「昼休み 60 min」などもバッチリ日報に載っちゃっているので、今後はカレンダーのタイトルに「昼休み」や特定の記号が含まれている場合は、出力から除外するようにコードを少しアップデートしてみようと思います。
カレンダーからの日報作成に手間取っている方は、ぜひ試してみてください!
余談
サイクリングで富士山を見てきました。
