こんにちは、長塚電話工業所の佐藤です。
大変ありがたいことに、弊社には日々大量のお問い合わせが入ってきています。その主な内容としては、
- 製品の詳細について
- 製品の在庫状況について
これらがほとんどを占めています。
弊社は「カスタマーファースト」を謳っておりまして、お客様にとって分かりにくい、手間のかかることは可能な限り避けるようにしています。上記のようなお問い合わせをいただくことも、突き詰めればお客様にとって手間になっていると考えています。
ですが、そういった非常に細かい製品の仕様や、リアルタイムに変わっていく在庫状況をお客様に展開する術をこれまで持ち合わせておらず、色々なシステム会社様と打ち合わせを行っては、ああでもない、こうでもないと検討を続けてきました。
そこに「Notionの活用」という光が差し込んできたのです。
今回は、Microsoft Graph APIおよびNotion API、そしてPythonを使って実装を行いたいと思います。
今回のご紹介内容
- OneDrive上の特定のファイル(Excel)を読み込み、シートの内容・セルの値を取得する
- Notionとの連携
- セルに記載されている数値に応じて、Notionのデータベースの値(タグ)を更新する
図解
図をご覧ください。まず、OneDrive上で管理・運用されている製品の在庫状況をプログラムで引っ張ってきます。その数値に応じて、Web上で公開するNotionデータベースのタグを「有」「僅少」「無」に自動的に変更するようにします。もちろん在庫状況だけではなく、それぞれの製品の画像や特徴、価格などと並行して記載することにより、お客様にとって便利なページになるのではないか?と考えました。
実装
Microsoft Graph API
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | import requests import pandas as pd from io import BytesIO from bs4 import BeautifulSoup # OneDrive Graph APIについてのプログラム##### # アクセストークンを取得するための情報 client_id = 'your-client-id' client_secret = 'your-client_secret' tenant_id = 'your-tenant_id' # トークンURLを構成 token_url = f'https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token' # トークンのデータを構成 token_data = { 'grant_type': 'client_credentials', 'client_id': client_id, 'client_secret': client_secret, 'scope': 'https://graph.microsoft.com/.default' } # トークンを取得 token_r = requests.post(token_url, data=token_data) token = token_r.json().get('access_token') # ヘッダーを構成 headers = { 'Authorization': 'Bearer ' + token } user_id = "your-user-id-example-test@xxx.onmicrosoft.com" file_id = "your-file-id" # Excelファイルをバイナリデータとしてダウンロード file_download_url = f'https://graph.microsoft.com/v1.0/users/{user_id}/drive/items/{file_id}/content' file_download_response = requests.get(file_download_url, headers=headers) # 応答の確認 if file_download_response.status_code == 200: # ダウンロードしたデータをpandas DataFrameとして読み取り data = pd.read_excel(BytesIO(file_download_response.content)) else: # エラーの場合、応答を表示 print(f"Error: {file_download_response.status_code}") print(file_download_response.text) |
上記プログラムは過去に解説および実装を行っています。詳細の確認はこちらから。
引っ張ってきたいファイルのIDを確認するところが肝です。
Notion API
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | if file_download_response.status_code == 200: NOTION_API_KEY = 'your-secret_key' # ダウンロードしたデータをpandas DataFrameとして読み取り excel_data = pd.read_excel(BytesIO(file_download_response.content), sheet_name='sheet', header=None) # Notionページのタグを変更するための関数 def update_notion_tag(notion_api_key, page_id, new_tag): url = f'https://api.notion.com/v1/pages/{page_id}' headers = { 'Notion-Version': '2022-06-28', 'Authorization': f'Bearer {notion_api_key}', 'Content-Type': 'application/json', } json_data = { 'properties': { '在庫状況': { 'multi_select': [ { 'name': new_tag } ] }, }, } response = requests.patch(url, headers=headers, json=json_data) print(response) # 各行の処理 for index, row in excel_data.iterrows(): a_value = row[0] page_id = row[1] if a_value < 1: new_tag = '無' elif 1 <= a_value <= 20: new_tag = '僅少' else: new_tag = '有' update_notion_tag(NOTION_API_KEY, page_id, new_tag) print(f'Updated Notion page {page_id} with tag: {new_tag}') |
引っ張ってくる対象のファイルおよびシートは、以下のようになっています。
B列に記載しているのは、その製品が記載されているNotion側ページのページIDです。
Notionにおけるデータベースというのはいわゆるページの集合で、APIを介して操作を行う際もページIDの指定がそれぞれ必要になります。
ページIDの取得については、こちらをご確認ください。
https://booknotion.site/setting-pageid
A1セルの値が「0」「0~20」「20」以上の場合それぞれに応じて、B1セルのページIDを持つNotionページの「在庫状況」タグを変更する、という処理になります。これを行の数だけ繰り返すので、for文が走っているわけです。
今回は3列のみですが、すべての数値が20以上になっています。つまり、プログラムを実行するとNotion側の在庫状況が全て「有」に変更されるはずです。
Notion API Key
API Keyの取得については、こちらをご確認ください。
https://www.notion.so/ja-jp/help/create-integrations-with-the-notion-api
実行してみる
プログラムを実行してみます。すると、、
自動でタグが変更されました!これを応用することで、例えば価格に変更があったとしてもNotion側をわざわざ書き換える必要は無く、親のExcelファイルを指定するだけで良くなりますね。拡張性・保守性に優れたプロダクトになってくれる予感…?
さいごに
今回は、OneDrive(Excel) x Notionの実装を行いました。記事についてご不明な点などがございましたら、当社HPのお問い合わせフォームよりお気軽にご連絡ください。
プログラム単体では1回の実行につき1回しか処理できませんので、AWSやGCPへのアップロードが必要になります。前回の別の記事では似たようなプログラムを移管する際にAWSを使用しましたが、Lambda関数への変換実装が面倒だった記憶があり、次回はGCPでの実装を検討しています。
こちらについても記事にする予定ですので、お楽しみに!
またこちらの製品データベースは鋭意作成・拡充中です。完成し次第、お客様へアナウンスさせていただきます。
補足ですが、ビューのスタイルを選ぶこともできます。ギャラリーだと見やすくなりますね!もちろん検索機能も充実しています。本当に優秀です笑
今回は以上です。さいごまでお読みいただきありがとうございました!