IU Tips

Archicadの情報をNotionに書き出す

2025.09.24

こんにちは。
IU BIM STUDIOの原田です。

前々回からArchicadのPythonAPIを使って情報を操作する方法を紹介してきました。
今回はPython APIの活用法の一つとして、情報を関係者全員が見ることができるクラウドに送信する方法を紹介します。
今回の例ではNotionを使ってみます。

Notionとは

Notionはメモやドキュメント作成に加え、データベースも扱える多機能な情報管理ツールです。NotionはAPIを使ってプログラムからデータベースを操作できます。

Notionに限らないですが、クラウド上で関係者が情報を確認したいような場合、ArchicadからExcelに書き出すよりもAPIを使って直接データを書き出せばひと手間減ります。

Notion側の準備

スクリプトを作成する前に、Notion側の準備が必要です。Notion APIの使い方はこちらを参照してください。
Notionに関しては日本語の記事もたくさんありますので、検索すれば入門記事が見つかると思います。

Notionで開発者として登録して、APIキーを取得します。
また、今回はNotionのデータベースにArchicadのゾーン情報を書き出すのでデータベースを作成しておきます。
Pythonスクリプトを書く上で作成したデータベースのIDが必要になります。

データベースIDはブラウザでデータベースを表示した時のurlに表示されます。
www.notion.so/?v=の間の文字列です。

https://www.notion.so/XXXXXXXXXXXXXXXXXXXXXXXXXXXXX?v=XXX...
                      ↑これ

Archicadから情報を取得する

まずはゾーンの情報をArchicadから取得します。
今回はゾーンのGUID、ゾーン名、面積を取得します。
この辺りは以前紹介した部分と同じです。

def get_property_values():
    zones = acc.GetElementsByType("Zone")
    property_names = ["IdAndCategories_UniqueID", "Zone_ZoneName", "Zone_NetArea"]

    property_ids = [acu.GetBuiltInPropertyId(i) for i in property_names]
    property_values = acc.GetPropertyValuesOfElements(zones, property_ids)
    return property_values

property_values = get_property_values()

データを整形する

次にNotionのAPIが受け取る形式にデータを整形します。
Archicadから取り出した形式のままでは、Notionにデータをアップロードできません。
Notionがデータを受け取れる形式に変えてあげる必要があります。

データ型によって必要な形式が異なるのでドキュメントを見て確認してください。

def extract_data(property_values):
    zone_infos = []
    for values in property_values:

        guid = values.propertyValues[0].propertyValue.value
        name = values.propertyValues[1].propertyValue.value
        area = values.propertyValues[2].propertyValue.value

        item = {
            "properties": {
                "GUID": {"title": [{"text": {"content": guid}}]},
                "ゾーン名": {"rich_text": [{"text": {"content": name}}]},
                "面積": {"number": area},
            },
        }
        zone_infos.append(item)

    return zone_infos

zone_infos = extract_data(property_values)

Notionにデータを送信

最後に、NotionのAPIを使って、Notionのデータベースにデータを送信します。
TokenはNotionで作成したAPIキーを、database_idはNotionに作成したデータベースのIDを使用してください。
Notionではデータをまとめて送信することはできないようなので、一つずつ送信していきます。

def create_notion_data(zone_infos):
    # Notionの設定は自分のものを使う
    token = "secret_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    database_id = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    url = "https://api.notion.com/v1/pages"

    headers = {
        "content-type": "application/json; charset=UTF-8",
        "Authorization": "Bearer " + token,
        "Notion-Version": "2025-09-03",
    }

    for zone_info in zone_infos:
        data = {
            "parent": {"database_id": database_id},
            "properties": zone_info["properties"],
        }

        response = requests.post(url, headers=headers, json=data)
        print(response.text)
        time.sleep(1)

    print("データ作成が終了しました")

create_notion_data(zone_infos)

Notion側でデータを確認してみます。
画像のように、ゾーンのGUID、名前、面積が入力されています。

まとめ

以上で、Notionのデータベースに情報を作成することができました。

BIMというとモデルを使って何かすると考えがちですが、重要なのは関係者が同じ情報を見て、同じ認識を持ち、手待ちや手戻りなく作業を行える組織に変えていくことです。

そのために重要なのがCDE(共通データ環境)です。
今回はNotionをクラウドのデータ置場として使いましたが別にNotionでなくてもよく、関係者が共通して使えることが重要です。

プログラムでの自動化なども大切ではありますが、まずは

・データを使う目的
・データ作成のルール
・データをきちんと管理するための運用方法

を考えることが重要だと思います。

いくら3Dモデルを使ってもプログラムで自動化をしても、データの管理がでたらめであれば手戻りやミスコミュニケーションが発生してしまいます。

BIMを使ったDXはテクノロジーだけの問題ではなく、組織と人の問題でもあります。
ITツールのメリットを最大化できるワークフローにするには現状の運用をどのように変えなければならないかを考えることが重要です。

最後までお読みいただきありがとうございました。

下記にコード全文を載せておきます。

import time

import requests
from archicad import ACConnection

conn: ACConnection = ACConnection.connect()
acc = conn.commands
act = conn.types
acu = conn.utilities


def create_notion_data(zone_infos):
    # Notionの設定は自分のものを使う
    token = "secret_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    database_id = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    url = "https://api.notion.com/v1/pages"

    headers = {
        "content-type": "application/json; charset=UTF-8",
        "Authorization": "Bearer " + token,
        "Notion-Version": "2025-09-03",
    }

    for zone_info in zone_infos:
        data = {
            "parent": {"database_id": database_id},
            "properties": zone_info["properties"],
        }

        response = requests.post(url, headers=headers, json=data)
        print(response.text)
        time.sleep(1)

    print("データ作成が終了しました")


def get_property_values():
    zones = acc.GetElementsByType("Zone")
    property_names = ["IdAndCategories_UniqueID", "Zone_ZoneName", "Zone_NetArea"]

    property_ids = [acu.GetBuiltInPropertyId(i) for i in property_names]
    property_values = acc.GetPropertyValuesOfElements(zones, property_ids)
    return property_values


def extract_data(property_values):
    zone_infos = []
    for values in property_values:

        guid = values.propertyValues[0].propertyValue.value
        name = values.propertyValues[1].propertyValue.value
        area = values.propertyValues[2].propertyValue.value

        item = {
            "properties": {
                "GUID": {"title": [{"text": {"content": guid}}]},
                "ゾーン名": {"rich_text": [{"text": {"content": name}}]},
                "面積": {"number": area},
            },
        }
        zone_infos.append(item)

    return zone_infos


if __name__ == "__main__":
    property_values = get_property_values()
    zone_infos = extract_data(property_values)
    create_notion_data(zone_infos)