今回はGAS(Google Apps Script)に関して書いていきます。
以前もGASに関する記事を書いています(以下リンク)。
上記の記事で、GASでNotionのデータを取得しています。
実はNotion APIには「1リクエストあたりの取得上限が100件」という制限があります。
今回取得したいデータは1000件以上あるため、どうにか対応する必要がありました。
今回はその辺りに関して書いていきます。
それでは本題へ。
やりたいこと
記事の冒頭でも触れましたが、Notion APIの「1リクエストあたりの取得上限が100件」という制限に対応します。
今回取得するのは読書記録Notionのデータです。
![](https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyamoto-blog/20240601/20240601122103.png)
取得したいデータが「1059件」あります。
「1リクエストあたりの取得上限が100件」なので100件ずつ取得していって、最終的に1059件を全て取得します。
プログラム事前準備
GASでNotionからデータを取得するためには、事前準備が必要です。
事前準備の手順は別記事にて詳しく書いています。
以下あたりの記事を見てもらえればと思います。
miya-moto-memo.hatenablog.commiya-moto-memo.hatenablog.com
プログラム
準備が整ったところで、プログラムです。
※事前準備が完了している前提です。
// Notionインテグレーションキー const NOTION_API_KEY = PropertiesService.getScriptProperties().getProperty('NOTION_API_KEY'); // 読書記録NotionのデータベースID const DATABASE_ID = PropertiesService.getScriptProperties().getProperty('DATABASE_ID'); /** * メイン処理 */ function main() { // Notion検索URL const url = 'https://api.notion.com/v1/databases/' + DATABASE_ID + '/query'; // 件数上限(100件)に対応する let startCursor = undefined; let hasMore = true; // 取得件数をカウントする let totalCount = 0; while (hasMore) { // Notionデータ取得 const result = JSON.parse(UrlFetchApp.fetch(url, composeFetchParam(startCursor))); startCursor = result.next_cursor; hasMore = result.has_more; // 取得件数をカウント totalCount = totalCount + result.results.length; // 取得件数をログ出力 console.log(totalCount); } } /** * データ取得に必要なパラメータを組み立てる * ・フィルター * ・ソート */ function composeFetchParam(startCursor) { const payload = { 'start_cursor': startCursor, 'filter': { 'property': '読了日', 'date': { 'is_not_empty': true } }, 'sorts': [ { 'property': '読了日', 'direction': 'ascending' } ] }; const params = { 'method': 'POST', 'headers': { 'Notion-Version': '2022-06-28', 'Authorization': 'Bearer ' + NOTION_API_KEY, 'Content-Type': 'application/json' }, 'payload': JSON.stringify(payload), }; return params; }
スクリプトプロパティとして以下2つを登録しています。
プロパティ | 説明 |
---|---|
NOTION_API_KEY | Notionインテグレーション |
DATABASE_ID | NotionデータベースID |
プログラム実行
上記のプログラムを実行すると、Notionから100件ずつデータを取得し、最終的に「1059件」取得しました。
![](https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyamoto-blog/20240601/20240601122413.png)
![](https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyamoto-blog/20240601/20240601122438.png)
取得上限(100件)対応の詳細
「1リクエストあたりの取得上限が100件」にどう対応したか、具体的に説明します。
Notionデータベースを検索する「query」のリファレンスに詳細が載っています。
page_size
「query」に渡すパラメータとして”page_size”があります。
”page_size”は、1リクエストの取得上限です。
未指定の場合は”100”になります。
今回のプログラムでは未指定のため、1リクエストで100件取得しています。
next_cursor
「query」のレスポンスとして”next_cursor”があります。
続きのデータがある場合、”next_cursor”に値が設定されます。
続きのデータがない場合は値が設定されないようです。
start_cursor
「query」に渡すパラメータとして”start_cursor”があります。
”next_cursor”と関連してきます。
レスポンスの”next_cursor”を、次のリクエストの”start_cursor”に設定します。
これにより、続きのデータを取得します。
初回のリクエスト時は”undefined”を設定します。
has_more
「query」のレスポンスとして”has_more”があります。
続きのデータがある場合は”true”、続きのデータがない場合は”false”が設定されています。
この”has_more”がfalseになるまで、while文でループさせます。
ややこしい説明になりましたが、詳しくはプログラムを見て頂けると。
おわりに
ということで、「【GAS】Notion APIの1リクエストあたり100件の取得制限に対応する(1000件以上取得する)」に関してアレコレ書いてみました。
“next_cursor”、”start_cursor”、”has_more”あたりの使い方は最初少し戸惑いました。
ですがリファレンスを読み込んだり、Notion APIのレスポンスをログ出力したりすることで理解できました。
取得するデータが100件に満たない場合は気にする必要はないですが、100件以上のデータを取得する場合は今回のような工夫が必要になります。
この記事が参考になれば幸いです。
関連記事
GAS(Google Apps Script)に関してはいくつか記事にしています。
気になる記事があればぜひ。
GASの活用事例
GASでNotionのデータをスプレッドシートに出力してグラフ化 - 派生記事