タスク管理の再検討(3) To Do ブロックの自動追加 : Notion 解説(51)

はじめに

一つ前の記事で、Synced block を毎日差し替えるところまで動きました。今回は、この Synced block に To Do リストを自動作成するところまで記述します。

hkob.hatenablog.com

作業 4. To Do にメンションされているページ一覧を取得

初期状態では、synced_block_original は空ですが、2回目以降は To Do リストが並んでいます。To Do リストには、個別タスクページへのメンションリンクが設置されています。冪等性を保証するために、設定済の個別タスクページをハッシュに記録しておきます。

#### 4. synced_block_original から設定済の To-Do 一覧を取得し、リンクのハッシュを作成

# synced_block_original の子ブロックに対して繰り返し
todo_hash = synced_block_original.children.each_with_object({}) do |b, hash|
  # To Do 以外は無視
  next unless b.type == "to_do"

  # To Do の RichText の配列をスキャン
  b.rich_text_array.each do |rto|
    # ページメンションの場合には、page_id から to_do ブロックを引くハッシュを登録
    if (mention_page_id = nc.hex_id(rto.options["page_id"]))
      hash[mention_page_id] = b
    end
  end
end

作業5. 個別タスクデータベースから完了していない今日までのタスクを全部取得

次に個別のタスクデータベースに以下のクエリを設定します。

  • 「Done」がチェックされていない
  • 「日付」が今日かそれ以前
  • 日付の古い順

et_tasks は条件に満足するページが入って List オブジェクトになります。

#### 5. 個別タスクデータベースから完了していない今日までのタスクを全部取得

# 個別タスクデータベースを取得
et_database = Database.find "2395e3ffb55e4a8abc1ba426243776e3"

# 今日までの未完了のタスクを古い順に取得
dp = et_database.properties["日付"]
cp = et_database.properties["Done"]
query = cp.filter_equals(false).and(dp.filter_on_or_before(today)).ascending dp
et_tasks = et_database.query_database query

作業6. To Do にリンクされていないタスクを To Do ブロックとして登録

et_tasks をスキャンして、作業 4 で登録されていないタスクを To Do ブロックとして登録します。今日のタスクでないものは、遅延の印として🧨マークを表示するようにします。To Do ブロックの本文は、タスクページへのリンクメンションオブジェクトとします。  

#### 6. To-Do にリンクされていないタスクを synced_block_original に登録

# 今日までの未完のタスクをスキャン
append_blocks = et_tasks.each_with_object([]) do |t, array|
  # すでに登録済ならスキップ
  next if todo_hash[t.id]

  # 開始日付を取得
  start_date = t.properties["日付"].start_date

  # 開始日付が今日より前であれば、🧨をテキストに追加
  text = today == DateProperty.date_from_obj(start_date) ? [] : ["🧨"]

  # タスクページへのメンションをテキストに追加
  text << MentionObject.new("page_id" => t.id, "plain_text" => t.title)

  # 上記のテキストおよびメンションオブジェクトを持つ To Do を配列に追加
  array << Block.new.to_do(text)
end

# 準備した To Do ブロックの配列を synced_block_original に追加
added_blocks = synced_block_original.append_block_children *append_blocks

おわりに

実行したところ、こんな画面になりました。このテストのために、昨日のタスクを終了させないでおきました。昨日のものにだけ🧨マークがついていることがわかります。また、スクリプトを再度実行しましたが、すでに登録済のものが二重化しないことを確認しました。

次は、To Do をチェックしたら、タスクの Done も自動的にチェックを付けるようにしてしまいます。この作業は作業 3 で古い synced_block を削除する前に実施する形になりそうです。

ページメンション付きの To Do リスト


www.notion.so