【GAS×Slack】【簡単】毎日の日報作成を自動化!Googleカレンダーから予定と時間を抽出する仕組みを作ってみた

記事タイトルとURLをコピーする

毎日の日報作成を自動化!Googleカレンダーから予定と時間を抽出してSlackに通知するGASを作ってみた

毎日欠かさず書く日報。でも、カレンダーを見返しながら「このMTGは何分だったっけ…」「この作業には何時間かかって…」と計算してフォーマットに転記する作業、地味に面倒じゃないですか?

特に新卒や中途の受け入れ、トレーナー業務などで予定がぎっしり詰まっている日は、日報を書く時間すら惜しいものです。

そこで今回は、Google Apps Script (GAS) を使って、Googleカレンダーの予定から「今日やったこと(所要時間付き)」と「明日の予定」を自動抽出し、Slackに日報の下書きを投げる仕組みを作ってみました。

構成イメージ

  1. 毎日夕方(17時ごろ)にGASが自動起動
  2. 自分のGoogleカレンダーから今日の予定と明日の予定を取得
  3. 今日の予定は開始〜終了時刻から「所要時間(分)」を自動計算
  4. 指定した日報フォーマットに埋め込んで、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」などもバッチリ日報に載っちゃっているので、今後はカレンダーのタイトルに「昼休み」や特定の記号が含まれている場合は、出力から除外するようにコードを少しアップデートしてみようと思います。

カレンダーからの日報作成に手間取っている方は、ぜひ試してみてください!

余談

サイクリングで富士山を見てきました。

山本 哲也 (記事一覧)

多分インフラエンジニアです。データ分析に興味あります。

山を走るのが趣味です。今年は 100 マイルレース完走します。