← 開發日常

利用 Notion API 自動更新欄位

由於 Notion 有各式各樣的 template,以及十分強大資料庫功能,我自己習慣用它來管理 side project 狀況、筆記和各種事情。再加上最近上了 Notion 實戰課程:打造專屬數位工作術 ,學到了很多新的技巧,這次就結合學到技巧再加上 Notion API 來完成一些只有 Notion 本身做不到的事情。

因為自己本身有寫筆記的習慣,學到了一些新的知識、看了一些書、或者紀錄一些實戰的技巧時,我就會把這些知識記錄下來寫成筆記,甚至是分享到部落格中。我也運用課程中所學的,把筆記依照領域分門別類,並另用另一個資料庫來設定領域,把筆記和領域關聯起來。

筆記資料庫設計

以我自己的情況為例,我有一個筆記資料庫,在這資料庫中,每個筆記都會關聯到一個領域。在領域的資料庫中則是會統計該領域有多少筆記,還有該領域的筆記數量的百分比:領域筆記數量 / 總筆記數量,自己藉由筆記數量的百分比來了解自己的知識組成,也能看出自己在哪些領域相對比較有心得,下圖是我簡化過的範例。

在製作筆記數量百分比這個欄位時,我遇到了一個困難,那就是無法取得總筆記數量。雖然 Notion 有 Formula 可以根據多個欄位值來計算一些結果,但是 Formula 卻無法取得欄位總和數量。為了解決這個困擾,我想到利用腳本搭配 Notion API 來幫我更新這個欄位。

腳本呼叫 Notion API

在腳本撰寫的部分,我選用 python 來做,但其實這個部分使用 shell script、javascript、甚至是 C# 也都是可以的,只能是能呼叫 Notion API 的任何方式都可以。在開始寫腳本之前,我們需要到 Notion Integrations 建立一個 instance,並取得呼叫 API 需要使用到的 Token。

取得 Token 之後,就可以開始寫腳本來更新筆記數量百分比了,整個腳本可以分成三個部分。

  1. ,取得領域資料庫中的的關聯筆記數量與筆記 ID
    • 在這個步驟,我們可以利用 Notion API 的 Query a database 取得資料庫中的資料。在開始打 API 之前需要注意的是,領域資料庫筆記資料庫都需要 Invite 剛剛建立的 Notion Integration,讓這個 Integration 有權限可以存取,否則會呼叫 API 會發生錯誤。
      Article image
  2. 計算筆記數量百分比
    • 在這個步驟需要讀取每一筆資料中的筆記數量,藉此計算所有筆記數量。值得一提的是 Notion 中的 rollup 欄位並不會出現在 API 中,因為這個欄位實際上是 Client 端計算的。像是領域資料庫中的筆記數量欄位屬性就是 rollup,但是實際上呼叫 API 後,回傳的資料中卻沒有這個欄位。
  3. 更新領域資料庫中的筆記數量百分比
    • 在 Notion 中,資料庫的每一筆資料也是一個 page,所以我們可以使用 Update page properties 這個 API 來更新資料,透過第一個步驟中取得的筆記 ID 來更新相對應的筆記中的筆記數量百分比。Notion 目前似乎還不提供一次更新多個 page 的 API,所以在這個步驟中,我們只能一筆一筆資料更新。

另外,我自己使用 python requests 呼叫 Notion API,但是已經有其他人把 Notion API 操作包成一個 python module:notion-py 讓 Notion 操作更容易,有興趣的人也可以試試看。

用 Github Action 來定期更新

完成上面的步驟後我們會得到一個可以更新的腳本,手動執行就可以更新筆記數量百分比,但是如果每次新增筆記都要自己手動執行一次就變得有點麻煩,而且容易忘記。為了解決這個問題,我利用 GIthub Action 的定期觸發的功能來幫我每天更新。

Article image

不過值得注意的是,Github Action 的定期觸發功能並不保證時間一到就馬上觸發,可能會因為 Github 自己的資源狀況而有所延遲,如果想拿來做即時觸發的應用,可能需要三思。

小結

在上課之前,本身就有在使用 Notion,也有做一些知識管理的簡單系統,但是怎麼用好像都有點不方便。上課之後學到了許多 Notion 上面的技巧,也實際應用在自己的管理系統中,感覺好像比較順暢一點,目前也還在逐步地調整當中。但是只透過 Notion 本身提供的功能,有時候會達不到自己想要的目的,透過 Notion API,我們就能夠隨意讀取資料庫中的資料,用這些資料來完成很多原本做不到的事情。

相關資料

範例