Power Automate(パワーオートメイト)でExcelを自動にすると、Formsの回答や問い合わせメールを人が転記しなくても表に1行ずつ増え、月初には集計がTeamsに届くようになります。この記事では、社員15名ほどの「サンプル工務店」が SharePoint に置いている売上集計ブックを例に、行の追加・検索・更新・Officeスクリプトでの集計までを作る順に書きます。使うのは Microsoft 365 Business Standard に含まれる Power Automate と、標準コネクタの「Excel Online (Business)」だけです。クラウドフローを1本作ったことがある前提で進めます。
この記事の内容
先に決めること
Excelの自動化は、作り始めてから「テーブルになっていない」「誰かが開いていて書けない」で止まりがちです。次の4つを先に決めておくと、作り直しが減ります。
ファイルを置く場所
クラウドフローから触れるのは、OneDrive for Business か SharePoint のドキュメント ライブラリに置いたファイルだけです。社内のファイルサーバーや個人のパソコンのデスクトップにあるExcelは、クラウドフローからは見えません。
個人の OneDrive に置くと、その人が退職してアカウントが消えたときにファイルごと見えなくなります。会社の集計表は SharePoint のサイト(サンプル工務店なら「工事案件」サイトの「集計」フォルダ)に置くのが基本です。
表を「テーブル」にする
Excel Online (Business) コネクタの行の操作は、Excelの「テーブル」(挿入タブの「テーブル」で作るもの)が対象です。見た目が表になっているだけのセル範囲は、ドロップダウンに出てきません。最初にテーブルに変換し、名前を付けておきます。テーブル名は「テーブル1」のままにせず、「反響」「契約一覧」のように中身が分かる名前にします。
列の見出しの付け方
フィルター クエリ・並べ替え・列の選択で使える列名は、英数字の列名だけと公式に書かれています。日本語の見出しの列はフィルター クエリで絞り込めません。絞り込みに使う列(状態・受付番号など)だけは Status ID のように英数字の見出しにしておきます。数字だけの見出し(2026 など)は行の更新・削除がおかしくなることがあるとされているので、文字を混ぜます。
誰の接続で動かすか
フローの中のExcelのアクションは、作った人の接続(サインインしたアカウント)で動きます。接続した人がそのファイルに書き込める権限を持っていないと 403 で失敗します。会社のフローは、退職しにくい共通の管理用アカウントか、少なくとも総務の担当者の接続で作り、個人の営業担当の接続にしないようにします。
Excel Online (Business) コネクタでできること・できないこと
アクションの名前は今の日本語画面の表示です。
| やりたいこと | アクション | 使えるか・注意 |
|---|---|---|
| 表に1行足す | 「テーブルに行を追加する」 | テーブル必須。古い「[非推奨]」の方は使わない |
| 表の行をまとめて読む | 「テーブルに存在する行を一覧表示する」 | 既定で256行まで。全部読むには改ページをオン |
| 1行だけ探して読む | 「行を取得する」 | キー列とキー値で探す |
| 1行を書き換える | 「行を更新する」 | 空欄にした列は更新されない。一致が複数なら最初の1行だけ |
| 1行を消す | 「行を削除する」 | 一致が複数なら最初の1行だけ |
| 表を新しく作る | 「テーブルの作成」 | A1形式の範囲で指定 |
| シートを足す | 「ワークシートを作成する」 | シート名を指定 |
| 集計・書式・並べ替え | 「スクリプトの実行」 | Officeスクリプト。1日1,600回・10秒に3回まで |
| セルを1つだけ書く | なし | テーブルの行単位でしか書けない。セル指定はOfficeスクリプトで |
| ピボットテーブルを触る | なし | 公式に非対応 |
| マクロ(VBA)を動かす | なし | .xlsm にスクリプトは実行できるがVBAは動かない。VBAはデスクトップフローで |
コネクタの上限も先に見ておきます(2026年10月時点の公式の記載)。
| 項目 | 上限 |
|---|---|
| 扱えるファイルの大きさ | 25 MB |
| 1回の要求の大きさ | 5 MB |
| 一覧表示で返る行 | 既定256行(改ページで増やす) |
| 一覧表示で返る列 | 既定で最初の500列 |
| 接続ごとの呼び出し | 60秒に100回 |
| 最後に使ってからのロック | 最大6分 |
| 書き込みが反映されるまで | 最大30秒の遅れ |
| ファイル形式 | .xlsx と .xlsb(スクリプトの実行は .xlsm も可) |
サンプル工務店の売上集計ブック
例にするのは、SharePoint の「工事案件」サイトに置いた 売上集計.xlsx です。月次の売上集計の元になる「反響」(問い合わせと見学会の申込)を1行ずつためるテーブルを1つ作ります。
| 列の見出し | 中身 | 入れ方 |
|---|---|---|
ID | 受付番号(例 KG-20261031153012) | フローで作る。キー列にする |
| 受付日時 | 受け付けた日時 | フローで日本時間に直して入れる |
Month | 受付月(例 202610) | フローで入れる。集計用 |
| 経路 | 見学会・ホームページ・電話 | フローまたは手入力 |
| 氏名 | お客さまの名前 | 回答・メールから |
| 連絡先 | 電話かメール | 回答・メールから |
| 内容 | 要望・本文の先頭 | 回答・メールから |
| 担当 | 営業A・営業B など | 事務が手で入れる |
Status | 未対応・対応中・契約・見送り | 最初は「未対応」。あとで更新 |

Month を 2026-10 のような形にすると、Excelが日付に変えてしまうことがあります。202610 のような6桁の数字にしておくと、そのまま月の集計に使えます。
手順1:完成見学会の申込をExcelの表に足す
Microsoft Forms の「完成見学会の申込」に回答があったら、「反響」テーブルに1行足すフローを作ります。Formsとのつなぎ方の細かいところは、Microsoft FormsとPower Automate:回答をExcelやリストにためて担当に知らせる、に書いています。
- Power Automate を開き、左の「マイ フロー」を選ぶ
- 「新しいフロー」→「自動化したクラウド フロー」を選ぶ
- フロー名に「見学会申込を反響表へ」と入れる
- トリガーに Microsoft Forms の「新しい応答が送信されたとき」を選び、「作成」を押す
- 「フォーム ID」で「完成見学会の申込」を選ぶ
- 「+」から Microsoft Forms の「応答の詳細を取得する」を足し、同じフォームを選び、「応答 ID」にトリガーの「応答 ID」を入れる
- 「+」から Excel Online (Business) の「テーブルに行を追加する」を足す
- 「場所」で「工事案件」サイト、「ドキュメント ライブラリ」で「ドキュメント」を選ぶ
- 「ファイル」でフォルダをたどって
売上集計.xlsxを選ぶ - 「テーブル」で「反響」を選ぶ。テーブルの列が入力欄として並ぶ
- 各列に値を入れる(下の表)
- 右上の「保存」を押し、「テスト」→「手動」で、Formsから試しに1件回答して確かめる

11で入れる値は次のとおりです。式は入力欄で「fx」(式の挿入)を押して書きます。
| 列 | 入れる値 |
|---|---|
ID | 式 concat('KG-', convertFromUtc(utcNow(), 'Tokyo Standard Time', 'yyyyMMddHHmmss')) |
| 受付日時 | 式 convertFromUtc(utcNow(), 'Tokyo Standard Time', 'yyyy/MM/dd HH:mm') |
Month | 式 convertFromUtc(utcNow(), 'Tokyo Standard Time', 'yyyyMM') |
| 経路 | 固定の文字 見学会 |
| 氏名・連絡先・内容 | 「応答の詳細を取得する」の各質問 |
Status | 固定の文字 未対応 |
utcNow() は世界標準時を返すので、そのまま入れると9時間ずれます。日本時間に直す convertFromUtc はよく使うので、Power Automateの式と変数:日付・文字列・配列をよく使う関数で扱う、で他の書き方と一緒にまとめています。
「担当」のように手で入れる列は空欄のままにします。空欄の列は追加のときに空で入ります。

問い合わせメールも同じ表に足す
ホームページの問い合わせは、共有メールボックス info@sample-koumuten.example にメールで届きます。これも同じ「反響」テーブルに足すと、見学会と問い合わせの件数を1つの表で数えられます。
- 新しい「自動化したクラウド フロー」を作り、トリガーに Office 365 Outlook の「共有メールボックスに新しいメールが届いたとき (V2)」を選ぶ
- 「元のメールボックス アドレス」に
info@sample-koumuten.exampleを入れ、「件名フィルター」にホームページのフォームが付ける件名(例【お問い合わせ】)を入れる - 「テーブルに行を追加する」を足し、手順1と同じファイルとテーブルを選ぶ
IDはHP-で始め、経路はホームページ、内容は本文の先頭200字を入れる
本文の先頭を切り出す式は次のとおりです。メール本文はHTMLのことがあるので、先に「HTML からテキスト」アクションで文字だけにしてから切ります。
substring(body('HTML_からテキスト'), 0, min(200, length(body('HTML_からテキスト'))))
min を挟まずに substring(..., 0, 200) と書くと、本文が200字より短いメールで失敗します。共有メールボックスのトリガーやメールの振り分けは、Power AutomateでOutlookのメールを自動化:添付の保存・振り分け・定型メールの送信、で詳しく書いています。
手順2:行を探して更新する
事務が「反響」に担当を入れ、営業が契約になったら状態を「契約」にする。この更新も、SharePoint の工事案件リストに案件ができたタイミングでフローに任せられます。
キー列で1行を更新する
「行を更新する」は、キー列とキー値で行を探して書き換えます。
- 工事案件リストの「アイテムが作成されたとき」をトリガーにしたフローに、「行を更新する」を足す
- 場所・ドキュメント ライブラリ・ファイル・テーブルは手順1と同じものを選ぶ
- 「キー列」で
IDを選ぶ - 「キー値」に工事案件リストの「反響ID」列(案件登録のときに受付番号を入れる列)を入れる
- 「詳細パラメーター」から
Statusを出し、契約を入れる。ほかの列は空欄のまま

空欄にした列は更新されないので、担当や氏名が消える心配はありません。逆に、セルを空にしたいときはこのアクションでは空にできません。空にしたい列には - のような印を入れる運用にするか、Officeスクリプトで消します。
キー列で気をつけることが3つあります。キー値は大文字と小文字を区別します。同じキー値の行が2行あると、最初の1行だけが更新されます。キー列の値は重複しない作り方(手順1の日時入りの ID)にしておきます。
一覧表示とODataのフィルター
「未対応のまま残っている反響を毎朝Teamsに出す」のように、条件に合う行をまとめて読むときは「テーブルに存在する行を一覧表示する」を使い、「フィルター クエリ」に OData の書き方で条件を入れます。
Status eq '未対応'
使える関数は eq(等しい)・ne(等しくない)・contains(含む)・startswith(で始まる)・endswith(で終わる)です。1つの列に使える関数は1つ、並べ替えに使える列も1つと公式に書かれています。
startswith(ID, 'HP')
contains(Status, '対応')
このアクションで注意する点は次のとおりです。
| 気をつけること | 対処 |
|---|---|
| 既定で256行しか返らない | アクションの「設定」で「改ページ」をオンにし、しきい値に行数の上限(例 5000)を入れる |
| 日本語の列名ではフィルターできない | 絞り込む列だけ英数字の見出しにする。無理なら全件読んで「アレイのフィルター処理」で絞る |
| 非表示の列がある表ではODataが使えない | テーブルの中の列を非表示にしない |
| フィルターを使うと少し古いデータが返ることがある | 書いた直後に読み直すフローは、間に「待ち」を入れる |
日付がシリアル値(46326 など)で返る | 「DateTime 形式」で「ISO 8601」を選ぶ |

日付をシリアル値のまま受け取ってしまったときは、次の式で日付に直せます(時刻を含まない日付の列だけ)。
addDays('1899-12-30', int(item()?['受付日']), 'yyyy/MM/dd')
一覧表示の結果は配列なので、1行ずつ処理するときは「それぞれに適用する」(Apply to each)の中で扱います。件数だけ欲しいときはループを回さず、式 length(body('テーブルに存在する行を一覧表示する')?['value']) で数えます。
手順3:Officeスクリプトで集計して送る
毎月1日の朝に、前月の反響を経路ごとに数えて Teams の「営業」チャネルに送ります。行を1件ずつループで数えることもできますが、Excelの中で計算させた方が速く、呼び出しの回数も1回で済みます。そこで使うのが Officeスクリプトです。
Officeスクリプトは、Excel for the web の「自動化」タブで書く TypeScript の小さなプログラムです。Power Automate からは「スクリプトの実行」アクションで呼びます。スクリプトの保存先が自分の OneDrive の既定の場所なら「スクリプトの実行」、SharePoint のライブラリに置いたスクリプトなら「SharePoint ライブラリからスクリプトを実行する」を使います。
- Excel for the web で
売上集計.xlsxを開き、「自動化」タブ→「新しいスクリプト」を選ぶ - 下のスクリプトを貼り、名前を「反響の月次集計」にして保存する
- Power Automate で「スケジュール済みクラウド フロー」を作り、毎月1日の8時に設定する
- 「スクリプトの実行」を足し、場所・ドキュメント ライブラリ・ファイルに
売上集計.xlsx、スクリプトに「反響の月次集計」を選ぶ - スクリプトの引数
monthに、前月を表す式formatDateTime(addToTime(convertFromUtc(utcNow(), 'Tokyo Standard Time'), -1, 'Month'), 'yyyyMM')を入れる - Teams の「チャットまたはチャネルでメッセージを投稿する」を足し、本文にスクリプトの「result」を入れる

function main(workbook: ExcelScript.Workbook, month: string): string {
const table = workbook.getTable("反響");
const headers = table.getHeaderRowRange().getValues()[0] as string[];
const rows = table.getRangeBetweenHeaderAndTotal().getValues();
const iMonth = headers.indexOf("Month");
const iRoute = headers.indexOf("経路");
const iStatus = headers.indexOf("Status");
const counts: { [route: string]: number } = {};
let total = 0;
let contracts = 0;
rows.forEach((r) => {
if (String(r[iMonth]) !== month) return;
const route = String(r[iRoute]);
counts[route] = (counts[route] || 0) + 1;
total++;
if (String(r[iStatus]) === "契約") contracts++;
});
let sheet = workbook.getWorksheet("集計");
if (!sheet) {
sheet = workbook.addWorksheet("集計");
}
sheet.getRange("A:B").clear();
sheet.getRange("A1:B1").setValues([["経路", month + " 件数"]]);
const lines: (string | number)[][] = Object.keys(counts).map((k) => [k, counts[k]]);
if (lines.length > 0) {
sheet.getRangeByIndexes(1, 0, lines.length, 2).setValues(lines);
}
const detail = Object.keys(counts).map((k) => k + " " + counts[k] + "件").join("、");
return month + " の反響は " + total + "件(" + detail + ")。うち契約 " + contracts + "件";
}
Power Automate から動かすスクリプトには、公式に次の制限があります(2026年10月時点)。
| 制限 | 内容 |
|---|---|
| 実行時間 | 120秒でタイムアウト |
| 呼び出し回数 | 1人1日1,600回(日本時間の朝9時にリセット)、10秒に3回まで |
| データの大きさ | 要求と応答は5 MB、範囲は500万セルまで |
| 引数の大きさ | 最大30,000,000バイト |
| 外部への通信 | fetch は失敗する。外のサービスはフロー側の HTTP などで |
| 使えるライセンス | Microsoft 365 のビジネス向けライセンス(公式の一覧は Office 365 Business・Business Premium・E3 などの名前で書かれている) |

Formsの回答はすべて文字として渡ってくるので、スクリプトの引数は string で受けるのが安全です。数として使うときはスクリプトの中で Number() で直します。
応用
同じ形で、サンプル工務店では次のようなフローを足しています。
- 現場日報の集計:現場監督がFormsで送る日報を「現場日報の集計」ブックのテーブルに足し、週末にOfficeスクリプトで現場ごとの作業時間を出してメールで送る
- 契約一覧への転記:工事案件リストで状態が「契約」になったら、売上集計の「契約一覧」テーブルに金額と引渡予定月を転記する
- 未対応の反響の催促:毎朝9時に
Status eq '未対応'の行を読み、受付から2日以上たった行だけ「アレイのフィルター処理」で残し、担当にTeamsで知らせる - 表のバックアップ:毎月末に SharePoint の「ファイルのコピー」でブックを
売上集計_202610.xlsxの名前で保存し、翌月はまっさらな状態から始める
集計結果を表にしてメールで送りたいときは、一覧表示の結果を「選択」で列を絞り、「HTML テーブルの作成」で表にしてメール本文に入れると、Excelを開かなくても読めるメールになります。
できないことと、その代わり
Excel Online (Business) コネクタは、共有のExcelを「みんなで手でも触る台帳」として使うと失敗が増えます。次の場面は別の手に切り替えます。
同時に開いている・手でも書く
公式の既知の問題に、複数のところ(デスクトップのExcel・Excel for the web・Power Automate・Power Apps)から同じファイルに同時に書き込まないこと、と書かれています。コネクタは最後に使ってから最大6分ファイルをロックすることがあり、その間は人が保存できなかったり、フローが失敗したりします。読み取り専用のモードで開かれていると 502 が返ります。
本番のフローで実際に起きるのは、「事務が月末に集計表を開いたまま帰り、夜の転記がまとめて失敗していた」という形です。フローが書く表と人が見る表は、ブックを分けるのが確実です。人は集計シートだけ見て、フローが書くテーブルには手を触れないルールにします。
大きい表・重い数式
25 MB を超えるファイルは扱えません。行が増えて数式の再計算が重くなると、コネクタがタイムアウトし、再試行で同じ行が2回入ることがあると公式に書かれています。数式を減らす、計算方法を「手動」にする、年ごとにブックを分ける、が対処です。
SharePoint リストへ移す判断
次のどれかに当てはまったら、Excelのテーブルをやめて SharePoint リストに移す時期です。
| 当てはまること | リストにすると |
|---|---|
| 2人以上が同じ表に同時に書く | 1行ずつ保存されるのでぶつからない |
| 行が数千行を超えて増え続ける | 1リスト最大3,000万アイテム。一覧の見せ方はビューで絞る |
| 誰がいつ書き換えたか残したい | バージョン履歴が行ごとに残る |
| 選択肢・担当者を決まった値で入れさせたい | 選択肢列・ユーザー列で入力を揃えられる |
| Power Apps の入力画面を作りたい | リストをそのまま元にできる |
リストにはビューのしきい値(5,000件)があり、作り方と移し方にも判断がいります。SharePointリストとは:作り方と、Excelの台帳をリストに移す判断、で詳しく書いています。集計はリストのデータをExcelの「エクスポート」で読み込むか、Power Automate で月1回Excelに書き出す形にすれば、慣れたExcelの集計表はそのまま使えます。
デスクトップのExcelとの使い分け
パソコンの中のExcelファイル、VBAのマクロ、ピボットテーブル、印刷の設定のように、クラウドのコネクタでは届かない操作は、Power Automate for desktop(Power Automate Desktop)のデスクトップフローで動かします。デスクトップフローには「Excel の起動」「Excel ワークシートから読み取る」「Excel ワークシートに書き込む」「Excel マクロの実行」「Excel を閉じる」などのアクションがあり、人がExcelを操作するのと同じことができます。
| 比べること | クラウドフロー(Excel Online (Business)) | デスクトップフロー(Excel アクション) |
|---|---|---|
| 置き場所 | OneDrive・SharePoint | パソコンの中・ファイルサーバー |
| 動く場所 | クラウド。パソコンの電源は不要 | Excelが入ったWindowsパソコン |
| 単位 | テーブルの行 | セル・範囲・シート |
| マクロ(VBA) | 動かない | 「Excel マクロの実行」で動く |
| ピボット・印刷 | できない | できる |
| ライセンス | Microsoft 365 に含まれる範囲 | 手動で動かすなら無料の範囲、クラウドから動かすならPremium |
デスクトップフローで OneDrive や SharePoint と同期しているフォルダのExcelを開くと、「ファイルが見つからない」で失敗することがあると公式に書かれています。同期フォルダのファイルは一度ローカルにコピーして操作し、終わってから戻します。デスクトップ側の作り方は、Power Automate DesktopでExcel操作:転記と集計を自動にする、で書いています。
よく詰まるところ
| 症状 | 原因 | 直し方 |
|---|---|---|
| 「テーブル」のドロップダウンに何も出ない | 表がテーブルになっていない | Excelで「挿入」→「テーブル」で変換し、名前を付ける |
| ファイルがピッカーに見つからない | 1フォルダに200個を超えるファイルがある | ピッカーは1フォルダ200個までしか出ない。フォルダを分けるかパスを直接入れる |
403 で失敗する | 接続したアカウントにファイルの書き込み権限がない | 接続した人をサイトのメンバーにするか、接続を作り直す |
502 で失敗する | ファイルが読み取り専用のモードになっている | 読み取り専用を外す。ISO 厳密な形式のブックは標準の形式で保存し直す |
| 夜だけまとめて失敗する | 誰かが開いたままにしてロックされている | フローが書くブックと人が見るブックを分ける |
| 一覧が256行で切れる | 改ページがオフ | アクションの「設定」で改ページをオンにし、しきい値を入れる |
| フィルター クエリでエラーになる | 日本語の列名を使っている/非表示の列がある | 英数字の見出しにする/列を表示に戻す |
| 同じ行が2回入る | 再計算が重くてタイムアウトし、再試行された | 数式を減らす。追加の前に ID で「行を取得する」して重複を確かめる |
| 更新したのに別の行が変わった | キー値が重複していて最初の1行が更新された | キー列の値を一意にする |
日付が 46326 のような数字になる | Excelの日付はシリアル値で返る | 「DateTime 形式」を「ISO 8601」にする |
| 受付日時が9時間ずれる | utcNow() をそのまま入れている | convertFromUtc で日本時間に直す |
429 で止まる | 短い時間に呼びすぎ(接続ごとに60秒100回) | ループの同時実行を下げ、間に「待ち」を入れる |
| スクリプトが120秒で止まる | 1回の処理が重い | 範囲を分けて複数回に分ける。不要な読み書きを減らす |
スクリプトで fetch が定義されていないと出る | フローから動くスクリプトは外へ通信できない | 外の取得はフローの HTTP などで行い、結果を引数で渡す |
| 書いた直後に読むと古い値が返る | 書き込みの反映に最大30秒かかる | 書いてから読むまでに「待ち」を入れる |

次にやること
Excelの表がフローで育ちはじめたら、次はデータの置き場所と入口を整えます。
- SharePointリストとは:作り方と、Excelの台帳をリストに移す判断
- Microsoft FormsとPower Automate:回答をExcelやリストにためて担当に知らせる
- Power Automate DesktopでExcel操作:転記と集計を自動にする
- Power Automateの式と変数:日付・文字列・配列をよく使う関数で扱う
同時に書く人が増えてきたら SharePoint リストへ、パソコンの中のExcelやマクロが残っているならデスクトップフローへ、と切り分けると、Excelに残す仕事は「人が見る集計」だけになります。