Notion Tips 連載まとめの自動追記 その1: Notion Tips (83)

はじめに

Notion Tips の第83回目はこのブログへのリンクを毎日自動的に設定するスクリプトの作成です。ずっとやろうと思っていたのですが、20日ほど溜め込んでしまっていました。まず、これまでの不足分を自動登録した後で、毎日自動追加する仕組みを作成してみたいと思います。本日はまず一件の登録からスタートします。

Notion Tips の連載まとめページ

Notion Tips の連載まとめページはこちらからアクセスできます。 Notion Tips | Notion

この記事執筆時点ではこんな感じで最後の更新は 8月23日でした。手動で毎日更新するのは莫迦らしいので、なんとか少しでも自動化したいです。

Notion Tips 連載まとめ

最初の 8月23日の行の内容を確認しようと NotionRubyMapping で読み込んだところ、以下のようにエラーになってしまいました。link_mention という新しいメンションタイプが用意されたようで、NotionRubyMapping では展開できませんでした。これについては後日対応することにします。新しい型ができたとしても、ドキュメント化はされていませんし、create や update などはすぐにはできなそうなので、取り急ぎリンクテキストのものを作成してみます。

link_mention のエラー

8月24日分をテキストリンクで追加してみました。

テキストリンクで追加

この中身を確認してみます。

JSONを確認

1件のみ手動登録

まず親のページを取得します。

page = block.parent
=> NotionRubyMapping::Page-545bd67d60aa4e18bd3be43c117908e5

一番先頭の「記事一覧」というパラグラフブロックを取得します。

top_block = page.children.first
=> NotionRubyMapping::ParagraphBlock-ac939bb491794c5b82747900cafe447b

このトップブロックの下に上に書かれたような箇条書きブロックを作成します。日付の Mention object は以下のように作成できます。

date = "2024-08-25"
=> "2024-08-25"
mo = MentionObject.new "start" => date, "plain_text" => date
=>
#<NotionRubyMapping::MentionObject:0x000000012ba95868

さらに次のリンク付きテキストを作成します。

url = "https://hkob.hatenablog.com/entry/2024/08/25/050000"
=> "https://hkob.hatenablog.com/entry/2024/08/25/050000"
lt = TextObject.new url
=>
#<NotionRubyMapping::TextObject:0x000000012beb3210
...
lt.href = url
=> "https://hkob.hatenablog.com/entry/2024/08/25/050000"

これらを要素にもつ BulletedListItemBlock を作成します。

bi = BulletedListItemBlock.new [mo, " ", lt]
=> NotionRubyMapping::BulletedListItemBlock-

ここで、page に対して top_block の下に追加してみます。ここで再度 link_mention エラーが出てしまいました。これは append_block_children の結果として戻ってきたページを再度 page に代入する処理がなされるのですが、そこでページ内に含まれる link_mention を扱ってしまうからです。

page.append_block_children bi, after: top_block
/Users/hkob/.rbenv/versions/3.3.4/lib/ruby/gems/3.3.0/gems/notion_ruby_mapping-0.8.7/lib/notion_ruby_mapping/blocks/base.rb:142:in `append_block_children': {"object"=>"error", "status"=>400, "code"=>"validation_error", "message"=>"body failed validation: body.after should be a valid uuid or `undefined`, instead was `\"#<NotionRubyMapping::ParagraphBlock:0x00000001033b9940...`.", "request_id"=>"5d204424-00b7-43f6-a649-6a4a9b81e1ec"} (StandardError)
    from (irb):28:in `<main>'
  from <internal:kernel>:187:in `loop'
  from /Users/hkob/.rbenv/versions/3.3.4/lib/ruby/gems/3.3.0/gems/irb-1.14.0/exe/irb:9:in `<top (required)>'
    from /Users/hkob/.rbenv/versions/3.3.4/bin/irb:25:in `load'
  from /Users/hkob/.rbenv/versions/3.3.4/bin/irb:25:in `<main>'
irb(main):029> page.append_block_children bi, after: top_block.id
/Users/hkob/.rbenv/versions/3.3.4/lib/ruby/gems/3.3.0/gems/notion_ruby_mapping-0.8.7/lib/notion_ruby_mapping/objects/rich_text_object.rb:49:in `create_from_json': Unknown mention type: link_mention (StandardError)

確認するとページにブロックは正しく追加されていました。この先の自動化に進むためには、やはり NotionRubyMapping を更新しなければいけないようです。

おわりに

今回は、Notion Tips の紹介ページの自動化のために、ひとまず一行だけリンクを追加してみました。ただし、NotionRubyMapping の更新をしないと先に進めないようなので、明日から NotionRubyMapping のアップデートを進めていくことにします。