前言
前陣子想把電腦中一些資料轉移到 Notion 上,純手動太花時間了,就下定決心花點時間研究 Notion API,結果查來查去中文的網站上查不到容易體驗的文章,只好自己研究,就在不斷的試錯浪費不少時間…
以下透過一段簡短的範例,希望使用 Python 處理 Notion 資料自動化有興趣的人,也可以少走彎路
看完本篇內容,你將會透過 python :
- 新增 Database 內部資料
- 修改已存在的 Database 內部資料
- 刪除 Database 內部資料
前置作業
本篇內容是基於 requests 這個模組,搭配 NotionAPI 來抓取 Notion 資料
若是不了解怎麼申請 Notion API 機器人,或不清楚 token 與 database_id 的用處
可以參考【Notion API-1】,用 Python 自由操作 Notion
以下內容會透過「交通」這個範例 Database 來實作,比較方便對照參考
1. 新增 Database 內部資料
跟之前在抓取 Database 相同,一樣透過 post 來回傳給 Notion API 的訊息
不過另外有兩項更動:
- pages — 由於 Database 中每一「橫列」代表一個 page,因此新增 database 內部資料實際上就是創建 page
- data — 創建這個 page 所想要帶的資料,必須包含:
- parent
- properties
name = "船"
move = "水面"
data = {
"parent": {"type": "database_id", "database_id": "eff11fc6866949afa5ac4327996a93da"},
'properties': {
"名稱": {"title": [{"type": "text", "text": {"content": name}}]},
'移動方式': {'rich_text': [{"text": {"content": move}}]},
}
}
定義完 data,透過 requests.post 將內容送出,如下:
requests.post(
"https://api.notion.com/v1/pages",
json=data,
headers={"Authorization": "Bearer "+token, "Notion-Version": "2021-05-13"},
)
再回到 Notion,可以看到「船」被順利新增了!
2. 修改 Database 內部資料
修改 Database 內部資料就是針對 Page 的內容作更動,跟「新增」一樣要提供修改的 data
可以只針對部分修改,例如將 「船」→ 「水上摩托車」
也是有兩個要注意的部分
- page_id — 因為修改是一次針對一個特定 page 進行修改,需要有 page_id
- patch — HTTPS verbs 中代表「修改」
name = "水上摩托車"
data = {
"parent": {"type": "database_id", "database_id": "eff11fc6866949afa5ac4327996a93da"},
'properties': {
"名稱": {"title": [{"type": "text", "text": {"content": name}}]},
#'移動方式': {'rich_text': [{"text": {"content": move}}]},
}
}
page_id = "dd51028912d0407b85694d905a930a92"
r = requests.patch(
"https://api.notion.com/v1/pages/{}".format(page_id),
json = data,
headers={"Authorization": "Bearer " + token, "Notion-Version": "2021-05-13"},
)
Notion 的頁面可以看到「船」→ 「水上摩托車」,但是「水面」並沒有改動
3. 刪除 Database 內部資料
跟「修改」類似,只需要在 data 中傳送 ‘archived’: True,此 page 就被刪除了,不過 Notion 本身存在救回機制,若有保留 page_id,短時間內重新把 archived 設回 False 就可以復原被刪除的 page
data = {'archived': True}
page_id = "dd51028912d0407b85694d905a930a92" # "水上摩托車"
r = requests.patch(
"https://api.notion.com/v1/pages/{}".format(page_id),
json = data,
headers={"Authorization": "Bearer " + token, "Notion-Version": "2021-05-13"},
)
2 comments
請教一下,假設我把notion這個database的資料以dataframe格式呈現在python上,並對內容做了更新,要如何自動地把每個page_id的資料更新回notion呢?
如果要自動更新可以找看看排程的教學:window上可以查「工作排程」、Mac 或 linux 上可以查 crontab
用 dataframe 存的話你可以新增一欄 column 專門記錄有沒有修改,排成的程式就不用全部的 page_id 都更新,只更新有修改的即可