TROCCOでNotionのデータ転送してみた

# TROCCOがNotionからのデータ転送に対応しました:sparkles:

# Notionとは？
Notionは、メモ、ドキュメント、タスク管理、データベースなど、様々な機能を一つにまとめた多機能ワークスペースです。個人利用からチームでの共同作業まで、幅広い用途に対応できる柔軟性の高さが特徴です。

https://www.notion.com/ja

# TROCCOとは?
TROCCOは、データの連携・変換をスムーズに実現するクラウド型データ統合ツールです。
執筆者はTROCCOのカスタマーサクセスエンジニアをしています。

https://trocco.io/

***

# 今回転送するデータ

Notion上で以下のようなデータベース（KANBAN）を用意しました。
これはデフォルトのテンプレートを元にしております。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3033246/680c213d-8ce3-4ed6-ba16-0d56d830a562.png)

KANBAN形式で表示されておりますが、実態は以下のようなデータベースとなっております。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3033246/3c51a453-c1c2-4ef0-9c6c-1db54343ed6f.png)

このデータベースを、TROCCO経由だとどのように取得できるのか、試してみます！

***

# TROCCOで転送してみた

## 接続情報の作成

### 【Notion】インテグレーションの作成

こちら⏬️のページより、インテグレーションを作成します。

https://www.notion.so/profile/integrations


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3033246/4938c9de-657d-4d81-a1e6-9aed3beaa19f.png)


今回は、「内部インテグレーション」を作成しました。
「インテグレーションシークレット」をコピーしておきます。

***

## 【TROCCO】接続情報の作成

こちら⏬️から接続情報を作成します。

https://trocco.io/connections/notion/new

先ほどコピーしておいた「インテグレーションシークレット」をペーストするだけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3033246/75e924e0-171e-48fa-a01c-bb5871a768dd.png)


***

## 【TROCCO】転送設定の作成

TROCCO側の設定は⏬️の通り。先ほど作成した接続情報を選択肢、「データベース一覧」を選択します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3033246/29a717cf-e2a5-4269-a506-e2fde5ed7381.png)

「データベースID」の取得方法は以下の記事を参考にしました。

https://qiita.com/har1101/items/40c33d1f32dc9d4b3dc8

転送先ですが、今回はSnowflakeを利用しました。

***

### プレビューを確認

設定完了、いざプレビューを確認！！と思ったら・・・404エラーが発生してしまいました。

***

#### 【Notion】インテグレーションとのコネクト

インテグレーション経由でNotionのデータを取得するためには、ページ右上の…から、先程作成したインテグレーションとコネクトする必要がありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3033246/4ef8b80b-8a5c-4cb7-b594-75e183747577.png)

***

### プレビューを再確認

無事プレビューが表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3033246/d01e1973-80bf-4f6d-ac3b-4d2d38363991.png)


このままSnowflakeへ転送してみます。

### 転送完了！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3033246/934b4423-5b9d-4e1f-b330-9b4c1a3637c5.png)

Snowflake上にテーブルが作成されました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3033246/9e022b85-eb17-42d9-b662-b3c7fe38bbd0.png)




# データの加工

主なデータはPROPERTIESにJSONで格納されています。

```json
{
  "ステータス": {
    "id": "EAqu",
    "status": {
      "color": "blue",
      "id": "xfqo",
      "name": "開発中"
    },
    "type": "status"
  },
  "プロダクトエリア": {
    "id": "sc%7Bm",
    "multi_select": [],
    "type": "multi_select"
  },
  "リクエスト名": {
    "id": "title",
    "title": [
      {
        "annotations": {
          "bold": false,
          "code": false,
          "color": "default",
          "italic": false,
          "strikethrough": false,
          "underline": false
        },
        "href": null,
        "plain_text": "AI生成機能の導入",
        "text": {
          "content": "AI生成機能の導入",
          "link": null
        },
        "type": "text"
      }
    ],
    "type": "title"
  },
  "リクエスト日": {
    "created_time": "2025-03-31T10:52:00.000Z",
    "id": "ZsV%5C",
    "type": "created_time"
  },
  "依頼者": {
    "id": "%3DeOH",
    "people": [
      {
        "avatar_url": "https://*******",
        "id": "*****",
        "name": "*****",
        "object": "user",
        "person": {
          "email": "********"
        },
        "type": "person"
      }
    ],
    "type": "people"
  },
  "優先度": {
    "id": "PkHb",
    "select": null,
    "type": "select"
  },
  "担当者": {
    "id": "%5CiBz",
    "people": [],
    "type": "people"
  }
}
```

Notion上だと、黄色の枠部分⏬️です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3033246/17b21566-2d84-4c72-a27e-07dd37360418.png)


転送したデータをNotion上の表示に近づけたいので、SQLを使っていい感じに加工していきます。


Snowflakeの場合、PARSE_JSONを使用し次のように値を取り出すことができます。

```sql
SELECT
    PARSE_JSON(PROPERTIES):"リクエスト名".title[0].plain_text::STRING AS "リクエスト名",
    PARSE_JSON(PROPERTIES):"リクエスト日".created_time::TIMESTAMP_NTZ AS "リクエスト日",
    PARSE_JSON(PROPERTIES):"依頼者".people[0].name::STRING AS "依頼者",
    PARSE_JSON(PROPERTIES):"ステータス".status.name::STRING AS "ステータス",
    PARSE_JSON(PROPERTIES):"プロダクトエリア".multi_select[0].name::STRING AS "プロダクトエリア",
    PARSE_JSON(PROPERTIES):"優先度".select.name::STRING AS "優先度",
    PARSE_JSON(PROPERTIES):"担当者".people[0].name::STRING AS "担当者"
FROM
    CS_TEAM.TEST.NOTION_DB_TEST;
```
Notion上の項目のデータ型に応じて、中身の取り方を工夫する必要があります。

WITH句を利用したほうが多少スッキリはします。

```sql
WITH P_JSON AS(
select PARSE_JSON(PROPERTIES) AS P FROM CS_TEAM.TEST.NOTION_DB_TEST
) 
select
    P:"リクエスト名".title[0].plain_text::STRING AS "リクエスト名",
    P:"リクエスト日".created_time::TIMESTAMP_NTZ AS "リクエスト日",
    P:"依頼者".people[0].name::STRING AS "依頼者",
    P:"ステータス".status.name::STRING AS "ステータス",
    P:"プロダクトエリア".multi_select[0].name::STRING AS "プロダクトエリア",
    P:"優先度".select.name::STRING AS "優先度",
    P:"担当者".people[0].name::STRING AS "担当者"
FROM P_JSON;
```

※自分で考えるのがちょっとめんどくさかったので、JSONをAIくんに投げていい感じに土台となるSQLを作ってもらいました。
※BigQueryなどでも、記法は違えど同じ様なことはできるかと思います


実行結果です⏬️
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3033246/a35701f8-f803-44ae-8288-9c8814ea05e9.png)

Notion上の表示⏬️と同じ用に整えることができました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3033246/3c51a453-c1c2-4ef0-9c6c-1db54343ed6f.png)

この形式にできれば、他のシステムと連携した集計・分析もやりやすいですね💡

# おわり
いかがでしたでしょうか。
TROCCOの設定は非常に簡単、その後のJSONのパースもSQLであればサクッと可能です。
Notionのデータベース×他のデータベースとの組み合わせ、活用の可能性は無限大だなと思いました

この記事を見てくださった方の、なにか少しでもお役に立てていたらならば幸いです🙏