【Power Automate】Plannerのタスクを一括削除する|毎サイクル作り直すフローの組み方

Power AutomateでPlannerのタスクを一括削除するフローの構成図。タスクの一覧表示で削除対象を集め、Apply to eachのループの中でタスクの削除を1件ずつ実行する3点セットを示している。 Power Automate

この記事でできること

  • 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']
Apply to eachにパラメータを設定した画面

ループの中の「タスクを削除する」には、タスクIDを指定します。次の式です。

items('Apply to each名')?['id']
Apply to eachの中のタスクを削除するにパラメータを設定した画面

これで、ループが回るたびに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を使っています。その型不一致でつまずいた話はこちらにまとめています。

【Power Automate】Switchの型不一致対策|String・Integer・Floatの型変換
Power AutomateのSwitchが「is of type Float」エラーで実行に失敗する原因と解決手順をまとめます。オン欄をint()で整数に揃え、ケースは素の数値をリテラルで入力する方法や、値の型をエラー文から確認する手順を、実際の画面つきで解説します。

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

【Power Automate】Plannerに1人1タスクを自動配布する|バケット振り分け方法
Power AutomateでSharePointの名簿からPlannerのタスクを1人1つ自動作成する手順をまとめました。バケットのGUIDの控え方、Switchによる課別の振り分け、変数の初期化、100件で打ち切られないための改ページ設定まで解説します。

コメント

タイトルとURLをコピーしました