📑

NotionAPIとGithubActionsで自動アーカイブ?機能を作ってみた

2023/03/12に公開

はじめに

筆者は完全初心者のPythonの学習者です。普段はC#を使って開発をしています。
情報学に関して深い知見を持っているわけでゃないので、間違っているところがあればご指摘いただけると幸いです。
今回はmain.pyにべた書きしているので見苦しいかもしれませんがご了承くださいませ。

筆者は個人的なTodoをNotionで管理していてより自分好みに自動化できればより効率の良いタスク管理ができるのではないかと考えてこのプロジェクトを作成しました。

今回作成したもの

タイトル詐欺にはなってしまいますが実際にはアーカイブして完全に記事を削除というわけではありません。
今回はページの持つselectプロパティでTodoページの進行状況を管理できるようにしています。
selectプロパティには'In Progress'と'Done','Archive'の3つの値を持たせています。
'In Progress'はタスクが未完了で'Done'はタスクが完了した状態です。
'Archive'はタスクが完了した状態で、完了したタスクをアーカイブするためのプロパティです。

実装する機能は、単純に1日に1回'Done'になって3日たったタスクを'Archive'に変更するだけの機能です。

サンプルレポジトリ

(https://github.com/eiei114/NotionAutoStatusArchive)

実装方法

実装手順としては以下の通りになります。

  1. NotionAPIを使ってNotionのページを取得する
  2. 取得したページのselectプロパティを確認する
  3. selectプロパティが'Done'でかつ3日以上経過しているタスクを'Archive'に変更する
  4. 変更したタスクをNotionに反映する
  5. GithubActionsで定期実行する

NotionAPI操作部分

load_dotenv()

notion = Client(auth=os.getenv('NOTION_API_KEY'))
database_id = os.getenv('DATABASE_ID')

db = notion.databases.query(
    **{
        'database_id': database_id,
        'filter': {
            'property': 'Select',
            'select': {
                'equals': 'Done'
            },
        },
    }
)

now = datetime.datetime.now(datetime.timezone.utc)

if not db:
    print("There are no results to update.")
else:
    db = db["results"]
    for result in db:
        page_id = result["id"]
        last_edited_time = datetime.datetime.fromisoformat(result["last_edited_time"][:-1] + '+00:00')
        delta = now - last_edited_time

        if delta.days > 3:
            notion.pages.update(
                **{
                    'page_id': page_id,
                    'properties': {
                        'Select': {
                            'select': {
                                'name': 'Archive'
                            },
                        },
                    }
                })

        print(f"Page {page_id} has been updated.")
  • load_dotenv() : .envファイルを読み込む
  • notion = Client(auth=os.getenv('NOTION_API_KEY')) : NotionAPIのクライアントを作成する
  • database_id = os.getenv('DATABASE_ID') : .envファイルからデータベースのIDを取得する
  • db = notion.databases.query(**{ 'database_id': database_id, 'filter': { 'property': 'Select', 'select': { 'equals': 'Done' } } }) : データベースからselectプロパティが'Done'のページを取得する
  • now = datetime.datetime.now(datetime.timezone.utc) : 現在時刻を取得する
  • if not db: print("There are no results to update.") : 取得したページがなければ処理を終了する
  • db = db["results"] : 取得したページをdbに格納する
  • for result in db: : 取得したページを1つずつ処理する
  • page_id = result["id"] : 取得したページのIDを取得する
  • last_edited_time = datetime.datetime.fromisoformat(result["last_edited_time"][:-1] + '+00:00') : 取得したページの最終更新日時を取得する
  • delta = now - last_edited_time : 取得したページの最終更新日時と現在時刻の差分を取得する
  • if delta.days > 3: : 取得したページの最終更新日時と現在時刻の差分が3日以上あれば以下の処理を実行する
  • notion.pages.update(**{ 'page_id': page_id, 'properties': { 'Select': { 'select': { 'name': 'Archive' } }, } }) : 取得したページのselectプロパティを'Archive'に変更する
  • print(f"Page {page_id} has been updated.") : 取得したページのIDを出力する

元々はstatusプロパティを使っていたが。。

APIを使って更新することができないようになっていました。
ページのプロパティには取得はできるが更新はできないものもあるようなので注意が必要です。
(https://developers.notion.com/reference/page-property-values)

GithubActions部分

name: Daily Update

on:
  schedule:
    - cron: '0 0 * * *'
  workflow_dispatch:

jobs:
  update:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Setup Python
        uses: actions/setup-python@v2
        with:
          python-version: 3.9
      - name: Install dependencies
        run: |
          pip install -r requirements.txt
          pip install python-dotenv
      - name: Run script
        env:
          NOTION_API_KEY: ${{ secrets.NOTION_API_KEY }}
          DATABASE_ID: ${{ secrets.DATABASE_ID }}
        run: |
          python main.py
  • name: Daily Update : GithubActionsの名前を設定する
  • on: : GithubActionsの実行タイミングを設定する
  • schedule: : 定期実行する
  • - cron: '0 0 * * *' : 毎日0時に実行する
  • - name: Checkout code : GithubActionsで実行するコードをチェックアウトする
  • - name: Setup Python : Pythonのバージョンを設定する
  • - name: Install dependencies : 必要なライブラリをインストールする
  • - name: Run script : Pythonのスクリプトを実行する
  • env: : 環境変数を設定する
  • NOTION_API_KEY: ${{ secrets.NOTION_API_KEY }} : .envファイルに記載したNotionAPIのキーを設定する
  • DATABASE_ID: ${{ secrets.DATABASE_ID }} : .envファイルに記載したデータベースのIDを設定する
  • python main.py : Pythonのスクリプトを実行する

まとめ

今回はNotionのタスク管理を自動化する一部方法を紹介しました。
実はGithubActionsのymalファイルも書くのも初めてでしたが、簡単に書けて便利だなと思いました。
今後は個人だけでなくチームやコミュニティでの活用方法も考えていきたいと思いました。

MidraLab(ミドラボ)

Discussion