GASを使ってNotion APIでのデータベース情報取得をやってみた

ブラウザ上でNotionのデータベースを操作するのがやや手間と感じ始めたため、SpreadSheetとGASでどうにかしようと始めてみました。
2022.07.06

Notion上でデータベース同士のリレーションを行っているうちに、データベースだけを扱えるUIがほしいと感じました。ページ内で気軽に設計できるのはメリットですが、事ある毎に該当ページを開いての修正に迫られるのは回数重ねるとそれなりに面倒です。

ページ上で弄り続ける限りは手間の減らしようもないため、SpreadSheetとGASを利用してAPIベースで反映させられれば楽になりそうです。が、Notion DeveloperサイトにはGASでよく使われる UrlFetchApp による実装例がありません。まずは入り口から触ってみました。

設定を入れる

Notion API経由で弄る上で必要になるのは2つ。Integration設定にて発行されるTokenは認知されている可能性は高いと思いますが、もう一つ大事な設定としてページ共有にIntegration設定を含める必要があります。

GAS経由でのアクセス

Developerサイトにて言語別実装例をみるとJavaScriptによる実装例が存在します。が、記事最初に触れたようにGASの UrlFetchApp を使うケースは掲載されていません。

とはいえそこまで構えるものでもなく。とりあえずやってみました。

const token = 'secret_XXXXXXXXXXXXXXXXXX'

function getDataBaseIDS() {
  var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
  var sheetNames = [];
  sheets.forEach( function(sheet) {
    if (sheet.getName() == "Settings") return;
    sheetNames.push(sheet.getName())
  })
  return sheetNames;
}

function getDataBaseStatus(database_id) {
  return sendRequest("https://api.notion.com/v1/databases/" + database_id, 'get')
}

function getDataBase(database_id) {
  return sendRequest("https://api.notion.com/v1/databases/" + database_id + "/query", 'post')
}

function sendRequest(url, method, data=null) {
  let headers = {
    'content-type' : 'application/json; charset=UTF-8',
    'Authorization': 'Bearer ' + token,
    'Notion-Version': '2022-02-22',
  };
  let options ={
    'method': method,
    'headers': headers,
  }

  let notion_data = UrlFetchApp.fetch(url, options);
  notion_data = JSON.parse(notion_data);
  return notion_data;
}

function dump(){
  var databaseIds = getDataBaseIDS()
  databaseIds.forEach( function(id) {
    Logger.log(getDataBaseStatus(id))
    Logger.log(getDataBase(id))
  })
}

設定用シートの作成を考慮し、それ以外をデータベース用と想定して引っ張るつくりになっています。DataBaseIDはシート名に指定します。Notion-Version についてはVersioningのドキュメントに記載があるため確認しましょう。

注意すべき点としては、データベースのレコードを取得するリクエストはPOST指定になっているところです。

あとがき

まずは既存データベース取得をGASにて行ってみました。今後の目標としてはNotionのデータベースをSpreadSheetのみで管理出来るところを目指してみようと思います。