逆引きFormula 2.0 に戻る
Automation がリリースした後で、その使用例として子タスクのステータス更新により、開始・終了時刻を保存するとともに、親のステータスと開始・終了時刻を更新するテンプレートを配布していました。ところが、Formula 2.0 のリリースにより不具合が出てしまったため、ロールアップの部分を全て関数で書き換えました。Rollup と異なり Formula の場合には、1階層下だけでなく、さらにその下の階層まで内容を確認することができます。この仕組みを利用することで、これまで親タスクだけしか影響できなかったテンプレートが、最上位のタスクまでステータスを伝搬することができました。
ここでは、その時に利用した「子タスク・孫タスク・曽孫タスクのステータスをかき集める」仕組みを解説します。具体的には、子供がない場合には自分のステータス、子供がいる場合には再帰的に子供のステータスを回収する仕組みをしています。今回は 4 階層下までのステータスまでに限定しています。
動作確認してみたい人は、以下のテンプレートを複製してみてください。下位タスクのステータスを変更すると、上位タスクの時間とステータスが自動的に設定されます。
Automatically starts/ends parent tasks
下位階層の Status をかき集める
/* 1階層目が子供を持つか? */
prop("Sub tasks").empty() ?
/* 持たなければ自分(1階層目)のステータスをリストで返す */
[prop("Status")] :
/* 持つ場合は2階層目の全てのページを処理 */
prop("Sub tasks").map(
/* 2階層目が子供を持つか?? */
current.prop("Sub tasks").empty() ?
/* 持たなければ自分(2階層目)のステータスをリストで返す */
[current.prop("Status")] :
/* 持つ場合は3階層目の全てのページを処理 */
current.prop("Sub tasks").map(
/* 3階層目が子供を持つか?? */
current.prop("Sub tasks").empty() ?
/* 持たなければ自分(3階層目)のステータスをリストで返す */
[current.prop("Status")] :
/* 持つ場合は4階層目のステータスを回収 (5階層目はチェックしない) */
current.prop("Sub tasks").map(current.prop("Status"))
)
/* 3階層目の結果はリストが返るので2階層目のデータとフラットに並べる */
.flat()
)
/* 2階層目の結果はリストが返るので1階層目のデータとフラットに並べる */
.flat()