1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Notion API を使って、Notionのスペースの更新履歴を表示したい (途中)

Last updated at Posted at 2022-09-13

※ 筆者は普段はNodeとかではないサーバサイドエンジニアで、javascriptが得意ではないので、コードに荒があると思いますが、ご了承ください

※Qiita書くのに不慣れなので、改善点等があればコメントで教えてください

はじめに(やってみたかったこと)

Notionを触るまでは、Confluence側の人間だったので、ページやスペースの更新履歴を、スペースのトップページに表示させてみたかった(あの機能便利ですよね、チームコミュニケーション的に)
image-20220913090202347.png

オレンジで囲んだ、アレです。これがあると、だれが何をいつ更新したか、更新度が高いドキュメントが何か、わかりやすいので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"]])
    }
  });
}

実行してみる

image-20220913100935748.png

良さそう

その後

Google Spread SheetからNotionのページに表示させたかったが、iframeで埋め込むしか方法が無いみたいで、もっとかっこよくできる方法が無いか模索中。GoogleSpreadSheetsからNotionのデータベースへ定期的にSyncする方法があればよいのですが、NotionデータベースのレコードのDeleteの仕方がわからず断念。

何か他に良い方法があれば、是非教えてください

参考にさせていただいた記事

【Notion API × GAS】ページ一覧リストを取得してみた

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?