NotionAPIとGithubActionsで自動アーカイブ?機能を作ってみた
はじめに
筆者は完全初心者の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)
実装方法
実装手順としては以下の通りになります。
- NotionAPIを使ってNotionのページを取得する
- 取得したページのselectプロパティを確認する
- selectプロパティが'Done'でかつ3日以上経過しているタスクを'Archive'に変更する
- 変更したタスクをNotionに反映する
- 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ファイルも書くのも初めてでしたが、簡単に書けて便利だなと思いました。
今後は個人だけでなくチームやコミュニティでの活用方法も考えていきたいと思いました。
midra-lab.notion.site/MidraLab-dd08b86fba4e4041a14e09a1d36f36ae 個人が興味を持ったこと × チームで面白いものや興味を持ったものを試していくコミュニティ
Discussion