はじめに
hkob の雑記録の第320回目は、写真を撮影しデータベースに登録するショートカットアプリを作成し始めます。その下準備として、今回は Notion API によるページ作成方法を解説します。
ダミー画像の作成
Notion AI で画像は作成できないので、ここは ChatGPT にお願いしました。

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

JPEG でと書いたのにダウンロードしたら、png ファイルでした。コンバートしておきます。
magick 'ChatGPT Image 2025年11月15日 10_11_04.png' meishi.jpg
画像プロパティを追加
この名刺画像を保存するためのプロパティを名刺データに追加します。プロパティ名は「名刺画像」として見ました。

NotionRubyMapping でページ作成
まず、動作確認のために NotionRubyMapping でページが作成できることを確認します。まずはデータソース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 を準備するまでで長くなってしまったので、実際のショートカット作成は明日に回します。ほぼ一日外出していたので、ショートカットを作成している時間も取れなかったためです。