株式会社TEMPのロゴ画像

Notionでためた行動ログを分析して、一日の時間の使い方を可視化する

↗︎ Notion に登録する(無料)

こんにちは、Notion アンバサダーの 円谷 です。

今週も YouTube 動画を1本アップロードしました。Notion 取材企画の第12弾ということで、タスク管理のプロに取材させていただきました。「タスク管理手法を学びたい!」という方はぜひ参考にしてみてください。テンプレートも配布してくれているので、気になる方はダウンロードしてみてください。高評価ボタンもポチってもらえると喜びます。

以上、宣伝でした🙏

🐈

さて、今回の記事では、 Notion にためた行動のログ を集計して、行動分析(時間の使い方を可視化)する方法について紹介します。僕の Twitter を見てもらってる人なら既にどんなものかイメージ付いてるかもしれないですが、こんな感じのやつです。

ツイート内のスクショにも載せているとおり、 僕は Notion に毎日のスケジュールを入れるようにしていて、何時にどういう行動をするのかをタイムラインビュー形式で表示 しています。Google カレンダーから自動で取り込んだ MTG 等の予定を表示させたり、空いている時間をどんなことに使うのかの計画を立てるのに使っています。

1日が終わる頃には、Notion のタイムラインビューには1日分の行動記録のデータがたまります。このデータを使って、自分の時間の使い方を可視化できないかなと思って完成したのが今回の記事で紹介する行動分析のグラフになります。

グラフによる可視化を試みた背景なんですが、最近なんだか精神状態があまりよろしくなく、ひたすら「生産しなきゃ!」というマインドになっていたというのがあります。実際は別に何にも追われていないのに、何かに常に追われているような気がして、空き時間を全てクリエイティブなことに注ぎ込まないと自分で自分を許せない、みたいな謎の状態になっていました。

もう少し生産の時間を減らして、インプットの時間を増やさないとどんどん消耗していくだけだなと感じて、まずはどの程度インプットの時間を取れているのかを見ることから始めることにしました。まだ数日しか運用できていのですが、実際に 今回の構築した仕組みで自分の時間の使い方が可視化された ことで、自分の理想の時間の使い方を考えるきっかけになりました。(そして案の定あまりインプットに時間を割けていないということも定量的に判明)

ちょっと個人的な背景の話が長くなっちゃったんですが、今回の記事では、僕が構築した Notion の行動ログのデータをグラフ化して可視化する方法について解説していきたいと思います。

🐈

ざっくりの仕組みを図にすると以下の画像のような感じです。

  • Notion 側に蓄積されたデータを GAS(Google Apps Script)を使って1日に1回 Google シートに吐き出し
  • Notion 側で付けたタグごとに Google シート内で集計
  • Google シート内でグラフとして可視化

今回の記事では、GAS(Google App Script)について、1日に1回定期実行させる仕組みについて、Google シートの仕組みについてそれぞれ解説しようと思います。(Notion 側のページの作りについては詳しくは解説しません。以下の動画を参考にしてみてください。)

GAS に関してはソースコードも一応載せておくので、気になった方はチャレンジしてみてください。(質問等あれば Twitter や Instagram の DM で受け付けているのでどうぞお気軽にご連絡ください!)

💡

今回の記事では Notion API という仕組みを使っています。Notion API は誰でも無料で使用可能で、使い方を知ればより自由に、自分だけのアプリケーションを作ることが可能です。Notion API について詳しく知りたいという方は、以下のリンクを参考にしてみてください。

Google Apps Script のソースコード解説

まず、GAS(Google Apps Script) のソースコード解説からです。Notion のデータを取得する関数と、スプレッドシート大きく2つの関数で構成されています。まず、Notion のデータを取得する関数からです。

Notion のデータを取得する関数

const DATABASE_ID = 'データベースの ID を入力';
const TOKEN = 'トークンの値を入力(secret_ から始まる文字列)';

// 現在日時
const date = new Date();

// 前日
date.setDate(date.getDate() - 1);
const formattedDate = Utilities.formatDate(date, "JST","yyyy-MM-dd")

// Notion のデータを取得
function getNotionDbData() {
  const url = '<https://api.notion.com/v1/databases/>' + DATABASE_ID + '/query';

  let headers = {
    'content-type' : 'application/json; charset=UTF-8',
    'Authorization': 'Bearer ' + TOKEN,
    'Notion-Version': '2022-06-28',
  };

  let options ={
    'method': 'post',
    'headers': headers,
    // 実行日が前日のもののみフィルタ
    'payload': JSON.stringify({
      "filter": {
        "and": [
          {
            "property": "開始日時",
            "date": {
              "after": formattedDate + "T00:00:00+09:00",
            }
          },
          {
            "property": "開始日時",
            "date": {
              "before": formattedDate + "T23:59:59+09:00",
            }
          },
        ],

      }}
    )
  }

DATABASE_ID と TOKEN に関しては自分で取得したものを入力するようにしてください。僕の場合はデータベースに「開始日時」というプロパティがあるので、それをもとに filter して前日のデータのみ抽出するような仕組みにしています。後述の1日に1回の定期実行を深夜1時に実行するようにしているので、深夜1時になると、前日のデータを自動取得されてグラフが自動生成されるような仕組みになっています。

スプレッドシートに書き込む関数

// スプレッドシートに書き込む
function writeSpreadSheet(notion_data_list){
  //スプレッドシートのシートのクラスを取得
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME);

  // 最終行 + 1行目から書き込み開始
  let row = sheet.getRange('A:A').getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow();

  // 取得した配列をもとにスプレッドシートに記述する
  notion_data_list.forEach((value, i) => {
    // 名前
    sheet.getRange(row, 1).setValue(value.properties.Name.title[0].plain_text);

    // 日付
    sheet.getRange(row, 2).setValue(formattedDate);

    // ステータスは null の場合があるので
    if (value.properties["ステータス"].status !== null) {
      sheet.getRange(row, 3).setValue(value.properties["ステータス"].status.name);
    }

    // タグ(複数付いている場合は最初のもののみ取得・カレンダーは除外)
    sheet.getRange(row, 4)
      .setValue(
        value.properties["タグ"].multi_select
          .map(m => m.name)
          .filter(n => !n.includes("カレンダー"))
        );

    // 時間
    sheet.getRange(row, 6).setValue(value.properties["実績 [h]"].formula.number);

    row += 1;
  });
}

スプレッドシートに書き込む関数はこんな感じです。Notion のレスポンスを引数に取って、スプレッドシートに書き込みをしていきます。データベースの構造・スプレッドシートの構造にかなり依存した実装になっているので、もしコピペして使う場合はよしなに書き換えて使うようにしてください。

main 関数

function main() {
  const notion_data = getNotionDbData();

  writeSpreadSheet(notion_data.results)
}

さいごに main 関数です。上述した2つの関数を呼び出しているだけです。この関数を1日に1回定期実行させるイメージです。

1日に1回定期実行させる

定期実行は GAS のトリガー機能を使っています。さきほど作成した main 関数を「時間主導型」の「日付ベースのタイマー」でセットすることで、毎日自動実行させることができます。

集計用のスプレッドシート

さいごに、集計用のスプレッドシートです。GAS で取得されたデータは、スプレッドシートにこのように溜まっていきます。

タグの部分には Notion で付けた行動ログのタグが付いているので、これを行動分析用の5パターンのタグに集約するようにしています。集約は紐付けのマスタデータを使っておこなっています。マッピング後は「アンプロダクティブ」「プロダクティブ」「生活」「休息」「雑務・MTG」の5つに分類するようにしています。もともとの目的だったインプットの時間については、アンプロダクティブの時間に該当するので、1日の中のここの割合を見るようにしています。

マッピングされたデータを sumif で集計して、グラフとして表示しています。行動分析をはじめてから、一日の中の予定をしっかりと記録する習慣ができたのか、未計測になる時間の割合が減ってきています。肝心のアンプロダクティブの時間は、まだ増やせていないことが分かります。(これから頑張ります)

さいごに・オススメ本の紹介

ということで今回は僕がさいきん実践している行動分析について解説してみました。僕のデータベースに依存した作りになっているので、万人に胸を張ってオススメと言えるわけではないのですが、もし興味ある方は試してみてください。(メンバーシップ会員の方は Zoom でサポートとかも可能です!)

そして、記事内で当たり前のように「アンプロダクティブ」「プロダクティブ」という言葉を使ってしまったのですが、この本の考え方を参考にしています。Prime 会員だと Kindle 版が0円で読めるっぽいのでこちらも興味ある方はぜひ。

↗︎ Notion に登録する(無料)

参考: 仕事のパフォーマンスを上げたいなら!便利なツール「Notion」活用のススメ フリーランスHub