0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GASを使ってNotionのDBの情報を取得する

Last updated at Posted at 2024-10-06

目的

Notion上のDBの情報をGASを使って取得する

事前準備

今回は以下のDBのデータを取得します
image.png

Notionでインテグレーションを新規作成し、シークレットキーを取得

こちらからインテグレーションの作成を行います
https://www.notion.so/profile/integrations

新しいのインテグレーション作成>新しいインテグレーションを作成を選択
image.png

所属しているワークスペースの選択や種類、ロゴ等を選択して保存する
※自分がワークスペースのオーナーではない場合はアクセス権の更新が別途必要

すると以下のような画面が表示されるので、インテグレーションのシークレットキーを取得する
image.png

次に取得したいDBに作成したインテグレーションの接続を行う。
右上の・・・ボタンから接続先を選択して先ほど作成したインテグレーションを選択する
image.png

ここまでで事前準備は完了です。

GASを書いてみる

それではGASでNotionのDBの情報を取得するためにコードを書いていきます。
コードは以下のようになります。

function getNotionDB() {
  const NOTION_API_KEY = '' // シークレットキー
  const DATABASE_ID = ''; // データベースID
  const url = `https://api.notion.com/v1/databases/${DATABASE_ID}/query`;

  // リクエストオプションを設定
  const options = {
    'method': 'POST',
    'headers': {
      'Authorization': `Bearer ${NOTION_API_KEY}`,
      'Notion-Version': '2022-06-28',
      'Content-Type': 'application/json'
    },
    'payload': JSON.stringify({
      "page_size": 10 // 取得するページ数を制限
    })
  };
  
  try {
    // APIリクエストを送信
    const response = UrlFetchApp.fetch(url, options);
    
    // レスポンスを解析
    const result = JSON.parse(response.getContentText());
    
    // 最初のページのプロパティを出力
    if (result.results && result.results.length > 0) {
      result.results.map((e) => console.log(e.properties));
    }
  } catch (error) {
    console.error("Error:", error);
  }
}

一つずつ見ていくと

const NOTION_API_KEY = '' // シークレットキー
const DATABASE_ID = ''; // データベースID
const url = `https://api.notion.com/v1/databases/${DATABASE_ID}/query`;

ここは先ほど取得したシークレットキーやデータベースID、NotionAPIを叩くためのpathを定義しています。

データベースIDは取得したいDBのurlに記載されています。
https://www.notion.so/AAAAAAAA?v=BBBBBBBBのようなurlになっていると思うのですがAAAAAAAAに該当するのがデータベースIDになります。

// リクエストオプションを設定
  const options = {
    'method': 'POST',
    'headers': {
      'Authorization': `Bearer ${NOTION_API_KEY}`,
      'Notion-Version': '2022-06-28',
      'Content-Type': 'application/json'
    },
    'payload': JSON.stringify({
      "page_size": 10 // 取得するページ数を制限
    })
  };

ここではmethodやヘッダー情報などリクエストの設定を行なっています。
methodは今回リクエストを送るのでPOSTになっています。
headersでは認証情報やバージョン、コンテンツ形式などを渡します。ここで先ほど取得したシークレットキー(NOTION_API_KEY)も渡します。
payloadは送受信を行うデータ本体のことを表していて、

"page_size": 10 

をjson文字列に変換して渡しています。

 try {
    // APIリクエストを送信
    const response = UrlFetchApp.fetch(url, options);
    
    // レスポンスを解析
    const result = JSON.parse(response.getContentText());
    
    // 最初のページのプロパティを出力
    if (result.results && result.results.length > 0) {
      result.results.map((e) => console.log(e.properties));
    }
 } 
 catch (error) {
    console.error("Error:", error);
 }

UrlFetchApp.fetch()で先ほど設定したurlとリクエストの設定を含めてリクエストを送信します。
JSON.parse()でレスポンスの文字列を扱えるように定数に変換します。
正常にデータを取得できていた場合は、そのデータをconsole.log()で出力しています。

実行してみる

GASで実行すると

{ 'ステータス': 
   { id: 'B%3DXA',
     type: 'status',
     status: 
      { id: '0d0bd16f-8ae5-4103-9f35-f5d59e94c5fe',
        name: '未着手',
        color: 'default' } },
  'メール': { id: 'NnKA', type: 'email', email: 'test1@test.com' },
  '作成日時': 
   { id: 's%3FmF',
     type: 'created_time',
     created_time: '2024-10-05T09:04:00.000Z' },
  '氏名': { id: 'title', type: 'title', title: [ [Object] ] } }

{ 'ステータス': 
   { id: 'B%3DXA',
     type: 'status',
     status: 
      { id: '0d0bd16f-8ae5-4103-9f35-f5d59e94c5fe',
        name: '未着手',
        color: 'default' } },
  'メール': { id: 'NnKA', type: 'email', email: 'test2@test.com' },
  '作成日時': 
   { id: 's%3FmF',
     type: 'created_time',
     created_time: '2024-10-05T09:04:00.000Z' },
  '氏名': { id: 'title', type: 'title', title: [ [Object] ] } }
  
{ 'ステータス': 
   { id: 'B%3DXA',
     type: 'status',
     status: 
      { id: '0d0bd16f-8ae5-4103-9f35-f5d59e94c5fe',
        name: '未着手',
        color: 'default' } },
  'メール': { id: 'NnKA', type: 'email', email: 'test3@test.com' },
  '作成日時': 
   { id: 's%3FmF',
     type: 'created_time',
     created_time: '2024-10-05T09:04:00.000Z' },
  '氏名': { id: 'title', type: 'title', title: [ [Object] ] } }

が出力されて正常に取得できていることが確認できました!

まとめ

今回はGASからNotion APIを叩いてDBの情報を取得するまでを行いました。
次回は取得したDBの情報を元に集計を行なってスプレッドシートに出力するまでを記事にしたいと思います。

参考

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?