この記事でできること
- Plannerのタスクを毎サイクル全部消して作り直すフローの組み方が分かる
- 「ListTasks → ループ → タスクを削除する」の3点セットの作り方が分かる
- タスクの削除にIf-Match(ETag)が要るのか、実機で確かめた結果が分かる
Power Automate で Planner のタスクを扱うフローを作っていると、「前に配ったタスクをいったん全部消して、まっさらから作り直したい」という場面が出てきます。そのため、毎サイクルの頭でタスクを一括削除する処理を組みました。
やってみると素直に作れる部分と、調べた情報と違って戸惑う部分の両方がありました。この記事では、その一括削除フローの組み方をまとめます。
完成イメージ
先に完成形を確認しておきます。削除ブロックは3つのアクションでできています。

やっていることは3段階です。プランのタスクを全部取ってきて(ListTasksA)、Apply to each1件ずつループで回し(DeleteOldTasks)、その中で1件ずつ削除する(タスクの削除)、という流れです。
全体の実装構成
3点セットの役割は次のとおりです。
| アクション | 役割 |
|---|---|
| タスクの一覧表示(ListTasksA) | 削除対象のタスクを全部集める |
| Apply to each(DeleteOldTasks) | 集めたタスクを1件ずつ回す |
| タスクを削除する(タスクの削除) | ループの中で1件ずつ消す |
この削除ブロックは生成ループの前に置き、「古いのを全部消してから、新しいのを作り直す」という順番にしています。
私はこのフローを「タスクを毎回作り直す」ものと割り切っています。前回分のタスクを残さず、毎サイクルまっさらから配り直す作りです。
実装①|削除対象を集める(タスクの一覧表示)
まず「タスクの一覧表示」で、対象プランのタスクを全部取得します。

グループIDとプランIDを指定(画像黒塗り部分)します。今回は省略していますが、プランのタスクが多い場合は、改ページのしきい値で上限を設定します。
実装②|ループで1件ずつ削除する(タスクを削除する)
取得したタスクを Apply to each で回し、その中に「タスクを削除する」を置きます。
タスクIDを指定する
Apply to each の入力には、ListTasksA の出力を指定します。次の式です。
outputs('タスクの一覧表示名')?['body/value']

ループの中の「タスクを削除する」には、タスクIDを指定します。次の式です。
items('Apply to each名')?['id']

これで、ループが回るたびに1件ずつタスクIDが渡され、順番に削除されていきます。
If-Match(ETag)欄が出てこない話
Plannerのタスク削除を調べると、Microsoft Graph APIの仕様として「削除にはETag(@odata.etag)をIf-Matchヘッダーに指定する必要がある」と出てきます。ETagはタスクごとの「今のバージョン」を示す印で、私も最初はこの手順どおりに用意するつもりでした。
ところが、Power Automateの標準コネクタ「タスクを削除する」にはタスクIDの入力欄のみで、If-Match欄自体がありません。試しにタスクIDだけを指定したところ、そのまま削除できました。
なぜIf-Match欄が無くても削除できるのか、はっきりした理由は公開情報からは分かりませんでした。推測ですが、標準コネクタが内部でIf-Matchを補ってくれているのだと考えています。いずれにせよ、標準コネクタを使う限りは、利用者がETagを意識する必要はありませんでした。
実装③|削除ブロックを生成ループの前に置く
削除ブロックは、タスクを作り直す生成ループの前に置きます。

順番を「削除(古いのを全消し)→ 生成(新しいのを作り直し)」にしているのは、前サイクルのタスクを残したまま新しいものを足すと、タスクがどんどん二重に溜まってしまうからです。毎サイクル頭でリセットする、というのがこの作りの考え方です。
削除ループにも遅延を効かせる
大量のタスクをまとめて削除すると、コネクタの実行回数制限(スロットリング)に当たることがあります。私は削除ループの末尾にも「遅延」を5秒挿入して、1件ずつ間隔を空けるようにしました。

ここで1つ注意点があります。遅延を効かせるには、Apply to each を同時実行=1(順次)に設定しておく必要があります。並列のままだと全ループが一斉に走ってしまい、遅延を入れても待ちが重なって意味が薄れます。
まとめ
今回のポイントを整理します。
- Plannerのタスクの一括削除は「ListTasks → ループ → タスクを削除する」の3点セットで作れる
- タスクIDは items(‘ループ名’)?[‘id’] で1件ずつ渡す
- 標準コネクタでは If-Match(ETag)欄が出ず、タスクIDだけで削除が通った
- 削除ブロックは生成ループの前に置き、「古いのを全消し→作り直し」の順にする
Power Platformを触り始めたばかりの方に向けて、こういった詰まりポイントをこれからも発信していきます。よかったらブログをブックマークして、またのぞきに来てください。
あわせて読みたい
削除したあとの「作り直し」側では、所属課ごとにタスクの置き場所を振り分けるためにSwitchを使っています。その型不一致でつまずいた話はこちらにまとめています。

そもそもの「1人1タスクを自動で配る」フローの全体像は、こちらの記事が入口になります。



コメント