Mention Object: NotionRubyMapping 解説 (7)

はじめに

NotionRubyMapping 解説の第7回目です。昨日の Text Object に続き、同じ Rich Text Object のサブクラスである Mention Object を解説します。今日の作業ページはこちらです。

hkob.notion.site

段落ブロックの取得 (復習)

上のページにこんな感じで段落ブロックを置いてみました。

Mention objects

このブロックでブロックのリンクを取得とすると以下のような 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 のマニュアルはこちら。

hkob.notion.site

NotionRubyMapping解説