Power Automateで1日1件のタスクメール配信とExcelステータス自動更新を実現する方法

「1人あたり1日1件だけタスクメールを送り、ボタン操作でExcelのステータスを自動更新したい」──Power Automateを使えば、意外とシンプルな構成で実現できます。本記事では、標準コネクタだけで組める具体的なフロー設計と式、つまずきポイントの回避策まで、実務レベルで使える形で解説します。

目次

実現したいことの整理

まず、今回のゴールをもう少し整理しておきます。

  • Excelに次のような列を持つタスク管理表がある(保存先はOneDrive for Business または SharePoint):
    「メンバー名」「メール」「タスク」「ステータス」など
  • 毎日、各メンバーに対して:
    • 前日までの 未完了タスクはすべて メール配信したい
    • 新しく割り当てられたタスク(ステータス空白)のうち、その日1件だけ メール配信したい
  • メール内に「完了 / 未完了(Done / Undone)」ボタンを用意し、押された内容でExcelのステータスを更新したい
  • Power Automateの「各アイテムに適用(Apply to each)」をそのまま使うと、1人あたり何件もメールが飛んでしまうので、 1人1日1件の「新規タスクメール」に制御したい

ここで大事な前提が2つあります。

  • Excelは必ず テーブル化 しておく(「テーブルとして書式設定」「テーブルに変換」)
  • Outlookの「オプション付きメール」は、1通につき1つの選択肢セットしか持てないため、 1通のメール内で複数タスクを別々のボタンで更新することはできない

したがって、現実的な設計は次のようになります。

  • 未完了タスク:タスクごとにオプション付きメールを送る(1タスク=1通)
  • 新規タスク:その日、そのメンバーには 先頭1件だけ メールする

Excelテーブル設計のおすすめ構成

フローの作りやすさと保守性を考えると、Excelテーブルは最低限、次のような列構成にしておくと便利です。

列名用途 / ポイント例
ID一意のID。
Power Automateの「行の更新」で行を特定するためのキー。
1, 2, 3 …
Memberメンバー名。人間が見て分かりやすい表示用。山田 太郎
Emailタスクメールを送る宛先のメールアドレス。[email protected]
Task具体的なタスク内容。週報の提出
Statusタスクの状態。
空白 / Undone / Done の3状態を想定。
Undone, Done など
TaskOrder新規タスクの並び順。
「どれを先に送るか」を制御するための通し番号。
1, 2, 3 …
LastSentDate(任意)最後にメール配信した日付。
同じタスクを同日に複数回送らないための制御に使える。
2025-12-09

保存場所は次のいずれかにします。

  • OneDrive for Business
  • SharePoint ドキュメントライブラリ

個人利用中心なら OneDrive for Business、チーム利用であれば SharePoint に置くとよいでしょう。

フロー全体の構成イメージ

今回のフローは、ざっくり次のような構造になります。

パート役割
1. トリガー「繰り返し(Recurrence)」で毎日決まった時間に起動
2. Excel 行取得「List rows present in a table」でテーブル全体(または未完了中心)を取得
3. メンバー一覧作成Select + union() で Email の重複を排除したメンバーリストを作る
4. メンバーごとループApply to each(メンバー単位)で以降の処理を分岐
5. 未完了タスク処理Filter array で Undone を抽出 → タスクごとにメール送信 → 回答でStatus更新
6. 新規タスク処理Filter array で Status空白を抽出 → 先頭1件だけメール → 回答でStatus更新

ポイントは、「1人あたり1日1件の新規タスクメール」を、ループの中でどう制御するかです。 Power Automateには「break文」がないため、ループそのものを1件だけの配列にしてしまうという考え方が重要になります。

トリガー設定:毎日決まった時間に実行する

最初に、フローのトリガーを設定します。

  1. Power Automate ポータルで「クラウド フロー」→「自動化したクラウド フロー」を作成
  2. トリガーに「繰り返し(Recurrence)」を選択
  3. 間隔:1、頻度:日、時刻:例えば「09:00」に設定

これで、フローが毎朝9時に自動起動するようになります。時間帯は組織や運用に合わせて自由に変更できます。

Excel行を取得する:「List rows present in a table」

次に、タスクが入っているExcelテーブルの行を取得します。

  1. アクション「Excel Online(Business)」→「テーブルに存在する行を一覧表示(List rows present in a table)」を追加
  2. 場所:OneDrive for Business または SharePoint
  3. ドキュメントライブラリ・ファイル・テーブル名を指定

レコード数が多い場合は、ODataフィルターで対象を絞ると効率が良くなります。例えば:

Status eq 'Undone' or Status eq ''

これで「未完了またはステータス空白」の行だけを取得できます。 ただし、「新規タスクをその日1件だけ送る」という要件上、「既に完了しているもの(Done)はそもそも取得しない」方が自然なので、この条件で問題ないケースが多いはずです。

Excelコネクタには行数制限(初期値256件)があるため、タスクが多くなりそうな場合はアクション設定の「上限数」や「ページング」を有効にしておくと安心です。

ユニークなメンバー一覧を作る:Select + union()

「1人あたり1日1件」の制御をするためには、まず全タスクから「誰が対象か」というメンバー一覧を作る必要があります。

手順は次の通りです。

  1. アクション「データ操作」→「Select」を追加
  2. From:先ほどの「List rows present in a table」の値
  3. Map:例えば「Email」というプロパティ名に、値として動的コンテンツから「Email」列を指定

これで、Excelの行からEmailだけを抜き出した配列ができます。ただし、このままだと同じメールアドレスが複数含まれます。そこで、式 union() を使って重複を排除します。

  1. アクション「データ操作」→「Compose(作成)」を追加
  2. 入力に次のような式を記述
union(body('Select'), body('Select'))

ここでのポイントは、「Select」の出力を2回 union に渡すことで、重複を削除したユニークな配列になる、というテクニックです。

処理BeforeAfter(Composeの出力)
Select[{Email: A}, {Email: A}, {Email: B}]同じ
union()上記のSelect出力を2回渡す[{Email: A}, {Email: B}]

これが後続の「メンバーごとのループ」の入力になります。

メンバーごとに処理する:Apply to each(外側ループ)

先ほどの Compose の出力(ユニークなEmail一覧)を元に、「1人ずつ」処理するループを作ります。

  1. アクション「Apply to each」を追加
  2. 配列:Compose(union)の出力

このループの中で、

  • そのメンバーの未完了タスクを全部メールする処理
  • そのメンバーの新規タスクのうち先頭1件だけメールする処理

の2つを実行していきます。

また、Excelは同時書き込みに弱いので、フロー全体の安定性を上げるには、このループの「設定」から

  • 同時実行の制御:オン
  • 上限:1

として、1ユーザーずつ順番に処理する形にしておくと安全です(全体の処理時間は多少伸びます)。

未完了タスクをメール配信する(タスクごと1通)

まずは「前日までの Undone(未完了)タスクをすべてメールする」処理です。 外側のメンバーループの中に、次のようなアクションを追加します。

Filter arrayで「その人の未完了」だけを抽出

  1. アクション「データ操作」→「Filter array」を追加
  2. From:最初に取得した「List rows present in a table」の値
  3. 条件:
    • 1つ目:item()?['Email'] が「現在のメンバーのメール(外側ループの items())」と一致
    • 2つ目:item()?['Status'] が 'Undone' と一致

「現在のメンバーのメール」の参照が動的コンテンツから選べない場合は、式を使って

items('Apply_to_each')?['Email']

のように手入力します(ループ名は実際の名称に合わせてください)。

未完了タスクごとにメール送信

Filter array の出力(該当メンバーのUndoneタスク配列)に対して、内側の「Apply to each」を追加します。

  1. アクション「Apply to each」を追加
  2. 配列:Filter array(未完了)の出力
  3. その中に「Outlook」→「オプション付きのメールを送信(Send email with options)」を追加

「オプション付きメール」の設定例は次の通りです。

  • 宛先:外側ループの Email(メンバーのメール)
  • 件名: 【未完了タスク】@{items('Apply_to_each_UndoneTasks')['Task']} など
  • 本文:
    • タスク内容
    • 担当者名
    • 必要なら期日や備考
  • ユーザーに提示するオプション:完了, 未完了(カンマ区切り)
  • オプションごとの内部値を分けたい場合は、後で式でマッピング

このアクションは、ユーザーがメール内のボタンをクリックするまで待機し、その後 SelectedOption という出力に選択結果を返します。

回答を受け取ってExcelを更新

オプション付きメールの直後に、条件分岐とExcel更新を配置します。

  1. 「条件(Condition)」アクションを追加
  2. 条件:outputs('Send_email_with_options')?['body/SelectedOption'] が '完了' と等しい
  3. 「はい」側に、Excelの「行の更新(Update a row)」を配置

Update a row では、次のように設定します。

  • 場所・ドキュメントライブラリ・ファイル・テーブル:最初のList rowsと同じ
  • キー列:ID
  • キー値:内側ループのタスク行から items('Apply_to_each_UndoneTasks')['ID'] を指定
  • 更新する列:
    • Status:Done に上書き
    • LastSentDate:utcNow() など(必要に応じて)

「未完了」が選ばれた場合は Status を Undone のままにする、あるいは何も更新しない、など運用に合わせて決めてください。

新規タスクを「1日1件だけ」メールする方法

次に、ステータスが空白の「新規タスク」について、その日1件だけ メールする仕組みを作ります。

基本的な流れは、未完了と同じく Filter array で対象を絞り、その配列から 先頭1件だけ取り出すという発想です。

Filter arrayで「その人の新規タスク」を抽出

外側のメンバーループの中で、次のFilter arrayを追加します。

  1. From:最初の「List rows present in a table」の値
  2. 条件:
    • 1つ目:item()?['Email'] = 現在のメンバーEmail
    • 2つ目:item()?['Status'] = 空白(「等しい」「値なし」などで設定)

このFilter array(ここでは Filter_array_New とします)の結果は、「そのメンバーの新規タスク一覧」です。 ただし、このままだと複数件あるかもしれません。そこで、長さをチェックし、1件だけ取り出します。

length()で「タスクが存在するか」を確認

「条件(Condition)」アクションを追加し、次の式を使います。

length(body('Filter_array_New'))
  • 左辺:上記式
  • 演算子:is greater than
  • 右辺:0

これで「新規タスクが1件以上ある場合のみ、メール送信処理に進む」という分岐が作れます。

first() または [0] で先頭1件だけ取り出す

条件の「はい」側で、新たに「Compose」アクションを追加し、次の式を使います。

first(body('Filter_array_New'))

または、配列アクセスを使って

body('Filter_array_New')[0]

としても構いません。 このComposeの出力が「そのメンバーの新規タスクのうち先頭1件」となります。

先頭1件の定義は、Excel側の TaskOrder 列を使って明示しておくとよいでしょう。 例えば TaskOrder の昇順で並ぶようにしておくことで、「若い番号のタスクから配信する」というルールが自然にできます。

先頭1件に対してオプション付きメールを送信

あとは、このComposeの出力を元に、未完了タスクと同様の「オプション付きメール」を送信します。

  1. 「Send email with options」を追加
  2. 件名や本文で、Composeの出力を式で参照します

列の参照イメージは以下のようになります。

  • タスク名:outputs('Compose_NewTask')['Task']
  • ID:outputs('Compose_NewTask')['ID']

選択肢やExcel更新の処理(StatusをDoneに変える)は、未完了タスクと同じ構造でOKです。

「ループを1件で止めたい」ときのPower Automate的考え方

プログラミング経験がある方ほど、「foreachの途中でbreakしたい」という発想になりがちですが、Power Automateにはループを途中で抜ける構文はありません。

代わりに多くの場合、次の2ステップで解決します。

  1. 先に Filter array や式を使って「処理対象の配列」を作る
  2. その配列自体を take() や first() で1件に絞り込んでからループに渡す

例えば、新規タスク配列から先頭1件だけを取り出した配列を作り、それをループさせたい場合は次のような式も使えます。

take(body('Filter_array_New'), 1)

この結果は「1件だけ要素を持つ配列」になるので、これを「Apply to each」の入力にすれば、実質1件だけ回るループが作れます。

日本語でのメール文面サンプル

実際のメール本文のイメージを具体的にしておくと、フロー作成時に迷いにくくなります。 以下は、未完了タスク向けメールの一例です。

項目例
件名【未完了タスクのご確認】@{items(‘Apply_to_each_UndoneTasks’)[‘Task’]}
本文(冒頭)いつもお疲れさまです。
以下のタスクの対応状況をご回答ください。
本文(内容)タスク名:@{items(‘Apply_to_each_UndoneTasks’)[‘Task’]}
担当者 :@{items(‘Apply_to_each_UndoneTasks’)[‘Member’]}
期日  :@{items(‘Apply_to_each_UndoneTasks’)[‘DueDate’]}(任意)
本文(案内)このメール上部の「完了」「未完了」ボタンのいずれかをクリックしてください。
オプション完了, 未完了

新規タスクメールも同じ構造で、「本日新しく割り当てられたタスクです」といった一文を加えると分かりやすくなります。

ExcelとPower Automateの相性で気をつけるポイント

Excelは手軽に始められる一方で、Power Automateから書き込みを行うときにはいくつかの注意点があります。

ポイント内容対策
同時編集に弱い複数ユーザーや複数フローから同じファイルを書き込むとエラーになりやすい。ループの同時実行を1にする、フローを1本化する、将来的にはSharePointリストへ移行する。
行数制限List rows present in a table に内部上限がある。ページングを有効化する、フィルターで対象を絞る、古いタスクをアーカイブする。
列名の変更Excel側で列名を変えると、フロー内の参照が壊れることがある。列設計をある程度固めてからフローを作る。不要な列名変更は避ける。
データ型日付や数値の扱いが曖昧になりがち。日付はISO形式(yyyy-MM-dd)で扱う、Power Automate側でformatDateTime()を活用する。

もし運用規模が大きくなってきたら、SharePointリストやDataverseに移行することも検討すると良いでしょう。 基本ロジックは同じで、ExcelがSharePointリストに置き換わるだけなので、フローの修正も比較的容易です。

よくあるつまずきポイントと対処法

動的コンテンツが出てこない問題

Filter arrayや内側のApply to eachの中では、GUIの動的コンテンツ一覧に欲しい項目が出てこないことがあります。 その場合は、式で直接参照するのが定石です。

  • 内側ループのタスク行のID: items('Apply_to_each_UndoneTasks')['ID']
  • 新規タスク(Compose)のTask: outputs('Compose_NewTask')['Task']

ループ名やアクション名を分かりやすく付けておくと、式を書くときに迷いにくくなります。

「今日送ったタスクを再送してしまう」問題

未完了タスクを毎日配信する設計にしていると、ユーザーによっては「同じタスクのメールが何度も届く」ことを嫌がる場合があります。 その場合は、Excelに LastSentDate 列を追加し、「今日送ったタスクは対象外」にする条件を加えましょう。

  • List rows のODataフィルター例: (Status eq 'Undone' or Status eq '') and (LastSentDate ne '2025-12-09')

実運用では utcNow() をformatDateTimeで整形し、フロー内で比較します。 多少式は複雑になりますが、「しつこくない通知」を実現するうえで有効な工夫です。

1人に大量の未完了タスクがある場合

未完了タスクは「タスクごとに1通」送る設計なので、タスクが多いメンバーにはメールが大量に飛んでしまう可能性があります。 現場の納得感を高めるには、次のような妥協案もありえます。

  • 未完了タスクも「1日に送る上限を3件まで」などに制限する
  • 「期限超過タスクだけ送る」といった条件を追加する
  • メールではなくTeamsへのAdaptive Card通知に切り替える

Power Automateでは、take() を使うことで「先頭3件だけ」のような制御も簡単にできます。

発展形:ApprovalsやAdaptive Cardを使う場合

標準の「オプション付きメール」は手軽で便利ですが、より堅牢・拡張性重視の設計として次のような方法もあります。

Approvals(承認)を使う

  • アクション「承認の作成と待機(Start and wait for an approval)」を利用
  • 承認タイプを「カスタム応答」にして、応答に「完了」「未完了」を設定
  • メールまたはTeamsから回答可能
  • 戻り値の Outcome を見て、ExcelのStatusを更新

メリットは、誰がいつどのように回答したかの履歴が承認センターに蓄積されることです。 監査性や管理性が重要な場面では、Approvalsの採用も検討できます。

Adaptive Card + HTTP要求を使う高度設計

よりインタラクティブなUIを求める場合は、

  • TeamsまたはOutlookにAdaptive Cardを送る
  • ボタン押下でPower Automate(またはLogic Apps)のHTTPトリガーを叩き、Excelを更新

といった高度な構成も可能です。 初期構築の難易度は上がりますが、「複数タスクを1枚のカードにまとめる」「コメントを必須にする」など、自由度の高い設計ができます。

ここまでのフロー構成を簡単におさらい

最後に、今回のフローの最小構成をもう一度コンパクトにまとめます。

  1. トリガー:繰り返し(毎日◯時)
  2. Excel:List rows present in a table(StatusがUndoneまたは空白)
  3. Select(Emailだけ抽出)→ union() でユニークEmail一覧作成
  4. Apply to each(ユニークEmail)
    • Filter array(その人のStatus=’Undone’)→ Apply to each(未完了)
      • Send email with options(完了/未完了)
      • Condition(SelectedOption=’完了’)→ Update a row(Status=Done)
    • Filter array(その人のStatus=”)→ Condition(length > 0)
      • Compose:first(body(‘Filter_array_New’))
      • Send email with options(新規1件分)
      • Condition(SelectedOption=’完了’)→ Update a row(Status=Done)

重要なのは「ループを途中で止める」のではなく、最初から配列を1件に絞り込むというPower Automate特有の発想です。 これに慣れてしまえば、「1日1件 / 人」のような要件も比較的シンプルなフローで実現できるようになります。

まとめ:Excel + Power Automateで現場タスクを半自動化する

本記事で紹介した構成を使うと、次のような状態を実現できます。

  • Excelにタスクを追加しておけば、あとは毎日自動で「やることメール」が飛ぶ
  • メンバーはメールの「完了 / 未完了」ボタンを押すだけで良い
  • ステータス更新は自動でExcelに反映されるため、管理者は表を見るだけで進捗が把握できる
  • 未完了は追いかけつつ、新規タスクは1日1件に抑えられるので、通知過多も防げる

Power AutomateとExcelだけでも、ここまでのワークフロー自動化が可能です。 まずは小さなチームや限定的な業務で試しながら、自組織に合った通知頻度やステータス管理ルールを調整していくと、ムリなく「半自動化」へ移行していけるはずです。

慣れてきたら、SharePointリストへの移行やApprovalsの導入、Adaptive CardによるTeams連携など、より高度なパターンにもチャレンジしてみてください。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次