Power AutomateでExcelを自動化:表に行を足す・転記する・集計を送る

公開 書いた人 大林 諒

Power Automate(パワーオートメイト)でExcelを自動にすると、Formsの回答や問い合わせメールを人が転記しなくても表に1行ずつ増え、月初には集計がTeamsに届くようになります。この記事では、社員15名ほどの「サンプル工務店」が SharePoint に置いている売上集計ブックを例に、行の追加・検索・更新・Officeスクリプトでの集計までを作る順に書きます。使うのは Microsoft 365 Business Standard に含まれる Power Automate と、標準コネクタの「Excel Online (Business)」だけです。クラウドフローを1本作ったことがある前提で進めます。

この記事の内容
  1. 先に決めること
  2. Excel Online (Business) コネクタでできること・できないこと
  3. サンプル工務店の売上集計ブック
  4. 手順1:完成見学会の申込をExcelの表に足す
  5. 手順2:行を探して更新する
  6. 手順3:Officeスクリプトで集計して送る
  7. 応用
  8. できないことと、その代わり
  9. よく詰まるところ
  10. 次にやること

先に決めること

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未対応・対応中・契約・見送り最初は「未対応」。あとで更新
Excel for the web で売上集計.xlsxの「反響」シートを開き、テーブル名「反響」と英数字の見出し(ID・Month・Status)が見えるところ
Excel for the web で売上集計.xlsxの「反響」シートを開き、テーブル名「反響」と英数字の見出し(ID・Month・Status)が見えるところ

Month を 2026-10 のような形にすると、Excelが日付に変えてしまうことがあります。202610 のような6桁の数字にしておくと、そのまま月の集計に使えます。

手順1:完成見学会の申込をExcelの表に足す

Microsoft Forms の「完成見学会の申込」に回答があったら、「反響」テーブルに1行足すフローを作ります。Formsとのつなぎ方の細かいところは、Microsoft FormsとPower Automate:回答をExcelやリストにためて担当に知らせる、に書いています。

  1. Power Automate を開き、左の「マイ フロー」を選ぶ
  2. 「新しいフロー」→「自動化したクラウド フロー」を選ぶ
  3. フロー名に「見学会申込を反響表へ」と入れる
  4. トリガーに Microsoft Forms の「新しい応答が送信されたとき」を選び、「作成」を押す
  5. 「フォーム ID」で「完成見学会の申込」を選ぶ
  6. 「+」から Microsoft Forms の「応答の詳細を取得する」を足し、同じフォームを選び、「応答 ID」にトリガーの「応答 ID」を入れる
  7. 「+」から Excel Online (Business) の「テーブルに行を追加する」を足す
  8. 「場所」で「工事案件」サイト、「ドキュメント ライブラリ」で「ドキュメント」を選ぶ
  9. 「ファイル」でフォルダをたどって 売上集計.xlsx を選ぶ
  10. 「テーブル」で「反響」を選ぶ。テーブルの列が入力欄として並ぶ
  11. 各列に値を入れる(下の表)
  12. 右上の「保存」を押し、「テスト」→「手動」で、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つの表で数えられます。

  1. 新しい「自動化したクラウド フロー」を作り、トリガーに Office 365 Outlook の「共有メールボックスに新しいメールが届いたとき (V2)」を選ぶ
  2. 「元のメールボックス アドレス」に info@sample-koumuten.example を入れ、「件名フィルター」にホームページのフォームが付ける件名(例 【お問い合わせ】)を入れる
  3. 「テーブルに行を追加する」を足し、手順1と同じファイルとテーブルを選ぶ
  4. 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. 工事案件リストの「アイテムが作成されたとき」をトリガーにしたフローに、「行を更新する」を足す
  2. 場所・ドキュメント ライブラリ・ファイル・テーブルは手順1と同じものを選ぶ
  3. 「キー列」で ID を選ぶ
  4. 「キー値」に工事案件リストの「反響ID」列(案件登録のときに受付番号を入れる列)を入れる
  5. 「詳細パラメーター」から Status を出し、契約 を入れる。ほかの列は空欄のまま
「行を更新する」でキー列にID、キー値に工事案件リストの反響ID、Statusに「契約」を入れたところ
「行を更新する」でキー列に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」を選ぶ
「テーブルに存在する行を一覧表示する」の詳細パラメーターでフィルター クエリに「Status eq '未対応'」、DateTime 形式にISO 8601を入れたところ
「テーブルに存在する行を一覧表示する」の詳細パラメーターでフィルター クエリに「Status eq ‘未対応’」、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 ライブラリからスクリプトを実行する」を使います。

  1. Excel for the web で 売上集計.xlsx を開き、「自動化」タブ→「新しいスクリプト」を選ぶ
  2. 下のスクリプトを貼り、名前を「反響の月次集計」にして保存する
  3. Power Automate で「スケジュール済みクラウド フロー」を作り、毎月1日の8時に設定する
  4. 「スクリプトの実行」を足し、場所・ドキュメント ライブラリ・ファイルに 売上集計.xlsx、スクリプトに「反響の月次集計」を選ぶ
  5. スクリプトの引数 month に、前月を表す式 formatDateTime(addToTime(convertFromUtc(utcNow(), 'Tokyo Standard Time'), -1, 'Month'), 'yyyyMM') を入れる
  6. Teams の「チャットまたはチャネルでメッセージを投稿する」を足し、本文にスクリプトの「result」を入れる
Excel for the web の「自動化」タブでコード エディターを開き、「反響の月次集計」スクリプトを保存したところ
Excel for the web の「自動化」タブでコード エディターを開き、「反響の月次集計」スクリプトを保存したところ
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 などの名前で書かれている)
Teams の「営業」チームの「一般」チャネルに「202610 の反響は◯件(見学会◯件、ホームページ◯件)」と投稿された結果
Teams の「営業」チームの「一般」チャネルに「202610 の反響は◯件(見学会◯件、ホームページ◯件)」と投稿された結果

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に残す仕事は「人が見る集計」だけになります。

あわせて読む