Googleカレンダーの予定を自動的にToDoへ登録したい
ToDoには2種類あると思う。
- 通知が来たら即実行するもの。会議や打ち合わせを知らせるもの
- 通知が来ても当日か翌日中に実行できればよいもの。定期的な振り込みや買い物
1の通知は、そのことを知ればスマホの通知を消してしまっても良い。即時実行型の通知は、通知内容を知ったら消したくなるのが心情である。
しかし2の通知は違う。うかつに消してしまうとヤバい状況になる可能性がある。この類の通知は通知内容を実行後に消すものである。
つまり2の通知はToDoやタスクリストみたいな扱いにしたいのだ。
何をしたいの
『毎月25日に◯◯の料金を振り込む』とカレンダーへ定期的な予定として設定すると、その1日前にカレンダーからToDoへその内容をコピーしたい。
がやりたいことである。
どうやってやるの
- ToDoへ登録したい予定の通知方法をメールへ変更する
- カレンダーから飛ばされたメールへ特定のラベル
CreateToDoを付けるフィルタを設定する - 一定間隔でラベル
CreateToDoのメールをチェックしToDoへコピー後に削除する
3番目の動作をGoogle Apps Script(以前は違う名称だったような)で自動化し、10年近く運用して便利なので情報共有する。
Google Apps Scriptのコード
function createTodo() {
'use strict';
var threads = GmailApp.search('label:' + 'CreateToDo');
var tasklist = Tasks.Tasklists.list().getItems();
var tasklistid = tasklist[0].id;
var subject;
var tasks;
var notes;
for (var i = 0; i < threads.length; i++) {
subject = threads[i].getFirstMessageSubject();
notes = threads[i].getMessages();
tasks = Tasks.newTask();
if (subject.indexOf('通知:') == 0) {
tasks.title = subject.replace('通知: ', '') + '[!]';
}
else {
tasks.title = subject;
}
tasks.notes = notes[0].getBody();
Tasks.Tasks.insert(tasks, tasklistid);
threads[i].moveToTrash();
}
}
まったくコメントが無くて申し訳ない。しかし、読めば理解できるコードである。短いし。
カレンダーから飛ばされるメールのサブジェクトには必ず通知: と書いてあるので、その通知: を除去している。[!]を付加しているのは、このキーワードがToDoのタイトルに付いていると優先度高の項目になるためだ。予定にメモがあったらそれもToDo側へコピーしている。
このスクリプトを6時間おきに実行するように設定してある。
おまけ
for文中のif文のelseにいつ入るのか?
Gmailはメールアドレスへ+任意の文字列を付けて、別のメールアドレスでメールを送れる(これはGmailだけの機能なのか分からない)。
例えば、hoge@gmail.comはhoge+hoge@gmail.comと書いて送っても届くのだ。
elseでやってることは、hoge+createTodo@gmail.com宛のメールもラベルCreateToDoを付け、そのメールからToDoを作る処理である。