はじめに
プライベートな話ですが、普段ToDoリストとしてNotionを利用し、タスク管理をしています。妻からついでに管理してくれと言われ、さらにはリマインドしてくれとも言われます。しかしながら、忙しかったり、忘れていたりとまともにリマインドできないことから、人間リマインダーを引退できるような仕組みを考えたのが、今回のお話です。
1. 解決策
次のように解決しています。
なお、プライベートで作っているので、お金をなるべくかけないような策を講じています。
- LINE Messaging APIを利用してタスクを通知
- コンピューティングではGoogle App Script(GAS)を利用
- タスクを所定時刻に通知するようトリガーを設定
全体の仕組みは以下の図のようになります。
お金の話をしてみますと、
- GASはGoogleアカウントさえあれば無料
- LINE Messaging APIは応答メッセージおよび月200通までのPush通知は無料
- Notion APIは無料
で利用できるということで、プライベートで使う分には十分であるため、この仕組みでリマインダーを構築しています。
2. 実装
2.1. タスク周り
2.1.1. タスク登録
Notionページにタスク情報を格納し、タスク用のデータベースに登録しています。
タスク登録
// Notion Pageでタスク情報を登録する
let page = {
"parent": {
"database_id": TASK_DATABASE_ID
},
"properties": {
"名前": {
"title": [
{
"text": {
"content": taskName
}
}
]
},
"実施日": {
"date": {
"start": taskDate,
}
},
"ステータス": {
"select": {
"name": "着手前",
}
},
"通知": {
"select": {
"name": "する",
}
}
}
};
// Notionにリクエスト
let url = 'https://api.notion.com/v1/pages/';
let options = {
"method": "POST",
"headers": {
'Content-Type': 'application/json; charset=UTF-8',
'Authorization': 'Bearer ' + NOTION_TOKEN,
'Notion-Version': '2021-08-16',
},
"payload": JSON.stringify(page),
"muteHttpExceptions": true
};
JSON.parse(UrlFetchApp.fetch(url, options).getContentText());
2.1.2. タスクの問合せ
Notionのタスク用のデータベースからタスク実行日に通知する必要のあるタスク(ページ)を問い合わせするクエリを書いています。
タスク問合せ
// 該当するページをフィルタリングする
let pageFilter = [
{
"property": "ステータス",
"select": {
"does_not_equal": "完了"
}
},
{
"property": "通知",
"select": {
"equals": "する"
}
}
];
let url = 'https://api.notion.com/v1/databases/'+ TASK_DATABASE_ID + '/query';
let payload = {"filter": {"and": pageFilter }};
let options = {
"method": "POST",
"headers": {
'Content-Type': 'application/json; charset=UTF-8',
'Authorization': 'Bearer ' + NOTION_TOKEN,
'Notion-Version': '2021-08-16',
},
"payload": JSON.stringify(payload),
"muteHttpExceptions": true
};
let response = JSON.parse(UrlFetchApp.fetch(url, options).getContentText());
let tasks = response.results;
2.2. トリガー設定
リマインドすべきタスクに対して、GASでリマインドイベントを登録します。
もちろん、トリガーも自動で設定できるようにしないといけないのでGASで書いています。
トリガー設定
// functionNameはリマインド関数
// triggerTimeはリマインド時刻
let trigger = ScriptApp.newTrigger(functionName).timeBased().at(triggerTime).create();
let triggerUid = trigger.getUniqueId();
// トリガーする関数の引数の設定
let triggerData = {
"arguments": functionArguments
};
PropertiesService.getScriptProperties().setProperty(triggerUid, JSON.stringify(triggerData));
2.3. リマインド
時刻になったらLINE Messaging APIのPush通知にて、タスクの内容をリマインドします。
リマインド
let url = 'https://api.line.me/v2/bot/message/push';
let payload = {
to: sendTo,
messages: messages
};
let options = {
'method': 'post',
'contentType': 'application/json',
'headers': {
'Authorization': 'Bearer ' + LINE_TOKEN
},
'payload': JSON.stringify(payload)
};
JSON.parse(UrlFetchApp.fetch(url, options).getContentText());
3. 使ってみた
「@タスク登録」と入力し、タスク名と時刻を入力すると、LINEの中の猫が反応して、「登録するにゃん!」と返します。
そして、時刻になると「リマインドだにゃん!」とリマインドしてくれます。
タスク登録のUIが少々よろしくないので、改善したいと思っています。
さいごに
こうして、LINE通知により人間リマインダーを引退することはできましたが、妻のタスク登録代行をやることになったため、まだまだ引退できそうにないです。お金をかけたくないというのもあり、音声登録等でのタスク登録自動化は断念しましたが、このあたりの障壁がなくなりそうであれば、追加でやろうかなと思います。。。


