見出し画像

Notion で(自分なりの)タスク・時間管理を始めよう!(拡張編③)

前回は「拡張編」の第二弾として「見積もり」機能を導入し、前々回と合わせて「時刻」を扱うことができるようになり、
単なるタスク管理の手法ではなく「時間管理術」でもある「タスクシュート」が、大体のところは、実践できるようになってきました。

もちろん、自分なりにカスタマイズし、最適化していく余地もたくさん残されていますが、基本的に、あとは「運用」次第でしょう。

そう言えば、各タスクの「見積もり値」と比較するための、実際の「実行時間」については、「入門編」の最後の方でも、少しだけ触れましたが、
すっかり忘れていたので、例えば「見積値」に対する「実績値」として、改めて、追加しておきたいと思います。

「実績値」を追加する

数式は、次のように設定しました。

dateBetween(prop("終了日時"), prop("開始日時"), "minutes")

さて、この他に、あなたなら、どのような拡張を行いたいですか?

実は「時間管理術」という側面から言えば、運用上、多くの人にとって欠かせないものがあります。
それは、会議やイベントなどの「日時が決まっている予定」の管理です。

当然、なんらかの予定がある場合には、その分「今日のプラン」を立てる際に、それを考慮してタスクを入れていかなくてはなりません。

タスクシュートでは「今日のタスク」だけに焦点を合わせるため、今まであまり意識していませんでしたし、
単に、毎朝、カレンダーを見て、その日の予定も含め、一つずつ自分でタスクを登録していけば良いのですが、

例えば、朝起きた時、カレンダーに入っている今日の予定が「今日のタスク」として自動的に追加されていれば、毎日の手間が少し省けます。

というわけで、今回は、使い方によっては「ルーチン」さえ代替することが可能な、カレンダーからタスクを自動生成する方法を紹介しましょう。

まぁ、有り体に言えば「Google カレンダーとの連携」を行うわけですが、人によっては、ちょっとハードルが高い内容になるかもしれません。


カレンダーから今日の予定を取得する

まずは、Google カレンダーから「今日の予定」を取得できるかどうか、試してみましょう。

そこで問題となってくるのは、Google の「Apps Script」の説明を、どこまで丁寧に行うかという点なのですが、
多分、それだけで記事を書いても足りないくらいだと思うので、

あえて、ごく簡単に紹介することにより、とりあえず、自分にもできそうかどうか、やる気があるかだけ、ここで判断してもらえればと思います。

では、Google にログインして、https://script.google.com/home にアクセスし、「新しいプロジェクト」を作成してください。

そして、次のページを参考に、自分の Google カレンダーから「今日の予定」を取得してみましょう!

最初に、左のサイドバーにある「サービス」の「+」ボタンから、「Google Calendar API」を追加し、

「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」が追加されているはずです。

「接続先」から「Notion API」を選ぶ

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

「Notion API」にアクセスを許可する

それでは、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 のデータベースに登録(ページを作成)することができます。

postNotion() を利用して「今日のタスク」を追加する

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}

Working with databases (notion.com)

ここから、{database_id} の部分を抜き出すわけですね。

Notion API の「シークレット」については、インテグレーションを追加した際にも気付いていたかもしれませんが、
https://www.notion.so/my-integrations で、後からでも確認できます。

それでは、「postNotion()」の準備が整ったら、もう一度「myFunction()」を実行してみましょう!

これで、Notion の「タスクリスト」にタスクが追加されましたでしょうか?

Notion に今日のタスクを追加する

ちなみに、Notion API を初めて使おうとした際にも、承認が求められると思いますが、カレンダーの時と同様、アクセスを許可しておいてください。

また、タスクが「セクションなし」に分類されてしまうことや、
このままだと「終日イベント」には対応できないことに、不満があるという方もいるかもしれませんが、
もちろん、いくらでも改良していくことができるので、今後の記事にご期待いただければと思います。

トリガーを追加して自動実行させる

さて、最後に、手動で「実行」ボタンを押さなくても、毎朝、起きたらタスクが自動生成されているように、設定をしておきましょう。

実は「Apps Script」を使えば、それも非常に簡単なのです。

ページの左端にある、アイコンが並んでいるバーにカーソルを合わせ、その中から「トリガー」を選択して、
今まで開いていた「エディタ」画面から、移動してみてください。

「トリガー」画面に移動する

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

「トリガーを追加」する

デフォルトから変更したのは下二つの項目で、トリガーのタイプで「日付ベースのタイマー」を選択し、時刻を「午前0時〜1時」にしただけですが、
もし、実行する関数が「postNotion」になっていたりした場合には、自動実行すべき関数の名前を、適切に選択し直しておいてください。

まとめ

前回の記事でも、Notion の数式と「リレーション」との組み合わせまで活用し始めたので、少し難しく感じた方も多かったかもしれませんが、
今回は、ついに Google の「Apps Script」(通称「GAS」)まで導入したため、さらに難易度が上がって参りました。

しかし、ここを乗り越えられれば、大体なんでもできますし、
より柔軟な自動化が行えるだけでなく、数式に頼り過ぎず、Notion が重くなってしまうのを避けやすくなったりなど、様々なメリットがあります。

特に、いちばん大きいのは、実は「データベーステンプレート」を使わずとも、「ルーチンデータベース」からルーチンを取得して、
タスクを自動生成することも、これで可能になるという点でしょうか。

というわけで、次回は「ルーチン」と、ついでに「セクション」をデータベースで管理する方法も紹介したいと思います。

ではまた。

いいなと思ったら応援しよう!