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

## 目的
Notion上のDBの情報をGASを使って取得する
## 事前準備
今回は以下のDBのデータを取得します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2435396/1c8fe827-f8d8-1741-75c1-02a325534d68.png)


### Notionでインテグレーションを新規作成し、シークレットキーを取得
こちらからインテグレーションの作成を行います
https://www.notion.so/profile/integrations

新しいのインテグレーション作成>新しいインテグレーションを作成を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2435396/6b084c97-3c00-ad14-b4ef-ee15f400386c.png)

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

すると以下のような画面が表示されるので、インテグレーションのシークレットキーを取得する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2435396/3299c18c-a217-8fc7-f2a9-a3383b11f11d.png)


次に取得したいDBに作成したインテグレーションの接続を行う。
右上の・・・ボタンから接続先を選択して先ほど作成したインテグレーションを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2435396/e965e7c8-b577-d812-d992-c0ae8fe28d32.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の情報を元に集計を行なってスプレッドシートに出力するまでを記事にしたいと思います。
## 参考
https://developers.notion.com/docs/getting-started

https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app?hl=ja