はじめに
NotionRubyMapping 解説の第7回目です。昨日の Text Object に続き、同じ Rich Text Object のサブクラスである Mention Object を解説します。今日の作業ページはこちらです。
段落ブロックの取得 (復習)
上のページにこんな感じで段落ブロックを置いてみました。
このブロックでブロックのリンクを取得とすると以下のような URL になります。
https://www.notion.so/hkob/Mention-Object-7-cc582539095e480facef14a7764a9d90?pvs=4#c3a8a4d76a464eab9429c03213f46a29
昨日の復習としてこのブロックを取得してみます。
irb(main):002> block = Block.find "https://www.notion.so/hkob/Mention-Object-7-cc5 82539095e480facef14a7764a9d90?pvs=4#c3a8a4d76a464eab9429c03213f46a29" => NotionRubyMapping::ParagraphBlock-c3a8a4d76a464eab9429c03213f46a29
NotionRubyMapping::ParagraphBlock のオブジェクトが取得できていることがわかります。
Page mention
ParagraphBlock の RichTextArray からそれぞれの Mention Object を取得してみます。最初はページメンションです。
irb(main):003> pm = block.rich_text_array[0] => #<NotionRubyMapping::MentionObject:0x000000012213a920 ...
Page mention には page_id というメソッドがあります。
irb(main):014> pm.page_id => "eb0f0c59-6c12-4b86-8d2d-531a69ddd58c"
options で内部に保存されているデータが見えます。page_id と同様に href くらいは直接取り出すメソッドを作ってもよさそうですね。To Do に入れておきます。内容を見てもらうとわかるようにリマインダに関する情報は、Notion API 側からは見ることができませんし、設定することもできません。これができると色々と便利に使えそうなのですが。
irb(main):017> pm.options => {"bold"=>false, "italic"=>false, "strikethrough"=>false, "underline"=>false, "code"=>false, "color"=>"default", "plain_text"=>"Untitled", "href"=>"https://www.notion.so/eb0f0c596c124b868d2d531a69ddd58c", "page_id"=>"eb0f0c59-6c12-4b86-8d2d-531a69ddd58c"}
Database mention
同様に 2 番目の Database mention を取得してみます。
irb(main):019> dm = block.rich_text_array[1] => #<NotionRubyMapping::MentionObject:0x000000012213a830 ...
こちらも options で内部に保存されているデータが見えます。
irb(main):020> dm.options => {"bold"=>false, "italic"=>false, "strikethrough"=>false, "underline"=>false, "code"=>false, "color"=>"default", "plain_text"=>"作業ページデータベース", "href"=>"https://www.notion.so/f50fe9be119c41d1b2e0b99bbab471a8", "database_id"=>"f50fe9be-119c-41d1-b2e0-b99bbab471a8"}
こちらの database_id は取り出す専用メソッドを作っていませんでした。今はこんな感じで options ハッシュから取り出すしかないです。こちらも ToDo に入れておきましょう。
irb(main):021> dm.options["database_id"] => "f50fe9be-119c-41d1-b2e0-b99bbab471a8"
User mention
3番目は User mention です。
irb(main):022> um = block.rich_text_array[2] => #<NotionRubyMapping::MentionObject:0x000000012213a7e0 ...
同じく options の結果は以下のようになります。user_id
もメソッドがあるといいですね。せっかく user_id
があるので、user としたら後で紹介される UserObject が取得できると Rails っぽくていいですね。こちらも ToDo に入れておきましょう。
irb(main):023> um.options => {"bold"=>false, "italic"=>false, "strikethrough"=>false, "underline"=>false, "code"=>false, "color"=>"default", "plain_text"=>"@Hiroyuki KOBAYASHI", "href"=>nil, "user_id"=>"2200a911-6a96-44bb-bd38-6bfb1e01b9f6"}
Date mention
4番目は User mention です。
irb(main):024> dtm = block.rich_text_array[3] => #<NotionRubyMapping::MentionObject:0x000000012213a768 ...
こちらも options は以下のようになります。start に iso8601 形式の日付文字列が入っています。
irb(main):025> dtm.options => {"bold"=>false, "italic"=>false, "strikethrough"=>false, "underline"=>false, "code"=>false, "color"=>"default", "plain_text"=>"2024-03-01T09:00:00.000+09:00", "href"=>nil, "start"=>"2024-03-01T09:00:00.000+09:00", "end"=>nil, "time_zone"=>nil}
テンプレートメンション
以前はこんな感じで template mention を追加できていました。
irb(main):003* %w[today now user].each do |key| irb(main):004* tm = MentionObject.new "template_mention" => key irb(main):005* block.rich_text_array << tm irb(main):006> end
ただ、今やってみると以下のようにエラーになりました。以前は template の外で作っても現在の日付などに変換された Mention object に変換されていたのですが、今は templates の外側では作成できないように変更されているみたいですね。
irb(main):007> block.save /Users/hkob/.rbenv/versions/3.3.0/lib/ruby/gems/3.3.0/gems/notion_ruby_mapping-0.8.3/lib/notion_ruby_mapping/blocks/base.rb:345:in `update_json': {"object"=>"error", "status"=>400, "code"=>"validation_error", "message"=>"Template mentions cannot be created outside of templates.", "request_id"=>"c5369dfc-b219-499f-ba6e-a35791adbc51"} (StandardError)
おわりに
昨日の TextObject に引き続き Mention object の使い方を解説しました。あまり使っていないので、機能が作り込めていない部分が多数ありました。また、MentionObject は options のハッシュを受け取るだけしか作り込んでいないため、template mention の部分で説明したように文字列をキーとするハッシュを渡す必要があります。これだと irb の補完にも引っかからずユーザの使い勝手としてはあまりいいものではありません。page_id や database_id などは文字列で指定するのではなく、キーワード引数でも設定できるようになっているとよいなと思いました。この連載をしていく上で、To Do がたくさん溜まっていくので、これらをデータベースにまとめ、後日一括で更新したいと思っています。
MentionObject のマニュアルはこちら。