Office ScriptsをPower Automateから呼ぶと、Excelファイルを手で開かず、時刻や別サービスのイベントをきっかけに処理を動かせます。重要なのはトリガーと対象ファイルを固定することです。
この記事では、Power Automateで「特定のメールが届いたとき」と「毎日決まった時刻」の2種類のフローを作り、Office Scriptを実行するまでの手順を説明します。
先に結論
- Power Automateから動かす前に、Office Script単体を手動で実行し、期待どおりに動くことを確認しておく。
- フローは「トリガー(きっかけ)」→「スクリプトの実行」→「結果の確認」の3段で作る。
- 同じメール・同じ日を二重に処理しないよう、処理済みかどうかの判定をスクリプト側に入れる。
前提条件
- 職場または学校のMicrosoft 365アカウントで、Power AutomateとOffice Scriptsが使えること(契約プランや管理者の設定によっては使えない場合があります)。
- 対象ブックがOneDrive for BusinessまたはSharePointに保存されていること。
- 1回あたりの実行時間や1日あたりの実行回数には上限があります。具体的な値は変わることがあるため、Microsoftの公式ドキュメントで確認してください。
準備:記録用のテーブルとスクリプトを作る
ここでは、届いたメールの情報をExcelの表に1行ずつ記録する例で説明します。
- OneDriveに
メール受信ログ.xlsxを作り、A1〜C1にMessageId、ReceivedAt、Subjectと入力する。 - A1:C1を選び、「挿入」タブ →「テーブル」で表をテーブルにする。「テーブルデザイン」タブでテーブル名を
MailLogに変える。 - 「Automate」タブ →「新しいスクリプト」で、次のスクリプトを作って保存する。
function main(
workbook: ExcelScript.Workbook,
messageId: string,
receivedAt: string,
subject: string
): string {
const table = workbook.getTable("MailLog");
const ids = table
.getColumnByName("MessageId")
.getRangeBetweenHeaderAndTotal()
.getValues();
// 同じメールがすでに記録されていれば何もしない
if (ids.some(row => row[0] === messageId)) {
return "SKIPPED";
}
table.addRow(-1, [messageId, receivedAt, subject]);
return "ADDED";
}
main 関数の workbook 以外の引数(ここでは messageId、receivedAt、subject)は、Power Automateの「スクリプトの実行」アクションで入力欄として表示され、フローから値を渡せます。return で返した値は、後続のアクションで使えます。
手動で動作を確認するときは、引数の代わりに固定の値を入れた版で一度実行し、テーブルに1行追加されること、同じ値でもう一度実行すると追加されないことを確かめてから、引数ありの版に戻すと確実です。
方法1:メールの受信をトリガーにする
- Power Automateで「作成」→「自動化したクラウド フロー」を選ぶ。
- フロー名を入力し、トリガーとしてOffice 365 Outlookの「新しいメールが届いたとき (V3)」を選んで「作成」を押す。
- トリガーの詳細設定で、対象のメールを絞り込む。
- フォルダー:受信トレイ
- 件名フィルター:例
【日次売上】 - 差出人:例 送信元のメールアドレス
- 「+」(または「新しいステップ」)から、Excel Online (Business) の「スクリプトの実行」アクションを追加する。
- 次の項目を選ぶ。
- 場所:OneDrive for Business(またはSharePointサイト)
- ドキュメント ライブラリ:OneDrive
- ファイル:
メール受信ログ.xlsx - スクリプト:準備で作ったスクリプト
- スクリプトの引数の入力欄が表示されるので、動的なコンテンツから次のように割り当てる。
- messageId →「メッセージ ID」
- receivedAt →「受信日時」
- subject →「件名」
- フローを保存し、条件に合うテストメールを自分宛てに送って、テーブルに1行追加されることを確認する。
表示される項目名は、画面のバージョンによって多少異なる場合があります。
方法2:毎日決まった時刻をトリガーにする
- 「作成」→「スケジュール済みクラウド フロー」を選ぶ。
- フロー名、開始日時、繰り返し間隔(例:1日ごと)を設定して「作成」を押す。
- 「繰り返し」トリガーを開き、タイムゾーンに「(UTC+09:00) 大阪、札幌、東京」、設定時刻(時)に
8を指定する。 - 「スクリプトの実行」アクションを追加し、方法1と同じ手順で対象ファイルとスクリプトを指定する。
- 処理対象の日付をスクリプトに渡す場合は、引数の欄に次の式を入れる(日本時間の前日を
2026-09-27の形式で渡す例です)。
formatDateTime(addDays(convertFromUtc(utcNow(), 'Tokyo Standard Time'), -1), 'yyyy-MM-dd')
スクリプト側では、受け取った日付がすでに処理済みの一覧にあれば何もせずに終了する、という判定を入れます。考え方はメールの例の MessageId と同じです。
結果を確認できるようにする
- スクリプトが返した値(
ADDED/SKIPPED)を、後続のアクションでメールやTeamsへの通知に使う。 - 失敗したときに気づけるよう、通知用のアクションを追加し、そのアクションの「実行条件の構成」で「失敗した」「タイムアウトした」を選ぶ(表記は画面によって異なります)。
- フローの実行履歴を開き、どのステップで止まったかを確認できることを確かめる。
- 失敗後にフローを再実行しても、同じメール・同じ日が二重に記録されないことを確認する。
実務での確認チェック
- [ ] トリガーが想定外のメールや時刻で動かないか
- [ ] フローを作成したアカウントに対象ファイルへのアクセス権があるか
- [ ] 同じブックに対して複数のフローが同時に動かないか
- [ ] 途中で失敗した後に再実行しても問題ないか
- [ ] 処理済みかどうかの判定が効いているか
具体例
「毎朝8時に前日分を集計」のような定期処理は時刻トリガーの候補ですが、同じ日を二度処理しないよう、処理対象の日付を識別子として持たせる必要があります。「件名に【日次売上】を含むメールが届いたら記録する」場合も同じで、メッセージIDで同じメールを二度記録しないようにします。
よくある失敗
- トリガー条件を絞らない:すべての受信メールでフローが動き、実行回数の上限にすぐ達したり、不要な行が大量に追加されたりします。
- ファイルを移動・名前変更する:フローで指定したファイルが見つからなくなり、失敗します。
- 開いているシートに依存したスクリプトを使う:Power Automateから実行するときは、どのシートが開いている状態かを前提にできません。シートやテーブルは名前で指定しておきます。
- 人が編集中のブックに対して実行する:編集内容と競合する可能性があります。記録専用のブックを分けておくと安全です。
このページでは扱わないこと
- Office Scriptの作り方そのもの(「ExcelのアクションレコーダーでOffice Scriptを作る方法」の記事を参照してください)
- メールの添付ファイルの中身をExcelに取り込む処理
関連ページ
- ExcelのアクションレコーダーでOffice Scriptを作る方法
- Excel・CSVの記事一覧
参考
- Microsoft Learn:Power AutomateでOffice Scriptsを実行する(Run Office Scripts with Power Automate)
確認日: 2026-09-28
