今回は、前回作った「タスク通知」に、新たに「今日の予定(カレンダー)」を合体させます。朝起きたら、メールを見るだけで「今日の絶望(忙しさ)」と「やるべきこと」が全て把握できる。そんな「最強のモーニングレポート」を作成します。
前回、あなたは「期限切れタスク」を自分に通知するシステムを手に入れた。
しかし、人間とはどこまでも強欲な生き物だ。あなたは数日後にこう思うはずだ。
「タスクだけ言われてもさぁ、今日会議がいっぱいあったら消化できないじゃん?」
「いちいち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;
}
コメント