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

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

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



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

Notionを触るまでは、Confluence側の人間だったので、ページやスペースの更新履歴を、スペースのトップページに表示させてみたかった(あの機能便利ですよね、チームコミュニケーション的に)
![image-20220913090202347.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112174/6e4b130c-cb4a-8ed1-6f83-bfeedf6b8531.png)



オレンジで囲んだ、アレです。これがあると、だれが何をいつ更新したか、更新度が高いドキュメントが何か、わかりやすいのでNotionにも導入してみようと思いました



## やったこと

### まずはNotionAPIをGASで叩き、Google Spread Sheetにいい感じにデータを表示できるようにしてみた

[こちら](https://zenn.dev/polycome_toto/articles/1d597708d22dbe)の記事を参考に、NotionAPIのシークレットトークンの取得を行い、取得したい記事があるrootのスペースに"コネクト"で対象のインテグレーションを追加し、GASでスクリプトを実行してみました

まずはCurlでAPIが叩けるかどうか確認

```bash
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で情報が取得できるかどうか確認

```bash
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に記載するスクリプトを作成

```javascript

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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112174/0bbc4931-f8dd-cbf8-8bae-afc0d28d4145.png)


良さそう

### その後

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



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

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

[**【Notion API × GAS】ページ一覧リストを取得してみた**](https://zenn.dev/polycome_toto/articles/1d597708d22dbe)