※ 筆者は普段はNodeとかではないサーバサイドエンジニアで、javascriptが得意ではないので、コードに荒があると思いますが、ご了承ください
※Qiita書くのに不慣れなので、改善点等があればコメントで教えてください
はじめに(やってみたかったこと)
Notionを触るまでは、Confluence側の人間だったので、ページやスペースの更新履歴を、スペースのトップページに表示させてみたかった(あの機能便利ですよね、チームコミュニケーション的に)
オレンジで囲んだ、アレです。これがあると、だれが何をいつ更新したか、更新度が高いドキュメントが何か、わかりやすいのでNotionにも導入してみようと思いました
やったこと
まずはNotionAPIをGASで叩き、Google Spread Sheetにいい感じにデータを表示できるようにしてみた
こちらの記事を参考に、NotionAPIのシークレットトークンの取得を行い、取得したい記事があるrootのスペースに"コネクト"で対象のインテグレーションを追加し、GASでスクリプトを実行してみました
まずはCurlでAPIが叩けるかどうか確認
curl -X POST https://api.notion.com/v1/search \
-H "Authorization: Bearer ${取得したトークン}" \
-H "Content-Type: application/json"
-H "Notion-Version: 2021-08-16" \
--data '{
"sort":{
"direction":"descending",
"timestamp":"last_edited_time"
}
}'
また欲しい形(今回の場合、[記事のid, 記事の最終変更時間, 記事のタイトル, 記事のURL])でAPIで情報が取得できるかどうか確認
curl -X POST https://api.notion.com/v1/search \
-H "Authorization: Bearer ${取得したトークン}" \
-H "Content-Type: application/json"
-H "Notion-Version: 2021-08-16" \
--data '{
"page_size": 30,
"sort":{
"direction":"descending",
"timestamp":"last_edited_time"
}
}' |jq -c '. | select (.object == "list")' | jq '.results[] | select (.object == "page")' | jq -c '{ object: .object, last_edited_time: .last_edited_time, id: .id, properties: .properties[].title[].plain_text} ' > out.txt
cat out.txt
{"object":"page","last_edited_time":"2022-06-20T02:18:00.000Z","id":"70d4f135-e026-49fc-8070-2e2fdbf58c3b","properties":"XXX取材原稿"}
{"object":"page","last_edited_time":"2022-06-20T02:18:00.000Z","id":"0e02ab8b-9d1f-43c1-a80b-49f7ae9f8da4","properties":"20220613"}
{"object":"page","last_edited_time":"2022-06-13T04:48:00.000Z","id":"0243b8b7-b0e5-45c3-b95d-05b5d75875fb","properties":"20220606"}
{"object":"page","last_edited_time":"2022-06-13T04:48:00.000Z","id":"ed38244a-6342-4ec9-809f-829f8328fa9f","properties":"XXX取材原稿"}
{"object":"page","last_edited_time":"2022-06-07T02:48:00.000Z","id":"d463f931-46c8-490c-afe8-28648cac4e3b","properties":"XXX調査"}
{"object":"page","last_edited_time":"2022-06-06T00:32:00.000Z","id":"f08dc905-b305-4df4-aee3-b2df09df566c","properties":"XXX取材原稿"}
{"object":"page","last_edited_time":"2022-06-03T05:37:00.000Z","id":"cd04b9ed-2bda-40bb-845c-ab22b63d1076","properties":"XXXビジネス管理"}
思った形でAPIでデータが取得できたので、定期的に実行して、更新記事一覧をSpreadSheetに記載するスクリプトを作成
const headerInfo = token => ({
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + token,
'Notion-Version': '2021-08-16'
})
const getPages = (token) => {
const endPoint = `https://api.notion.com/v1/search`
const content_data = {
"page_size": 30,
"sort": {
"direction": "descending",
"timestamp": "last_edited_time"
}
}
const options = {
method: 'post',
headers: headerInfo(token),
payload: JSON.stringify(content_data)
}
const res = UrlFetchApp.fetch(endPoint, options)
return JSON.parse(res.getContentText())
}
// 定時実行する関数
const notionUpdates = () => {
const token = "${取得したトークン}"
// Main は対象のスプレッドシートのタブの名前
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Main');
//シート初期化
sheet.clear();
sheet.getRange(1, 1).setValue("id")
sheet.getRange(1, 2).setValue("updatedBy")
sheet.getRange(1, 3).setValue("title")
sheet.getRange(1, 4).setValue("url")
const result = getPages(token)
const latestMeetingPage = result.results[0];
const last_edited_time = latestMeetingPage["last_edited_time"];
const jsons = result["results"]
jsons.forEach(function (item, i) {
if ('title' in item["properties"]) {
console.log("id:" + item["id"] + ", last_edited_time: " + item["last_edited_time"] + ", title: " + item.properties.title["title"][0]["plain_text"] + " url: " + item["url"])
sheet.appendRow([item["id"] , item["last_edited_time"] , item.properties.title["title"][0]["plain_text"] , item["url"]])
}
});
}
実行してみる
良さそう
その後
Google Spread SheetからNotionのページに表示させたかったが、iframeで埋め込むしか方法が無いみたいで、もっとかっこよくできる方法が無いか模索中。GoogleSpreadSheetsからNotionのデータベースへ定期的にSyncする方法があればよいのですが、NotionデータベースのレコードのDeleteの仕方がわからず断念。
何か他に良い方法があれば、是非教えてください