実践編②:Googleカレンダーも合体!寝起きの自分に「今日の絶望」を届ける最強モーニングレポート

今回は、前回作った「タスク通知」に、新たに「今日の予定(カレンダー)」を合体させます。朝起きたら、メールを見るだけで「今日の絶望(忙しさ)」と「やるべきこと」が全て把握できる。そんな「最強のモーニングレポート」を作成します。

前回、あなたは「期限切れタスク」を自分に通知するシステムを手に入れた。

しかし、人間とはどこまでも強欲な生き物だ。あなたは数日後にこう思うはずだ。

「タスクだけ言われてもさぁ、今日会議がいっぱいあったら消化できないじゃん?」

「いちいちGoogleカレンダー開いて、スプシ開いてって、画面を行き来するのダルいんだけど」

その通りだ。

優秀な執事なら、「旦那様、本日の期限切れタスクはこちらです。なお、本日は10時から会議がございますので、死ぬ気でやってください」とセットで報告すべきだ。

今回は、GASを使って「Googleカレンダー」の情報も引っこ抜き、タスク情報と混ぜ合わせて、朝一番にあなたへ送りつける「モーニングレポート」を作成する。

1. 【発端】カレンダーを見るのさえ面倒くさい

あなたは朝、スマホのアラームを止め、布団の中でうめき声を上げながらこう思う。

「今日、何時から会議だっけ…? 10時? 11時?

カレンダーアプリ開くの面倒くさいな…。

ていうか、今日やるタスクと今日の予定、一画面で見せろよ。

ニュースアプリみたいに、俺専用の『今日のまとめ』を勝手に届けてくれよ!」

この「アプリを切り替えるのさえ面倒」という極限の怠惰。

これが、今回の開発の原動力だ。

2. 【翻訳】カレンダーを「文字」にする

今回のターゲットは「Googleカレンダー」だ。

タスクの取得ロジックは前回のものを使い回せる。追加すべきは「今日の予定を取得する」部分だけだ。

【AIへの指示メモ(仕様書)】

  • 登場人物:

    • 前回作った「スプレッドシート(タスク)」
    • Googleカレンダー(新規追加)
    • Gmail(通知先)

  • 取得データ(カレンダー側):

    • 対象: 私のデフォルトのカレンダー
    • 期間: 今日の 0:00 から 23:59 まで
    • 中身: イベントの「開始時間」と「タイトル」が欲しい

  • 加工:

    • 時間順に並べる
    • 「10:00 – 定例会議」みたいな形式のテキストにする

  • 合体(出力):

    • メール本文の前半に「今日の予定」
    • 後半に「期限切れタスク(前回のやつ)」
    • これをまとめて1通のメールで送る

「デフォルトのカレンダー」という表現がポイントだ。

Googleアカウントには最初からカレンダーがついている。これをGASでは getDefaultCalendar() という呪文一つで呼び出せる。IDとか難しいことは考えなくていい。

3. 【発注】AIへのプロンプト送信

では、前回のコードをパワーアップさせるよう、AIにお願いしよう。

ポイントは「前回のコード(または機能)に、カレンダー機能を追加して」と頼むことだ。

<実際に送信するプロンプト>

Plaintext

GASで「自分へのモーニングレポート」を作りたいです。
前回作った「スプレッドシートの期限切れタスク通知」の機能に加えて、
「Googleカレンダーから今日の予定」を取得して、まとめてメールで送るように改造してください。

# 要件
・スプレッドシートの仕様は前回と同じ(A列タスク、B列期限、C列ステータス)
・Googleカレンダーから「今日」のイベントを全て取得する。
・メールの本文を以下の構成にする。

件名:【朝刊】本日の予定と未消化タスク

本文:
おはようございます。今日の予定と残タスクです。

■ 今日のスケジュール
・10:00 - 11:00 定例会議
・13:00 - 14:00 ランチMTG
(予定がない場合は「予定はありません」と表示)

■ 期限切れ&今日のタスク
・請求書作成 (期限: 2023/10/05)
(対象がない場合は「残タスクはありません。素晴らしい!」と表示)

--------------------------------------------------
以上。今日も頑張りましょう。

# 技術的な指定
・CalendarApp.getDefaultCalendar() を使用してください。
・タスク取得ロジックは前回同様、「期限が今日以前」かつ「未完了」のものを対象にしてください。
・初心者なので、コード全体を書き直して提供してください。

4. 【実装】コピペ&実行

AIから出力されたコードを、前回同様にGASのエディタに貼り付ける。

(前回のコードは消して、まるごと上書きしてしまってOKだ)

実行ボタン(▷)を押すと、今度は「カレンダーへのアクセス権限」も求められる。

「許可」を押そう。あなたのカレンダーの中身をGASが覗き見することを許す瞬間だ。

結果はどうだ?

受信ボックスを見てみよう。

あなたの今日の会議と、放置しているタスクがズラリと並んだメールが届いているはずだ。

これこそが、あなた専用の秘書からの「朝刊」だ。

5. 【仕上げ】毎朝のルーティンに組み込む

このスクリプトのトリガーを「午前7時〜8時」くらいに設定しておこう。

これであなたは、朝起きてトイレの中でスマホを見るだけでいい。

「うわ、今日10時から会議かよ。しかもこのタスク終わってないじゃん」

その絶望を、布団を出る前に把握できる。

アプリを開く手間すら省く。これこそが自動化の極意であり、究極の時短だ。


【実践編② 付属資料】

1. AIが生成する標準コード(基本編)

タスクとスケジュールを合体、基本的な「モーニングレポート」生成コードです。

JavaScript

function sendMorningReport() {
  // --- 設定 ---
  var recipient = 'your-email@example.com'; // ★自分のメアド
  var subject = '【朝刊】本日の予定と未消化タスク';
  
  // --- 1. カレンダー情報の取得 ---
  var calendar = CalendarApp.getDefaultCalendar();
  var today = new Date();
  
  // 今日のイベントを取得
  var events = calendar.getEventsForDay(today);
  var scheduleText = '';
  
  if (events.length === 0) {
    scheduleText = '・予定はありません。ゆっくりコーヒーでも飲みましょう。\n';
  } else {
    for (var i = 0; i < events.length; i++) {
      var title = events[i].getTitle();
      var startTime = events[i].getStartTime();
      var endTime = events[i].getEndTime();
      
      // 時間を HH:mm 形式に整形
      var timeStr = Utilities.formatDate(startTime, Session.getScriptTimeZone(), 'HH:mm') + ' - ' + 
                    Utilities.formatDate(endTime, Session.getScriptTimeZone(), 'HH:mm');
      
      // 終日イベントの場合は時間表示を変える
      if (events[i].isAllDayEvent()) {
        timeStr = '終日';
      }
      
      scheduleText += '・' + timeStr + ' ' + title + '\n';
    }
  }

  // --- 2. タスク情報の取得(前回と同じロジック) ---
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var data = sheet.getDataRange().getValues();
  var taskText = '';
  var hasTasks = false;

  // 時間比較用にtodayの時刻をリセット
  today.setHours(0, 0, 0, 0);

  for (var i = 1; i < data.length; i++) {
    var taskName = data[i][0];
    var dueDate = new Date(data[i][1]);
    var status = data[i][2];

    if (isNaN(dueDate.getTime())) continue;
    dueDate.setHours(0, 0, 0, 0);

    // 「期限が今日以前」かつ「未完了」
    if (dueDate <= today && status !== '完了') {
      var dateString = Utilities.formatDate(dueDate, Session.getScriptTimeZone(), 'yyyy/MM/dd');
      taskText += '・' + taskName + ' (期限: ' + dateString + ')\n';
      hasTasks = true;
    }
  }

  if (!hasTasks) {
    taskText = '・残タスクはありません。素晴らしい!\n';
  }

  // --- 3. メールの作成と送信 ---
  var body = 'おはようございます。\n今日の予定と、やらなきゃいけないタスクの一覧です。\n\n' +
             '■ 今日のスケジュール\n' + scheduleText + '\n' +
             '■ 期限切れ&今日のタスク\n' + taskText + '\n' +
             '--------------------------------------------------\n' +
             '今日も一日、適度に頑張りましょう。';
             
  GmailApp.sendEmail(recipient, subject, body);
}

2. 拡張アイデアコード(応用編)

追加機能:「明日の予定」も予習する & カレンダーの色分け(重要度)判定

「今日の夜、飲み会の予定入れたっけ?」「明日の朝イチ会議あったっけ?」

そんな不安を解消するために、「明日のスケジュール」もついでに載せておきます。

さらに、カレンダーのイベントタイトルに【重要】などの文字が含まれていたら、強調マークをつける小技を追加しました。

JavaScript

function sendMorningReportAdvanced() {
  var recipient = 'your-email@example.com'; // ★自分のメアド
  var subject = '【完全版】今日の戦況報告と明日の予習';
  
  var calendar = CalendarApp.getDefaultCalendar();
  var today = new Date();
  var tomorrow = new Date();
  tomorrow.setDate(today.getDate() + 1); // 明日の日付を作る
  
  // --- 関数:日付ごとの予定をテキスト化する便利ツール ---
  function getScheduleText(date) {
    var events = calendar.getEventsForDay(date);
    var text = '';
    
    if (events.length === 0) return '・(予定なし)\n';
    
    for (var i = 0; i < events.length; i++) {
      var title = events[i].getTitle();
      var startTime = events[i].getStartTime();
      var timeStr = events[i].isAllDayEvent() ? '終日' : Utilities.formatDate(startTime, Session.getScriptTimeZone(), 'HH:mm');
      
      // ★拡張:タイトルに「重要」や「MTG」が含まれていたら絵文字をつける
      var icon = '';
      if (title.indexOf('重要') !== -1) icon = '🚨';
      else if (title.indexOf('MTG') !== -1 || title.indexOf('会議') !== -1) icon = '📝';
      else if (title.indexOf('ランチ') !== -1 || title.indexOf('飲み') !== -1) icon = '🍺';
      
      text += '・' + timeStr + ' ' + icon + ' ' + title + '\n';
    }
    return text;
  }
  
  // --- 各セクションの作成 ---
  var todaySchedule = getScheduleText(today);
  var tomorrowSchedule = getScheduleText(tomorrow);
  
  // タスク取得部分は長くなるので省略(基本コードと同じロジックを入れてください)
  // ここでは簡易的に呼び出す想定
  var taskText = getOverdueTasksLogic(); // ※自作関数として切り出すと綺麗です

  // --- メールの組み立て ---
  var body = 'お疲れ様です。今日のスケジュールと、明日の心の準備です。\n\n' +
             '【📅 今日 (' + (today.getMonth()+1) + '/' + today.getDate() + ') の予定】\n' + 
             todaySchedule + '\n' +
             '【💀 倒すべきタスク】\n' + 
             taskText + '\n' +
             '【👀 明日 (' + (tomorrow.getMonth()+1) + '/' + tomorrow.getDate() + ') の予習】\n' + 
             tomorrowSchedule + '\n' +
             '--------------------------------------------------\n' +
             'スプレッドシートを開く: ' + SpreadsheetApp.getActiveSpreadsheet().getUrl();

  GmailApp.sendEmail(recipient, subject, body);
}

// (参考) タスク取得ロジックの関数化イメージ
function getOverdueTasksLogic() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var data = sheet.getDataRange().getValues();
  var today = new Date();
  today.setHours(0,0,0,0);
  var text = '';
  
  for (var i = 1; i < data.length; i++) {
    var dueDate = new Date(data[i][1]);
    if (!isNaN(dueDate) && dueDate <= today && data[i][2] !== '完了') {
       text += '・' + data[i][0] + '\n';
    }
  }
  return text === '' ? '・残タスクなし\n' : text;
}


part 5 of 11 【講座名】 AI-GAS[スプレッドシート自動化]

AI-GAS[スプレッドシート自動化]

【GAS初心者】作りたいものが思いつかない?「我慢」をやめれば自動化のネタは無限に湧いてくる

【AI×GAS】AIは「察してちゃん」が大嫌い!欲望を箇条書きにする「思考の翻訳」トレーニング

【GAS初心者】環境構築という「最初のボス」はもういない ——GASとスプレッドシートの蜜月関係

実践編①:「明日やろうは馬鹿野郎」を撲滅せよ —— 期限切れタスクを自分にチクリ報告する「Gmailリマインダー」

実践編②:Googleカレンダーも合体!寝起きの自分に「今日の絶望」を届ける最強モーニングレポート

実践編③:YouTubeを監視せよ!寝ている間に「推し」や「トレンド」を勝手にリストアップする諜報員Bot

実践編④:クリック地獄からの解放!スプレッドシートの「質問リスト」からGoogleフォームを全自動生成する

実践編⑤:24時間365日「即レス」する無敵の受付嬢!フォーム回答への自動返信&自分への通知システム

実践編⑥:画面が真っ赤になっても心停止しない!エラーメッセージはAIへの「ネタ振り」だと思え

実践編⑦:読むな、感じろ……いや、AIに読ませろ!Gemini APIで「長文アンケート」を3秒で要約&感情分析する

第8回(最終回):結論、プログラマーになる必要はない。「プロの指示出しおじさん/おばさん」になれ

コメント

この記事へのコメントはありません。

PAGE TOP