土日祝日・年末年始・お盆など会社指定の休みを除いて「前営業日」の売上を自動配信(PowerAutomate×Excel×Outlook/Teams)
毎朝、売上レポートを確認して、Excelを開き、数字をまとめ、関係者へメールやTeamsで共有する。
この作業を手動で行うと、送信遅れ・コピペミス・宛先違いが起きてしまいます。
さらに「土日祝日・年末年始・お盆・臨時休業など、会社指定の休みは配信しない」運用にすると、
1.休み明けに送り忘れる2.休業日に誤って配信する
3.長期の休み明けに「どの日付のレポートを送るべきか」が確認に時間がかかる
といった問題が起きやすくなります。
そこでおすすめなのが、Power Automateのクラウドフローを使って“営業日だけ配信する方法です。
スケジュール実行でフローを動かし、休業日はスキップ、休み明けは自動で「前営業日」を計算して配信します。
こんな方におすすめです
● 毎朝の売上速報を手作業でメール/Teams送信している● 土日祝日・年末年始・お盆など 会社指定の休みは配信しない
● 休み明けは 前営業日 の売上を確実に送りたい
1.営業日だけ配信する全体の流れ
4.よくあるつまずきと対策
※目次をクリックすると、該当の目次へ移動します。
1.営業日だけ配信する全体像の流れ
フローは以下の手順を想定して作成します。
2.今日が休業日ならスキップ(土日+休業日マスタ)
3.前営業日を自動で計算(月曜・連休明けもブレない)
4.Excelから 前営業日の売上データを取得
5.Outlookでメール配信(必要ならTeamsで通知を実施)
6.(任意)ログを保存・失敗した場合は通知する運用を行う
2.事前準備
(1)売上ExcelはSharePoint/OneDriveに置く
クラウドフローで動かすため、売上レポートExcelは SharePoint/OneDrive(Business) に置きます。
(2)EXCELはテーブル化+「日付キー列」を用意する
Power AutomateでExcelから行を取得する定番は 「List rows present in a table」です。
このアクションは「テーブル」が前提なので、集計表はテーブル化します。
さらに、実装を安定させるために 日付比較用の 文字列キー列を用意します。
●テーブル名(例):SalesDailySummary●推奨列(例)
●日付:
DateKey(文字列):yyyy-MM-dd 形式(例:2026-03-31) ●売上:SalesTotal(数値)●
注文数:Orders(数値)●
粗利:GrossProfit(数値)●(必要に応じて)拠点、前年差など
Excelの「日付」列が日付型のままだと、コネクタ側の比較でハマりやすいので、DateKey(文字列)があると一気に安定します。
(3)休業日マスタを作る
会社の休業日(祝日・年末年始・お盆・臨時休業など)を 一元管理するため、SharePointリストを用意します。
●リスト名:休業日マスタ●列(おすすめ)
●
HolidayKey(1行テキスト)… yyyy-MM-dd●
HolidayName(1行テキスト)… 例:祝日/年末年始/お盆/臨時休業 など ●Category(選択)… 祝日/会社休業/その他(任意)「HolidayDate(日付)」列でも作れますが、SharePointの日時判定は環境差で詰まりやすいです。この記事では HolidayKey(文字列)で照合します。
これにより、実装が楽になります。
3.実装手順
営業日判定→前営業日算出→配信
ここからは Power Automate(クラウド) のアクション名で説明します。
画面は新旧デザインで多少違いますが、やることは同じです
Step1.スケジュールトリガー(Recurrence)を設定
トリガー:繰り返し(Recurrence)
・Frequency:Day・Interval:1
・Time zone:
Tokyo Standard Time(日本の時刻で設定する)・At these hours:8
・At these minutes:30
ここでタイムゾーンを正しく設定するのが大事です。
Step2.本日(JST)の日付キーを作る(yyyy-MM-dd)
アクション:作成(Compose)(名前例:NowJST)
convertTimeZone(utcNow(), 'UTC', 'Tokyo Standard Time')
アクション:作成(Compose)(名前例:TodayKey)
formatDateTime(outputs('NowJST'), 'yyyy-MM-dd')
Step3.本日が土日か判定する
アクション:作成(Compose)(名前例:TodayDOW)
dayOfWeek(concat(outputs('TodayKey'), 'T00:00:00+09:00'))
dayOfWeek() はWorkflow式としてPower Automateでも使えます。
(+09:00 を付けてJST基準にするのがポイントです)
条件(Condition)
●左:outputs('TodayDOW')●演算子:is equal to
●右:
0(日曜)OR
●右:
6(土曜)Sunday=0, Saturday=6 の仕様は
dayOfWeekに記載があります。
この条件が Yes(=土日) の場合は、後続処理に進まずスキップします。
Step4.本日が「休業日マスタ」に載っているか判定する
アクション:SharePoint – Get items(項目の取得)
●Site Address:休業日マスタがあるサイト●List Name:
休業日マスタ●Filter Query:
HolidayKey eq '@{outputs('TodayKey')}'
●Top Count:
1(1件見つかれば十分なので軽くします)Filter Queryの書き方(OData)は公式チュートリアルで例が出ています。
条件(Condition:休業日かどうか)
詳細モード(高度なモード)で、次の式にすると分かりやすいです。
Step5.スキップ条件をまとめる(本日が終業日なら終了)
ここまでで「本日が土日」「本日が休業日」の判定ができます。
●土日ならスキップ●休業日マスタに存在するならスキップ
スキップする場合は Terminate(終了) を使い、ステータスは Succeeded にしておくと「正常にスキップ」扱いになります。
Terminate(Succeeded)
●Message:今日は休業日のため配信しません(@{outputs('TodayKey')})
Step6.前営業日(TargetDate)を自動算出する
ここが一番大事です。
休み明け(例:月曜)に「前日=日曜」ではなく、前営業日=金曜を自動で選ぶために、前日からさかのぼって「営業日」を探します。
6-1. 変数を用意
変数を初期化(Initialize variable)
●vCandidate(String)… 前営業日候補(最初は“今日-1日”)
●
vFound(Boolean)… falseaddDays() など日付系関数もWorkflow式として使えます。
6-2. Do until で「営業日が見つかるまで繰り返す」
Do until:vFound is equal to true の中に以下を入れます。
(A) 候補日が土日か判定
Compose:CandidateDOW
dayOfWeek(concat(variables('vCandidate'), 'T00:00:00+09:00'))Condition:土日なら1日戻して continue
もしCandidateDOW が 0 or 6 なら●Set variable vCandidate:
formatDateTime(addDays(concat(variables('vCandidate'), 'T00:00:00+09:00'), -1), 'yyyy-MM-dd')
●(この周回では
vFound は触らず、次のループへ) (B) 候補日が休業日マスタにあるか判定
土日でなければ、休業日マスタを確認します。
SharePoint – Get items(項目の取得)(名前例:Get_items_candidate)
HolidayKey eq '@{variables('vCandidate')}'
●Top Count:1
Condition:休業日なら1日戻して continue
●休業日(length>0)なら●休業日ではないなら
●Set variable vFound = true(これでDo untilが抜けます)
このパターンは「土日」「祝日」「年末年始」「お盆」すべてに対応できます。
(祝日も休業日マスタに登録しておけばOKです)
Step7.Excelから“前営業日”の行だけ取得する
前営業日が vCandidate に確定したら、それが TargetDate です。
7-1. Excelの行を取得(List rows present in a table)
Excel Online (Business) – List rows present in a table
●File:売上レポートExcel●Table:
SalesDailySummary●Filter Query(推奨:DateKeyが文字列の場合):
DateKey eq '@{variables('vCandidate')}'
このアクションは 既定で256行までなので、行数が多いテーブルを対象にする場合はページネーション(Pagination)を検討してください。
7-2. 行が取れなかった場合の分岐(運用上ほぼ必須)
Condition:取得件数が0なら
@equals(length(body('List_rows_present_in_a_table')?['value']), 0)
0件なら、
●管理者へ通知(Teams or メール)●Terminate(FailedでもSucceededでも運用方針で)
「0件=売上がゼロ」なのか「データ未更新」なのかは運用次第なので、まずは通知して止めるがおすすめです。
Step8.メール本文を作る(サマリー+表)
8-1. サマリー(1行だけの想定)
日次集計テーブルが「1日1行」なら、最初の行を取ればOKです。
Compose:row(最初の1行)
first(body('List_rows_present_in_a_table')?['value'])
Compose:SalesTotal
outputs('row')?['SalesTotal']
(Orders/GrossProfitも同様)
8-2. 表(HTMLテーブル)
拠点別など複数行を送る場合は、Create HTML table を使うと楽です。
(必要なら、事前に Select で列名を整える)
Step9.Outlookでメール送信(Send an email (V2))
Office 365 Outlook – Send an email (V2)
●To:配信先(メーリングリスト推奨)●Subject(例):
【売上速報】@{outputs('TodayKey')}(対象:@{variables('vCandidate')})
●Body(HTML):●先頭に「対象日」「サマリー」
●次にHTMLテーブル(必要なら)
●最後に元ファイルのリンク
OutlookコネクタのBodyはHTMLとして扱う項目になっています。
Step10.Teamsにも投稿して見落とし防止
メールを見ない方に、Teamsで「要点+リンク」だけ流す運用でもよいです。
4.よくあるつまずきと対策
ここでは、実際に現場で使いやすい活用例を3つ紹介します。
(1)休業日判定がうまく動かない
●Filter Query+length判定は公式例の形に寄せる
●対策:Excelに DateKey(文字列) を作り、Filter Queryで
eq する●Excelコネクタはフィルター・ページネーション等に制約があるため、仕様に沿って組む
(3)想定時刻に動かない(時刻ズレ)
●対策:Recurrenceの Time zone を明示、必要に応じて
convertTimeZone を使う
5.まとめ&次のステップ
Power Automateを使えば、土日祝日・年末年始・お盆・臨時休業など会社指定の休みを除外しつつ、毎朝の売上レポートを自動配信できます。
ポイントは2つです。
- 今日が休業日ならスキップ(土日+休業日マスタ)
- 前営業日を自動算出(休み明けでも対象日がブレない)
次のステップとして以下の取り組みを考えてみましょう。
●配信ログ(成功/失敗/対象日)をSharePointに残す●失敗時はTeamsでメンション通知
●拠点別・担当別など「見たい切り口」の表を追加して定着させる
次におすすめの記事
Outlookの添付をSharePointへ自動保存する具体手順(応用:フォルダ分け/上書き防止)
Excelのテーブルを使った台帳自動更新(空欄・重複に強い設計)
Forms受付→自動返信→担当通知→進捗管理(問い合わせ対応の型)
6. 次のステップ(研修のご案内)
「この作業も自動化できるかな?」というご相談や、部署全体での内製化に向けた研修も承っています。
