はじめに
一つ前の記事で、Synced block を毎日差し替えるところまで動きました。今回は、この Synced block に To Do リストを自動作成するところまで記述します。
作業 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 を削除する前に実施する形になりそうです。