名刺管理テンプレートの再構築 (3) - Notion API の確認 : hkob の雑記録 (320)

はじめに

hkob の雑記録の第320回目は、写真を撮影しデータベースに登録するショートカットアプリを作成し始めます。その下準備として、今回は Notion API によるページ作成方法を解説します。

ダミー画像の作成

Notion AI で画像は作成できないので、ここは ChatGPT にお願いしました。

ChatGPT で名刺画像作成

生成された名刺はこんな感じです。写真で撮影した場合には、こんな感じで背景も入るのでこの形のまま進めていきましょう。漢字が変なのと、abc が ubc のように見えてしまっていますが、サンプルなのでこの程度でいいでしょう。

作成した画像

JPEG でと書いたのにダウンロードしたら、png ファイルでした。コンバートしておきます。

magick 'ChatGPT Image 2025年11月15日 10_11_04.png' meishi.jpg

画像プロパティを追加

この名刺画像を保存するためのプロパティを名刺データに追加します。プロパティ名は「名刺画像」として見ました。

ファイル&メディアプロパティを追加

NotionRubyMapping でページ作成

まず、動作確認のために NotionRubyMapping でページが作成できることを確認します。まずはデータソースIDを取得します。データソースの管理の場所から「データソースIDをコピー」を選択します。

データソースIDをコピー

このデータベースでは、 2a90ce2a-6520-8107-b8c3-000b2e18c7ed という ID が取得できました。まずはこのデータソースを取得します。

> nrm_console.rb
irb(main):001> ds = DataSource.find "2a90ce2a-6520-8107-b8c3-000b2e18c7ed"
=> NotionRubyMapping::DataSource-2a90ce2a65208107b8c3000b2e18c7ed

今回、ファイルのアップロードを事前に実施します。そのための FileUploadObject を生成します。今回必要なのは、FileUploadObject の id になります。

> fuo = FileUploadObject.new(fname: "meishi.jpg")
=>
#<FileUploadObject:0x000000012a15c180
...
> fuo.id
=> "2ac0ce2a652081da9e6d00b29aae04ee"

早速これを使って、create_child_page を実行してみます。

page = ds.create_child_page(template_page: "default") do |_, pp|
   pp["取得テキスト"] << "技術部顧問\n名無 権兵衛\nJohn Doe\n架空株式会社\n〒123-4567\n名無県名無市1-2-3\nTEL 555-123-456\nFAX 555-123-789\nE-mail abc@example.com\nURL www.example.com\n"
   pp["名刺画像"].files = [FileObject.new(file_upload_object: fuo)]
end
=> NotionRubyMapping::Page-2ac0ce2a652081e69f49e675ef646e06

正しくページは作成されました。名刺画像の部分にアップロードした画像が追加されていることも確認できます。ただし、テンプレートは正しく展開がされているのですが、期待していた AI block の稼働が行われていません。API 経由でテンプレートを展開した場合には、AI block の発火は起こらないようです。仕方がないので、AI block は諦めて crm コマンド内で括り出しもするしかなさそうですね。処理が分散できてよいのではと期待しましたが、当てが外れました。こちらは後で対応することにします。

作成されたページ

この部分の JSON を確認するために、create_child_page ではなく、build_child_page として dry_run を実行して JSON を確認します。file_upload_object の name の部分で実装がミスっている感じですが、この部分は手で修正してみます。先ほど作成した file_upload_object の id さえあれば、この JSON は作成できそうです。

> build_page = ds.build_child_page(template_page: "default") do |_, pp|
   pp["取得テキスト"] << "技術部顧問\n名無 権兵衛\nJohn Doe\n架空株式会社\n〒123-4567\n名無県名無市1-2-3\nTEL 555-123-456\nFAX 555-123-789\nE-mail abc@example.com\nURL www.example.com\n"
   pp["名刺画像"].files = [FileObject.new(file_upload_object: fuo)]
 end
=> NotionRubyMapping::Page-
> print build_page.save(dry_run: true)
#!/bin/sh
curl -X POST 'https://api.notion.com/v1/pages' \
  -H 'Notion-Version: 2025-09-03' \
  -H 'Authorization: Bearer '"$NOTION_API_KEY"'' \
  -H 'Content-Type: application/json' \
  --data '{"properties":{"取得テキスト":{"type":"rich_text","rich_text":[{"type":"text","text":{"content":"技術部顧問\n名無 権兵衛\nJohn Doe\n架空株式
会社\n〒123-4567\n名無県名無市1-2-3\nTEL 555-123-456\nFAX 555-123-789\nE-mail abc@example.com\nURL www.example.com\n","link":null},"plain_text":"技術部
顧問\n名無 権兵衛\nJohn Doe\n架空株式会社\n〒123-4567\n名無県名無市1-2-3\nTEL 555-123-456\nFAX 555-123-789\nE-mail abc@example.com\nURL www.example.com\n","href":null}]},"名刺画像":{"files":[{"type":"file_upload","file_upload":{"id":"2ac0ce2a652081da9e6d00b29aae04ee"},"name":"#<NotionRubyMapping::FileObject:0x000000012a07bc70>"}],"type":"files"}},"parent":{"data_source_id":"2a90ce2a65208107b8c3000b2e18c7ed"},"template":{"type":"default"}}'=> nil

おわりに

今日はショートカットを作成するところまで記載するつもりでしたが、JSON を準備するまでで長くなってしまったので、実際のショートカット作成は明日に回します。ほぼ一日外出していたので、ショートカットを作成している時間も取れなかったためです。

hkob.notion.site