🎉

Python + Notion + Raycast で簡単タスク管理を自作してみた

に公開

🚀 はじめに

自分用メモです。

自分はNotion歴3年目となります。
タスクが降ってきたり興味のある記事を見つけたときは、いちいちNotionを開いて記録してました。

でもきちんと記録したり、そもそも都度Notionを探したり開いたりするのが面倒になり、結局タスク管理やメモの管理がままならなくなってしまったカスでございます。

そこで Python と Notion API、Raycast を使って、自分用のタスク管理スクリプトを作りました。

まだ完成版ではなく、最低限動く機能のみの実装ですが、Zennに初投稿としてシェアしてみます。

🛠 作ったもの

できること

Raycastからコマンドを呼び出すことで、以下が可能

  • タスク追加
    • タスク名、カテゴリ、締め切り(MM-DD)、優先度(高中低)
  • メモ追加
    • テキスト
    • 名前でもURLでもテキストであればなんでも良い

必要環境

  • Raycast
  • Notion
    • 作成済みのデータベース
    • タスク、メモ用で2つ
  • Python3.10
    • ライブラリ:
      • notion-client

作り方

  1. Notionのインテグレーションを作成
  2. 作成したNotion DBにインテグレーションを紐付け
  3. PythonでNotion DBにページ(DBの要素)を追加するコード作成
  4. Raycastで実行するための.shファイルの作成

(それぞれの詳細なやり方は他のサイトや記事でわかりやすく書かれていますので割愛いたします)

Pythonコード例

  • notion_config.py
NOTION_TOKEN = **
TASK_DB_ID = **
STACK_DB_ID = **
  • task_add.py
from datetime import date
from notion_client import Client
from notion_config import NOTION_TOKEN, TASK_DB_ID

notion = Client(auth=NOTION_TOKEN)

def add_task(input_str):
    # カンマ区切りの入力 → 名前, 分野, 締切(MM-DD), 優先度
    parts = [p.strip() for p in input_str.split(",")]
    while len(parts) < 4:
        parts.append("")  # 欠けた項目を補完
    
    name, category, due, priority = parts[:4]
    
    due_date = parse_due(due) if due else date.today().isoformat()
    priority_star = convert_priority(priority or "中") #優先度を星マークで設定したいため別関数で変換

    notion.pages.create(
        parent={"database_id": TASK_DB_ID},
        properties={
            "名前": {"title": [{"text": {"content": name}}]},
            "分野": {"select": {"name": category}},
            "締め切り": {"date": {"start": due_date}},
            "優先度": {"select": {"name": priority_star}},
            "progress": {"select": {"name": "未完了"}},
        },
    )
    print(f"✅ タスク追加: {name}(期限: {due_date}, 優先度: {priority_star})")

Raycast連携例

# @raycast.argument1 { "type": "text", "placeholder": "タスク名,分野,締切,優先度" }

VENV_PYTHON="/Users/username/task_ray/task_ray_env/bin/python3"
SCRIPT_PATH="/Users/username/task_ray/task_add.py"

"$VENV_PYTHON" "$SCRIPT_PATH" "$1"

echo "Complete!"

使用例

  • Raycastでの実行

  • Notionでの結果

🍕 苦労した点

主に苦労した点は以下の2つです

  • Notionとの連携
  • Raycastとの連携

やっぱり他のツールとの連携が一番苦労しました。それぞれまとめていきたいと思います。

Notionとの連携:DBのIDがわからない

特定のDB(データベース)に追加するためにはDBのIDが必要です。
きちんと調査してから取得を試みましたが、なぜかエラーを吐きまくりなかなか解決できませんでした。

しかし結論から言いますと、 ただの勘違い でした..
NotionのDBのページリンクは

https://www.notion.so/username/1234567890abcdef1234567890abcdef?v=xxxxxxxxxxxx

のようになっていると思うのですが、DBのIDは例における「1234567890abcdef1234567890abcdef」となります。

しかし私は「xxxxxxxxxxxx」の部分をIDと勘違い。永遠に解決しないわけですね。

Raycastとの連携: Script commandの作り方がわからない

先ほど他の記事を参考に作成した、と言いましたが、なぜがすぐに作れませんでした。
詰まってしまったのは、Raycastにおける「Create Script Command」実行後の設定画面。
.shのファイルにてプログラムの実行を行いたかったのですが、記事に載っている画像の通り、Mode「Compact」を選択したらターミナルで実行されるファイルが作成されてしまい、うまくいきませんでした。

結局、この Modeで「Silent」を選択したらうまくいきました。
ただ、何を参考にしてこれに変更したのかわからなくなってしまいました..
なので、メモのためこの記事に残します。
(これを残したくて記事作ったところがあります..)

Raycastとの連携: 引数が足りない

Raycast関連では2つ難点がありました。
もう1つはこの「引数が足りない」ことです。

タスクの追加のためには、「タスク名、カテゴリ、締め切り日、優先度」の4つが欲しいと考えていたのですが、Raycastはデフォルトで3つの引数までしか受け付けてくれないみたいです..
(増やす手段はあるみたいなのですが、面倒なので手を出しませんでした)

なので、引数を1つにし、「str:タスク名,str:カテゴリ,str:MM-DD,str:優先度(高,中,低)」の入力を前提とすることで、なんとか全ての情報を与えられるようにしました

💪 改善すべき点

使ってみて、以下のことを改善すべきと思っています。

  • Raycastの入力の際、「タスク名,カテゴリ,MM-DD,優先度」での「,」の間に空白が入っていたりするとエラーになること

現状のシステムではこれを優先的に解決すべきと思っています。
入力しづらいので..
また、「,」を日本語入力の「、」でも良くしたいですね。
入力時に切り替えるのが面倒と感じましたので。

🐹 今後の展望

  • タスクの完了機能
  • タスク、メモの一覧取得機能

が欲しいと思っていますので、実装したいと思います。
また、完成度を高めgithubでの公開を目指したいと考えています。

📝 まとめ

今回、Python + Notion + Raycastでタスク管理のためのスクリプトを作成しました。
自分のメモのため、そして初めての記事投稿というちょっとした挑戦のため、まとめてみました。
勢いで書いてみたため、読みにくい箇所が多々あると思いますが、ここまで読んでくださり、ありがとうございます。
何かの参考になれば幸いです。

Discussion