はじめに
こんにちは。
最近は兼務もあって仕事の種類が多岐にわたり、自分は何屋なのかふわふわしている市野です。
そんな自分でも部門に関わらず発生するイベントがあります。そう、飲み会です。みなさんは飲み会の精算はちゃんとできていますか? 自分は酔っ払うと支払ったことを忘れがちなのですが、先日今年分の未回収額を計算したら8万ほどになっていました、、
というわけで今後は忘れないように自動で精算のTODOを作るシステムを作ってみました。
補足
飲み会はGoogleカレンダー内の飲み会用予定表に記載されており、予定表内はすべて飲み会の予定となっています。そのため今回は予定のフィルタリング処理は考慮していません。
構成
構成は非常にシンプル。Googleカレンダーから当日の予定を取得&予定があればタスク作成、という処理を1日1回GAS上で実行するというものです。
準備
1. カレンダーIDの確認
予定を取得するカレンダーのIDを控えておきます。
- Googleカレンダーを開く
- 左メニュー>対象カレンダーの3点リーダー>設定と共有
- 左メニュー>カレンダーの統合>カレンダーID
2. タスクリストIDの確認
タスクを作成するタスクリストのIDも控えておきます。(デフォルトだと「マイタスク」と表示されているやつです)
公式のAPIリファレンスから確認できます。
https://developers.google.com/tasks/reference/rest/v1/tasklists/list
- 上記リファレンスにアクセス
- 右メニュー>API>Execute
作り方
1. GASの作成
適当な名前でGoogle Apps Scriptを作成します。ご参考までに私が実行しているコードです。
const CALENDAR_ID = "〓カレンダーIDを入力〓";
const TASK_LIST_ID = "〓タスクリストIDを入力〓";
const now = new Date(Date.now() + ((new Date().getTimezoneOffset() + (9 * 60)) * 60 * 1000));
function getTodayEventTitles(cal) {
return cal.getEventsForDay(now).map(evt => evt.getTitle());
}
function craeteTodo(title) {
// 期限を3日後の12時に設定
const due = new Date(now.getTime());
due.setDate(now.getDate() + 3);
const dueStr = Utilities.formatDate(due, "JST", "yyyy-MM-dd") + "T12:00:00.000Z";
Logger.log(dueStr);
const task = {
'title': title + "の精算",
'notes': '',
'due': dueStr
};
Tasks.Tasks.insert(task, TASK_LIST_ID);
Logger.log(`予定(${title})の精算タスクを作成しました`)
return;
}
function main() {
const cal = CalendarApp.getCalendarById(CALENDAR_ID);
let events = getTodayEventTitles(cal);
if (events.length == 0) {
Logger.log(`${Utilities.formatDate(now, "JST", "yyyy/MM/dd")}は飲み会予定がありません`);
return;
}
for (let eventTitle of events) {
craeteTodo(eventTitle);
}
}
2. Google Tasksサービスの呼び出し
上で用意したGASを開いた状態で、
左メニュー>サービス>Tasks APIを選択。
3. コードの定期実行の設定
最後にmain関数が毎日実行されるように設定します。
- GASスクリプトを開く
- 左メニュー>トリガー>トリガーの作成
結果
getTodayEventTitles()
を実行すると以下のようにイベントが取得できます。
main()
が実行されるとGoogleタスクが作成されていました。
終わりに
こういったちょっとしたものを作るのにGASは手軽だし便利ですね。Googleエコシステムフル活用でとても簡単に実装できました。コード量も2,3十行程度で、構想から実装まで2,3時間といったところ。飲み会の精算にお困りの方はぜひ損失を出す前に参考にしてみてください。