[Notion]コネクトを使って読み込み権限のあるデータベースへのクイックアクセス用DBを作ってみた

Notionのデータベースのみをピックアップして、ページツリー上から探しづらい状況の解消に挑んでみました。
2022.11.29

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Notionのページとデータベースは同列で扱えつつ、かつページツリー上で区別がつきにくいこともあり、要件が被っているデータベースを整理したい時に見つけるのが一苦労です。

そんな時に洗い出す際に役立つのがコネクトです。ツリーの親のほうで接続しておくと子ページへ権限が及ぶため、データベースをsearch APIでまるごとピックアップすることもできます。

作成済みデータベースを一覧化したデータベースのGAS経由出力をしてみました。

実行する度に指定のページ上にデータベースを作成して、取得したデータベースのタイトルとURLと編集期間の入ったレコードを追加します。

function pickupDatabase() {
  var _database = sendRequest('https://api.notion.com/v1/databases', 'POST',
  {
    "parent":
      {
        "page_id": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
      },
    "is_inline": true,
    "title":
      [{
        "text": {'content': "test"}
      }],
    "properties": 
      {
        "名前": {
          "title": {}
        },
        "URL": {
          "url": {}
        },
        "編集期間": {
          "date": {}
        }
      }
  })
  var databases = []
  var result = sendRequest('https://api.notion.com/v1/search', 'POST')
  result['results'].forEach( function(e) {
    if (e['object'] === 'database') {
      console.log(e)
      console.log(e['title'])
      var title = 'title' in e && e['title'].length > 0 ? e['title']['0']['plain_text'] : '無題'
      var url = e['url']
      console.log(title)
      console.log(url)
      databases.push({
        "parent":
          {
            "database_id": _database["id"]
          },
        "properties": 
          {
            "名前": {
              "title": [
                { "text": {"content": title} }
              ]
            },
            "URL": {
              "url": url
            },
            "編集期間": {
              "date": {
                "start": e['created_time'],
                "end": e['last_edited_time']
              }
            }
          }
      })
    }
  })
  databases.forEach( function(e) {
    sendRequest('https://api.notion.com/v1/pages', 'POST', e)
  })
}

const token = 'secret_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'

function sendRequest(url, method, data=null) {
  let headers = {
    'content-type' : 'application/json',
    'Authorization': 'Bearer ' + token,
    'Notion-Version': '2022-06-28',
    'accept': 'application/json'
  };
  var options ={
    'method': method,
    'headers': headers,
    "muteHttpExceptions" : true,
  }
  if (data) {
    options['payload'] = JSON.stringify(data)
  }

  let notion_data = UrlFetchApp.fetch(url, options);

  notion_data = JSON.parse(notion_data);
  return notion_data;
}

レスポンスにはアイコンやカバーもあるため、必要に応じて設定することも可能です。今回は一切追加していないデータベースだったので省きました。

あとがき

どこにデータベースがあるか分かりづらいため、メンテナンスしたい場合にはお役立ちだと思います。ただ、このスクリプトでもツリー上のどこに位置するのかまでは分かりません。parentの要素を再帰取得することでのぱんくずリストの作成も検討するとよいかもしれません。