Notion で(自分なりの)タスク・時間管理を始めよう!(拡張編③)
前回は「拡張編」の第二弾として「見積もり」機能を導入し、前々回と合わせて「時刻」を扱うことができるようになり、
単なるタスク管理の手法ではなく「時間管理術」でもある「タスクシュート」が、大体のところは、実践できるようになってきました。
もちろん、自分なりにカスタマイズし、最適化していく余地もたくさん残されていますが、基本的に、あとは「運用」次第でしょう。
そう言えば、各タスクの「見積もり値」と比較するための、実際の「実行時間」については、「入門編」の最後の方でも、少しだけ触れましたが、
すっかり忘れていたので、例えば「見積値」に対する「実績値」として、改めて、追加しておきたいと思います。

数式は、次のように設定しました。
dateBetween(prop("終了日時"), prop("開始日時"), "minutes")さて、この他に、あなたなら、どのような拡張を行いたいですか?
実は「時間管理術」という側面から言えば、運用上、多くの人にとって欠かせないものがあります。
それは、会議やイベントなどの「日時が決まっている予定」の管理です。
当然、なんらかの予定がある場合には、その分「今日のプラン」を立てる際に、それを考慮してタスクを入れていかなくてはなりません。
タスクシュートでは「今日のタスク」だけに焦点を合わせるため、今まであまり意識していませんでしたし、
単に、毎朝、カレンダーを見て、その日の予定も含め、一つずつ自分でタスクを登録していけば良いのですが、
例えば、朝起きた時、カレンダーに入っている今日の予定が「今日のタスク」として自動的に追加されていれば、毎日の手間が少し省けます。
というわけで、今回は、使い方によっては「ルーチン」さえ代替することが可能な、カレンダーからタスクを自動生成する方法を紹介しましょう。
まぁ、有り体に言えば「Google カレンダーとの連携」を行うわけですが、人によっては、ちょっとハードルが高い内容になるかもしれません。
カレンダーから今日の予定を取得する
まずは、Google カレンダーから「今日の予定」を取得できるかどうか、試してみましょう。
そこで問題となってくるのは、Google の「Apps Script」の説明を、どこまで丁寧に行うかという点なのですが、
多分、それだけで記事を書いても足りないくらいだと思うので、
あえて、ごく簡単に紹介することにより、とりあえず、自分にもできそうかどうか、やる気があるかだけ、ここで判断してもらえればと思います。
では、Google にログインして、https://script.google.com/home にアクセスし、「新しいプロジェクト」を作成してください。
そして、次のページを参考に、自分の Google カレンダーから「今日の予定」を取得してみましょう!
最初に、左のサイドバーにある「サービス」の「+」ボタンから、「Google Calendar API」を追加し、

例えば、以下のように JavaScript を記述します。
function myFunction() {
const today = new Date();
const tomorrow = new Date(today.getTime() + (24 * 60 * 60 * 1000));
const events = Calendar.Events.list('primary', {
timeMax: tomorrow.toISOString(),
timeMin: today.toISOString(),
singleEvents: true,
orderBy: 'startTime'
});
for (const event of events.items) {
const start = new Date(event.start.dateTime);
const end = new Date(event.end.dateTime);
console.log('%s (%s ~ %s)', event.summary, start.toLocaleTimeString(), end.toLocaleTimeString());
}
}日時の扱いは、なかなか難しいかもしれませんが、細かいことは置いておいて、いちばん重要なのは「Calendar.Events.list()」の使い方です。
簡単に言うと、ログインしている Google アカウントの(デフォルトの)カレンダーから、「timeMin」〜「timeMax」の期間の予定を取得していて、
ここでは、プログラムを実行した瞬間の日時から、ちょうど24時間後までを対象としています。
ちなみに、この関数( API )のパラメータ等について、詳しいことを知りたい方は、次のドキュメントを参照してください。
ともあれ、コードを入力したら、上部のメニューから「プロジェクトを保存」した上で「実行」ボタンを押します。
初めて実行しようとした時には「承認が必要です」と言われ、

しばらく進んでいくと、次のような画面で戸惑うかもしれませんが、

左下の「詳細」を開けば、さらに下に「無題のプロジェクト(安全ではないページ)に移動」というようなリンクが現れるので、
それをクリックすれば、このアプリからカレンダーへのアクセスが許可され、以後、プログラムが実行できるようになるはずです。
実行すると、今日の(今から24時間後までの)予定が、ログに出力されましたでしょうか?

Notion に今日のタスクを追加する
次に、Google カレンダーから取得した「今日の予定」を「今日のタスク」として、Notion のデータベースに追加してみましょう。
そのためには、Notion 側でも、API 経由で操作ができるように、あらかじめ準備をしておく必要があります。
まず、https://www.notion.so/my-integrations にアクセスし、適当に「新しいインテグレーションを追加」してください。
例えば、インテグレーションの名前を「Notion API」などとして、一応、分かりやすいように Notion のロゴも設定したとすると、
次のように、ページ右上の「…」メニュー内の下の方にある「接続先」の中に、「Notion API」が追加されているはずです。

選択すると、確認のポップアップが現れるので、「はい」を押せば、API を経由して、Notion が操作できるようになるというわけですね。

それでは、Google Apps Script に戻って、先ほどのプログラムに、以下のようなコードを追記しましょう。
function postNotion(database_id, title, start, minutes, secret) {
const time = start.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', hour12: false });
const data = {
"parent": { "type": "database_id", "database_id": database_id },
"properties": {
"title": { "type": "title", "title": [{ "type": "text", "text": { "content": title } }] },
"実行日": { "type": "date", "date": { "start": start } },
"開始予定時刻": { "rich_text": [{ "type": "text", "text": { "content": time } }] },
"見積値": { "type": "number", "number": minutes }
}
};
const options = {
'method': 'post',
'headers': {
'Authorization': 'Bearer ' + secret,
'Content-Type': 'application/json',
'Notion-Version': '2022-06-28'
},
'payload': JSON.stringify(data)
};
UrlFetchApp.fetch('https://api.notion.com/v1/pages', options);
}これで「postNotion()」という独自の関数が使えるようになりました。
例えば、最初のプログラム(myFunction)で、カレンダーから「今日の予定」を取得した後、ただログを表示する代わりに、
以下のように書けば、「今日のタスク」を Notion のデータベースに登録(ページを作成)することができます。

13, 14行目に注目です。
ここで、自動生成されるタスクに設定しておく「見積値」は、次のように算出しているだけですが、
const minutes = (end - start) / 1000 / 60;他に「postNotion()」へ渡している引数として、"xxxxx" と "secret_XXXXX" があり、
postNotion("xxxxx", event.summary, start, minutes, "secret_XXXXX");それぞれ「タスクリストデータベースの ID」と「Notion API のシークレット」に書き換える必要があるので、ご注意ください。
データベースの ID を調べるためには、データベースを「フルページ」で開き、その URL を参照します。
例えば、「タスクリスト」のテーブルを右クリックして「ページとして開く」を押すというのが、いちばん分かりやすいでしょうか。

そのページの URL は、次のような形式になっているはずです。
https://www.notion.so/{workspace_name}/{database_id}?v={view_id}
ここから、{database_id} の部分を抜き出すわけですね。
Notion API の「シークレット」については、インテグレーションを追加した際にも気付いていたかもしれませんが、
https://www.notion.so/my-integrations で、後からでも確認できます。
それでは、「postNotion()」の準備が整ったら、もう一度「myFunction()」を実行してみましょう!
これで、Notion の「タスクリスト」にタスクが追加されましたでしょうか?

ちなみに、Notion API を初めて使おうとした際にも、承認が求められると思いますが、カレンダーの時と同様、アクセスを許可しておいてください。
また、タスクが「セクションなし」に分類されてしまうことや、
このままだと「終日イベント」には対応できないことに、不満があるという方もいるかもしれませんが、
もちろん、いくらでも改良していくことができるので、今後の記事にご期待いただければと思います。
トリガーを追加して自動実行させる
さて、最後に、手動で「実行」ボタンを押さなくても、毎朝、起きたらタスクが自動生成されているように、設定をしておきましょう。
実は「Apps Script」を使えば、それも非常に簡単なのです。
ページの左端にある、アイコンが並んでいるバーにカーソルを合わせ、その中から「トリガー」を選択して、
今まで開いていた「エディタ」画面から、移動してみてください。

右下の「トリガーを追加」ボタンなどから、例えば、次のような設定でトリガーを作成しておくだけで、毎日、上で作ったプログラムを自動実行し、
つまり、その日の(24時間後までの)予定を Google カレンダーから取得して、Notion へ「今日のタスク」として自動的に追加してくれます!

デフォルトから変更したのは下二つの項目で、トリガーのタイプで「日付ベースのタイマー」を選択し、時刻を「午前0時〜1時」にしただけですが、
もし、実行する関数が「postNotion」になっていたりした場合には、自動実行すべき関数の名前を、適切に選択し直しておいてください。
まとめ
前回の記事でも、Notion の数式と「リレーション」との組み合わせまで活用し始めたので、少し難しく感じた方も多かったかもしれませんが、
今回は、ついに Google の「Apps Script」(通称「GAS」)まで導入したため、さらに難易度が上がって参りました。
しかし、ここを乗り越えられれば、大体なんでもできますし、
より柔軟な自動化が行えるだけでなく、数式に頼り過ぎず、Notion が重くなってしまうのを避けやすくなったりなど、様々なメリットがあります。
特に、いちばん大きいのは、実は「データベーステンプレート」を使わずとも、「ルーチンデータベース」からルーチンを取得して、
タスクを自動生成することも、これで可能になるという点でしょうか。
というわけで、次回は「ルーチン」と、ついでに「セクション」をデータベースで管理する方法も紹介したいと思います。
ではまた。
