「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 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件だけの配列にしてしまうという考え方が重要になります。
トリガー設定:毎日決まった時間に実行する
最初に、フローのトリガーを設定します。
- Power Automate ポータルで「クラウド フロー」→「自動化したクラウド フロー」を作成
- トリガーに「繰り返し(Recurrence)」を選択
- 間隔:1、頻度:日、時刻:例えば「09:00」に設定
これで、フローが毎朝9時に自動起動するようになります。時間帯は組織や運用に合わせて自由に変更できます。
Excel行を取得する:「List rows present in a table」
次に、タスクが入っているExcelテーブルの行を取得します。
- アクション「Excel Online(Business)」→「テーブルに存在する行を一覧表示(List rows present in a table)」を追加
- 場所:OneDrive for Business または SharePoint
- ドキュメントライブラリ・ファイル・テーブル名を指定
レコード数が多い場合は、ODataフィルターで対象を絞ると効率が良くなります。例えば:
Status eq 'Undone' or Status eq ''
これで「未完了またはステータス空白」の行だけを取得できます。 ただし、「新規タスクをその日1件だけ送る」という要件上、「既に完了しているもの(Done)はそもそも取得しない」方が自然なので、この条件で問題ないケースが多いはずです。
Excelコネクタには行数制限(初期値256件)があるため、タスクが多くなりそうな場合はアクション設定の「上限数」や「ページング」を有効にしておくと安心です。
ユニークなメンバー一覧を作る:Select + union()
「1人あたり1日1件」の制御をするためには、まず全タスクから「誰が対象か」というメンバー一覧を作る必要があります。
手順は次の通りです。
- アクション「データ操作」→「Select」を追加
- From:先ほどの「List rows present in a table」の値
- Map:例えば「Email」というプロパティ名に、値として動的コンテンツから「Email」列を指定
これで、Excelの行からEmailだけを抜き出した配列ができます。ただし、このままだと同じメールアドレスが複数含まれます。そこで、式 union() を使って重複を排除します。
- アクション「データ操作」→「Compose(作成)」を追加
- 入力に次のような式を記述
union(body('Select'), body('Select'))
ここでのポイントは、「Select」の出力を2回 union に渡すことで、重複を削除したユニークな配列になる、というテクニックです。
| 処理 | Before | After(Composeの出力) |
|---|---|---|
| Select | [{Email: A}, {Email: A}, {Email: B}] | 同じ |
| union() | 上記のSelect出力を2回渡す | [{Email: A}, {Email: B}] |
これが後続の「メンバーごとのループ」の入力になります。
メンバーごとに処理する:Apply to each(外側ループ)
先ほどの Compose の出力(ユニークなEmail一覧)を元に、「1人ずつ」処理するループを作ります。
- アクション「Apply to each」を追加
- 配列:Compose(union)の出力
このループの中で、
- そのメンバーの未完了タスクを全部メールする処理
- そのメンバーの新規タスクのうち先頭1件だけメールする処理
の2つを実行していきます。
また、Excelは同時書き込みに弱いので、フロー全体の安定性を上げるには、このループの「設定」から
- 同時実行の制御:オン
- 上限:1
として、1ユーザーずつ順番に処理する形にしておくと安全です(全体の処理時間は多少伸びます)。
未完了タスクをメール配信する(タスクごと1通)
まずは「前日までの Undone(未完了)タスクをすべてメールする」処理です。 外側のメンバーループの中に、次のようなアクションを追加します。
Filter arrayで「その人の未完了」だけを抽出
- アクション「データ操作」→「Filter array」を追加
- From:最初に取得した「List rows present in a table」の値
- 条件:
- 1つ目:
item()?['Email']が「現在のメンバーのメール(外側ループの items())」と一致 - 2つ目:
item()?['Status']が'Undone'と一致
- 1つ目:
「現在のメンバーのメール」の参照が動的コンテンツから選べない場合は、式を使って
items('Apply_to_each')?['Email']
のように手入力します(ループ名は実際の名称に合わせてください)。
未完了タスクごとにメール送信
Filter array の出力(該当メンバーのUndoneタスク配列)に対して、内側の「Apply to each」を追加します。
- アクション「Apply to each」を追加
- 配列:Filter array(未完了)の出力
- その中に「Outlook」→「オプション付きのメールを送信(Send email with options)」を追加
「オプション付きメール」の設定例は次の通りです。
- 宛先:外側ループの Email(メンバーのメール)
- 件名:
【未完了タスク】@{items('Apply_to_each_UndoneTasks')['Task']}など - 本文:
- タスク内容
- 担当者名
- 必要なら期日や備考
- ユーザーに提示するオプション:
完了, 未完了(カンマ区切り) - オプションごとの内部値を分けたい場合は、後で式でマッピング
このアクションは、ユーザーがメール内のボタンをクリックするまで待機し、その後 SelectedOption という出力に選択結果を返します。
回答を受け取ってExcelを更新
オプション付きメールの直後に、条件分岐とExcel更新を配置します。
- 「条件(Condition)」アクションを追加
- 条件:
outputs('Send_email_with_options')?['body/SelectedOption']が'完了'と等しい - 「はい」側に、Excelの「行の更新(Update a row)」を配置
Update a row では、次のように設定します。
- 場所・ドキュメントライブラリ・ファイル・テーブル:最初のList rowsと同じ
- キー列:
ID - キー値:内側ループのタスク行から
items('Apply_to_each_UndoneTasks')['ID']を指定 - 更新する列:
- Status:
Doneに上書き - LastSentDate:
utcNow()など(必要に応じて)
- Status:
「未完了」が選ばれた場合は Status を Undone のままにする、あるいは何も更新しない、など運用に合わせて決めてください。
新規タスクを「1日1件だけ」メールする方法
次に、ステータスが空白の「新規タスク」について、その日1件だけ メールする仕組みを作ります。
基本的な流れは、未完了と同じく Filter array で対象を絞り、その配列から 先頭1件だけ取り出すという発想です。
Filter arrayで「その人の新規タスク」を抽出
外側のメンバーループの中で、次のFilter arrayを追加します。
- From:最初の「List rows present in a table」の値
- 条件:
- 1つ目:
item()?['Email']= 現在のメンバーEmail - 2つ目:
item()?['Status']= 空白(「等しい」「値なし」などで設定)
- 1つ目:
この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の出力を元に、未完了タスクと同様の「オプション付きメール」を送信します。
- 「Send email with options」を追加
- 件名や本文で、Composeの出力を式で参照します
列の参照イメージは以下のようになります。
- タスク名:
outputs('Compose_NewTask')['Task'] - ID:
outputs('Compose_NewTask')['ID']
選択肢やExcel更新の処理(StatusをDoneに変える)は、未完了タスクと同じ構造でOKです。
「ループを1件で止めたい」ときのPower Automate的考え方
プログラミング経験がある方ほど、「foreachの途中でbreakしたい」という発想になりがちですが、Power Automateにはループを途中で抜ける構文はありません。
代わりに多くの場合、次の2ステップで解決します。
- 先に Filter array や式を使って「処理対象の配列」を作る
- その配列自体を 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枚のカードにまとめる」「コメントを必須にする」など、自由度の高い設計ができます。
ここまでのフロー構成を簡単におさらい
最後に、今回のフローの最小構成をもう一度コンパクトにまとめます。
- トリガー:繰り返し(毎日◯時)
- Excel:List rows present in a table(StatusがUndoneまたは空白)
- Select(Emailだけ抽出)→ union() でユニークEmail一覧作成
- 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)
- Filter array(その人のStatus=’Undone’)→ Apply to each(未完了)
重要なのは「ループを途中で止める」のではなく、最初から配列を1件に絞り込むというPower Automate特有の発想です。 これに慣れてしまえば、「1日1件 / 人」のような要件も比較的シンプルなフローで実現できるようになります。
まとめ:Excel + Power Automateで現場タスクを半自動化する
本記事で紹介した構成を使うと、次のような状態を実現できます。
- Excelにタスクを追加しておけば、あとは毎日自動で「やることメール」が飛ぶ
- メンバーはメールの「完了 / 未完了」ボタンを押すだけで良い
- ステータス更新は自動でExcelに反映されるため、管理者は表を見るだけで進捗が把握できる
- 未完了は追いかけつつ、新規タスクは1日1件に抑えられるので、通知過多も防げる
Power AutomateとExcelだけでも、ここまでのワークフロー自動化が可能です。 まずは小さなチームや限定的な業務で試しながら、自組織に合った通知頻度やステータス管理ルールを調整していくと、ムリなく「半自動化」へ移行していけるはずです。
慣れてきたら、SharePointリストへの移行やApprovalsの導入、Adaptive CardによるTeams連携など、より高度なパターンにもチャレンジしてみてください。

コメント