📝

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

2022/02/05に公開

はじめに/概要

Notion APIとGAS(Google apps scripts)を使って、ページ一覧の取得方法を紹介します。

ただ一覧を取得するだけでなく、フィルターをかけたり、最新の記事を取得するなどいろいろ紹介できればなと思います。

GASでページの一覧を取得している記事が見つからなかったので参考になれば嬉しいです。

対象

Notion APIを使ってみたい方
特定のページの取得はできても、一覧の取得方法がわからない方

目標

Notion APIをGASで使ってみること。
ページの一覧を取得したり、フィルターをかけたりする実装ができること。

事前準備

NotionのAPIを使用するために、トークンの発行が必要です。
以下のNotion公式ドキュメントのSTEP1・2までを実施してください。
https://developers.notion.com/docs/getting-started#step-3-add-an-item-to-a-database

加えて、適当に9つほどページを入れておいてください。
今の私の状態は以下のとおりです。

【全件取得】ページ一覧リストを取得する

以下の例だと、全ページのデータを取得するようにしています。
また、取得であるため、リクエストは"GET"だと思いがちですが、notionでは"post"でリクエストするようです。

GASの方を実行すると、result.length 9と出力されます。

curlコマンド version

terminal
curl -X POST https://api.notion.com/v1/databases/{データベースID}/query \
  -H "Authorization: Bearer {notionのtoken}" \
  -H "Content-Type: application/json" \
  -H "Notion-Version: 2021-08-16" \

GAS version

gasファイル
const headerInfo = token => ({
  'Content-Type': 'application/json',
  'Authorization': 'Bearer ' + token,
  'Notion-Version': '2021-08-16'
})

const getAllPages = (token, dbid) => {
  const endPoint = `https://api.notion.com/v1/databases/${dbid}/query`

  const options = {
    method: 'post',
    headers: headerInfo(token)
  }
  const resp = UrlFetchApp.fetch(endPoint, options)
  return JSON.parse(resp.getContentText())
}

const PGetAllPages = () => {
  const dbid = "{データベースのID}"
  const token = "{notionのトークン}"

  const result = getAllPages(token, dbid)
  console.log("result.length", result.results.length)
}

取得最大制限をつけてページ一覧リストを取得する

以下の例だと、最大5件のデータを取得するようにしています。
GASの方を実行すると、result.length 5と出力されます。

curlコマンド version

terminal
curl -X POST https://api.notion.com/v1/databases/{データベースID}/query \
  -H "Authorization: Bearer {notionのtoken}" \
  -H "Content-Type: application/json" \
  -H "Notion-Version: 2021-08-16" \
  --data '{
    "page_size": 5
  }'

GAS version

gasファイル
const headerInfo = token => ({
  'Content-Type': 'application/json',
  'Authorization': 'Bearer ' + token,
  'Notion-Version': '2021-08-16'
})

const getPagesWithLimit = (token, dbid) => {
  const endPoint = `https://api.notion.com/v1/databases/${dbid}/query`
  const content_data = {
    "page_size": 5
  }

  const options = {
    method: 'post',
    headers: headerInfo(token),
    payload: JSON.stringify(content_data)
  }
  const resp = UrlFetchApp.fetch(endPoint, options)
  return JSON.parse(resp.getContentText())
}

const PGetAllPagesWithLimit = () => {
  const dbid = "{データベースのID}"
  const token = "{notionのトークン}"

  const result = getPagesWithLimit(token, dbid)
  console.log("result.length", result.results.length)
}

条件をつけてページ一覧リストを取得する

以下の例だと、Tagに"mtg"が含まれており、かつ、Nameに"[定例]"が含まれているページを最大100件、取得するようにしています。
実行すると、result.length 5と出力されます。

GAS version

gasファイル
const headerInfo = token => ({
  'Content-Type': 'application/json',
  'Authorization': 'Bearer ' + token,
  'Notion-Version': '2021-08-16'
})
const getAllPagesWithLimitAndFilter = (token, dbid) => {
  const endPoint = `https://api.notion.com/v1/databases/${dbid}/query`
  const content_data = {
    "page_size": 100,
    "filter": {
	    "and": [
	      {
	        "property": "Tag",
		"multi_select": {
		  "contains": "mtg"
		}
	      },
	      {
	        "property": "Name",
		"text": {
		   "contains": "[定例]"
		}
	      }
	   ]
   },
  }

  const options = {
    method: 'post',
    headers: headerInfo(token),
    payload: JSON.stringify(content_data)
  }
  const resp = UrlFetchApp.fetch(endPoint, options)
  return JSON.parse(resp.getContentText())
}

const PGetAllPagesWithLimitAndFilter = () => {
  const dbid = "{データベースのID}"
  const token = "{notionのトークン}"

  const result = getAllPagesWithLimitAndFilter(token, dbid)
  console.log("result.length", result.results.length)
}

filterにも、"and"条件と "or" 条件を込められるので、お好きな方に変えることができます。
また、propertyもご自身の状態に合わせて適宜変えられればカスタマイズできます。

条件をつけて最新のページを取得する

Notionでは、create_time順にページのリストが返ってくるため、ページリスト配列の最初のページが最新のものとなっています。そのため、以下のように実装すると、最新のページが取得することができます。

GAS version

gasファイル
const headerInfo = token => ({
  'Content-Type': 'application/json',
  'Authorization': 'Bearer ' + token,
  'Notion-Version': '2021-08-16'
})

const getPages = (token, dbid) => {
  const endPoint = `https://api.notion.com/v1/databases/${dbid}/query`
  const content_data = {
    "page_size": 100,
    "filter": {
	    "and": [
	      {
	        "property": "Tag",
            "multi_select": {
              "contains": "mtg"
          }
	      },
	      {
	        "property": "Name",
            "text": {
              "contains": "[定例]"
          }
	      }
			]
		},
  }

  const options = {
    method: 'post',
    headers: headerInfo(token),
    payload: JSON.stringify(content_data)
  }
  const resp = UrlFetchApp.fetch(endPoint, options)
  return JSON.parse(resp.getContentText())
}


// 定時実行する関数
const getLatestWeeklyMeetingPage = () => {
  const dbid = "{データベースのID}"
  const token = "{notionのトークン}"

  const result = getPages(token, dbid)
  const latestMeetingPage = result.results[0]
  console.log("latestMeetingPage", latestMeetingPage)
}

最後に

notion APIにはまだまだいろんな使い方がありそうなので、今後も追加して紹介したいと思います。
少しでも皆さんの役に立てば嬉しいです。

以上で終了です。お疲れ様でした!
参考になった方は、ぜひ、いいねをいただけると嬉しいです!

Discussion