みやもとメモ

「Notion」「Google Apps Script」「ブログカスタマイズ」などについて書いていきます。

目次
目次

【GAS】Notion APIの1リクエストあたり100件の取得制限に対応する(1000件以上取得する)

この記事をシェアする

今回はGAS(Google Apps Script)に関して書いていきます。

以前もGASに関する記事を書いています(以下リンク)。

miya-moto-memo.hatenablog.com

上記の記事で、GASでNotionのデータを取得しています。

実はNotion APIには「1リクエストあたりの取得上限が100件」という制限があります。
今回取得したいデータは1000件以上あるため、どうにか対応する必要がありました。

今回はその辺りに関して書いていきます。

それでは本題へ。

やりたいこと

miya-moto-memo.hatenablog.com

記事の冒頭でも触れましたが、Notion APIの「1リクエストあたりの取得上限が100件」という制限に対応します。

今回取得するのは読書記録Notionのデータです。

読書記録Notionのデータ

取得したいデータが「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件」取得しました。

プログラム実行(1059件取得)
読書記録Notion(1059件)

取得上限(100件)対応の詳細

「1リクエストあたりの取得上限が100件」にどう対応したか、具体的に説明します。

Notionデータベースを検索する「query」のリファレンスに詳細が載っています。

developers.notion.com

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のデータをスプレッドシートに出力してグラフ化 - 派生記事

TOPへ戻る HOMEへ