Excel × Power Automate × Office Scriptsで経費申請フローを自動化する方法【Teams通知つき】

    
\ この記事を共有 /
Excel × Power Automate × Office Scri...

企業の経理や管理部門では、社員からの経費申請をメールと Excel でやりとりすることが多く、確認漏れ・記入ミス・手動集計の手間が大きな課題になりがちです。Microsoft 365 には Excel OnlinePower AutomateOffice Scripts といった自動化ツールが揃っており、これらを組み合わせれば「申請 → 承認 → 自動集計 → Teamsへの通知」までをほぼノーコードで実現できます。本記事では、2025 年時点での最新仕様も踏まえつつ、経費申請フローを効率化する手順・拡張例・運用のポイントを詳しく紹介します。

全体の流れと要件

自動化された経費申請フローの概略は次のとおりです。

  1. 申請者が Excel Online の「申請」シートに経費情報を入力・保存。
  2. Power Automate が「テーブル内の行が追加・変更された」ことをトリガーとして起動し、承認者に通知。
  3. 承認者は Teams またはメール上で「承認」または「却下」ボタンを押して対応。回答内容は Excel に書き戻されます。
  4. 「承認」と判断された行は Office Scripts によって「集計」シートに転記され、ステータスを「完了」に更新。
  5. Teams に完了通知が投稿され、申請者や経理チームが状況をリアルタイムに把握できます。

このフローを構築するには以下の前提条件が必要です。

  • Microsoft 365 のビジネスプラン:Office Scripts と Power Automate の統合はビジネスライセンスでのみ利用できます。E3/E5 等のプランでは Power Automate 連携が直接利用可能です。
  • OneDrive for Business または SharePoint Online:Excel ファイルをクラウドに保存し、Power Automate や Teams からアクセスできるようにします。
  • Teams:承認や通知を効率化するため、Teams への投稿や Approvals アプリを使用します。

フォルダーと Excel ファイルの準備

フォルダー構成

  1. OneDrive または SharePoint に「経費申請」というフォルダーを作成します。
  2. フォルダー内に expense_request.xlsx という名前で Excel ファイルを作成し、ブラウザーで開きます(デスクトップ版ではなく Excel Online を使用)。
  3. 誰が閲覧・編集できるかを事前に検討し、フォルダーやファイルのアクセス権を適切に設定します。例えば、申請者には「編集」、一般社員は「閲覧のみ」、承認者と経理担当は「編集」といった区分が安全です。

申請シートの設計

Excel Online で「申請」シートを作り、以下のように列を構成します。データを テーブル化 することが重要です。範囲を選択した状態で Ctrl+T(Mac は Command+T)を押し、「先頭行を見出しとして使用する」にチェックを入れてテーブルを作成します。テーブル化することで、Power Automate のトリガーや「行の更新」アクションが正しく機能します。

見出し説明入力例
A申請ID申請を一意に識別する文字列。手動入力でも良いが、後述するフローで自動採番も可能です。REQ-2025-0001
B申請日時申請が入力された日時を記録。Excel の NOW() 関数で自動入力するか、Power Automate で付与します。2025/08/25 10:30
C申請者申請者のメールアドレスまたは氏名。Teams との連携を考慮してメールアドレスが便利です。yamada@example.com
D用途旅行交通費・会議費・備品購入など用途の説明。出張交通費
E金額税込金額。数値形式で入力します。4800
F添付URL領収書などの証憑を保存した SharePoint/OneDrive のリンク。https://...
G承認ステータス「未申請」「審査中」「承認」「否認」「完了」などのステータス。データの入力規則でリスト選択できるようにします。未申請
H承認者コメント承認者の氏名やコメントを記録。承認アクションで取得したコメントを格納します。OK
Iカテゴリー(任意)交通費・宿泊費・消耗品などの種別。会計ソフトとの連携を想定する場合に追加します。交通費

ステータス列(G列)は データの入力規則 を使用してリスト化しましょう。Excel のリボン「データ」→「データの入力規則」→「リスト」を選択し、「未申請,審査中,承認,否認,完了」と設定します。選択肢を固定することでタイプミスを防げます。

集計シートの設計

同じブックに「集計」シートを追加し、次の列を用意します。こちらもテーブルにしておくと後続処理が楽になります。

  • 申請ID
  • 申請日時
  • 申請者
  • 用途
  • 金額
  • 添付URL
  • 承認者(コメント)
  • 承認日時

将来的に部門・カテゴリー・原価センターなどを追加する場合はここに列を追加してください。

Office Scripts を使って転記・ステータス更新を自動化

Excel Online には Office Scripts という TypeScript ベースの自動化機能があります。Power Automate から呼び出すことで、条件に合った行だけを転記したり列を更新したりできます。ここでは「承認」ステータスの行を集計シートに転記し、元のシートのステータスを「完了」に変えるスクリプトを作成します。

スクリプト作成手順

  1. Excel Online の「申請」ブックを開き、リボンの 自動化 タブ → 新しいスクリプト をクリックします。コードエディターが表示されるので次のコードを貼り付け、expense_flow.ts という名前で保存します。
// ファイル: expense_flow.ts
function main(workbook: ExcelScript.Workbook) {
  const reqSheet = workbook.getWorksheet("申請");
  const sumSheet = workbook.getWorksheet("集計");

  // テーブルを取得(テーブル名を「申請Table」「集計Table」等に変更している場合は適宜修正)
  const reqTable = reqSheet.getTables()[0];
  const sumTable = sumSheet.getTables()[0];

  // 申請テーブルのデータを取得(ヘッダーを除く)
  const reqData = reqTable.getRangeBetweenHeaderAndTotal().getValues();
  const reqRowCount = reqData.length;

  for (let i = 0; i < reqRowCount; i++) {
    const row = reqData[i];
    const status = row[6] as string; // G列(承認ステータス)
    const requestId = row[0] as string; // A列(申請ID)

    // 承認済みの行だけ処理
    if (status === "承認") {
      // 既に集計シートに存在するか確認(重複転記を防ぐ)
      const sumData = sumTable.getRangeBetweenHeaderAndTotal().getValues();
      const exists = sumData.some(record => record[0] === requestId);
      if (exists) {
        // 既に転記済みならステータスだけ「完了」に更新
        reqTable.getRangeBetweenHeaderAndTotal().getCell(i, 6).setValue("完了");
        continue;
      }

      // 転記データを作成
      const rowValues = [
        row[0],            // 申請ID
        row[1],            // 申請日時
        row[2],            // 申請者
        row[3],            // 用途
        row[4],            // 金額
        row[5],            // 添付URL
        row[7],            // 承認者コメント(承認者名)
        new Date().toLocaleString() // 承認日時。必要に応じて new Date().toISOString() に変更
      ];

      // 集計シートの末尾に追加
      sumTable.addRow(-1, rowValues);

      // 元の行のステータスを「完了」に更新
      reqTable.getRangeBetweenHeaderAndTotal().getCell(i, 6).setValue("完了");
    }
  }
}

スクリプトのポイント

  • 絶対参照を使うgetActiveWorksheet()getSelectedRange() などユーザーの状態に依存する API は Power Automate から実行するとエラーになることがあります。ワークシート名やテーブル名は明示的に指定しましょう。
  • テーブル API を使用:テーブルに対して getTables()[0] で取得することで、行の追加やデータの取得が簡潔になります。テーブル名を変えている場合は getTable('申請Table') のように指定できます。
  • 重複チェック:集計シートに同じ申請IDが既に存在するかを some() メソッドで判定し、二重転記を防ぎます。
  • 日時の扱いnew Date().toLocaleString() は利用者のタイムゾーンに依存します。一方 toISOString() は UTC 基準で記録されます。Power Automate は内部的に UTC を使用するため、Excel で正確な日時が必要な場合は convertTimeZone アクションで変換することも検討してください。

このスクリプトを保存すると、Power Automate から Run script アクションを使って呼び出せるようになります。

Power Automate で承認フローを構築

続いて、申請データに変更があったときに自動で通知・承認・転記処理を行うフローを作成します。以下では Teams を使った承認と完了通知を例としますが、メール承認や Adaptive Card を利用した対話型承認などへの応用も可能です。

フローの作成手順

1. トリガーの設定

  1. Power Automate ポータル にアクセスし、新しいクラウド フロー自動化されたクラウドフロー を選択します。
  2. フロー名を入力し、トリガーとして Excel Online (Business) – テーブル内の行が作成または変更されたとき を選びます。トリガーは「ファイルが変更されたとき」よりもテーブルレベルのほうがピンポイントで変更行を取得できます。
  3. 「ロケーション」「ドキュメント ライブラリ」「ファイル」「テーブル名」を設定します。ファイルブラウザー(Show Picker)を使って選択することが推奨されます。手動でパスを入力すると誤って文字列が違っていた場合にエラーの原因になります。
  4. 高度な設定で フィルター条件列の選択 を指定すると不要な情報の読み込みを抑えられますが、初めはデフォルトで構いません。

2. 申請内容の取得と条件分岐

  1. トリガーから取得できる動的コンテンツとして、テーブル内の各列の値(申請ID、申請日時など)が利用できます。
  2. 次に 条件 (Condition) アクションを追加し、「承認ステータス (G列) が 審査中 であるか」を判定します。動的コンテンツから 承認ステータス を選び、「値」に「審査中」と入力します。
  3. 条件が「はい」の場合に承認プロセスへ進み、「いいえ」の場合は処理を終了します。これにより、未申請や既に完了した行に対してフローが走るのを防ぎます。

3. 承認アクションの追加

  1. 条件が満たされた場合(ステータスが審査中の場合)に、Approvals – Start and wait for an approval アクションを追加します。
  2. Approval type は「Approve/Reject – First to respond」(最初に応答した承認者の結果で決定)や「Everyone must approve」(全員が承認しないと承認にならない)などから選択します。一般的な経費申請では 1 人の承認で十分な場合が多いので前者を選びます。
  3. TitleDetails には動的コンテンツを組み合わせて情報をわかりやすく記載します。例えば、 経費申請(@{申請ID})の承認依頼 申請者: @{申請者} 用途: @{用途} 金額: ¥@{金額} 添付: @{添付URL} コメント: 必要に応じて承認理由を記載してください。
  4. Assigned to には承認者のメールアドレスをセットします。組織のルールに応じて固定の approver、申請者の上長、または部署ごとの approver を動的に設定することもできます。金額のしきい値によって承認ルートを分岐したい場合は Switch並列ブランチ を使って条件を組み込んでください。
  5. Approvals コネクタは Teams と Outlook の両方に通知を送ります。承認者は Approvals アプリやメール、Teams から応答できます。

4. 承認結果に応じた処理

承認アクションの出力には OutcomeApprove または Reject)と Comments(承認者のコメント)が含まれます。これを使って Excel の行を更新し、必要ならスクリプトを実行します。

  1. 条件 アクションで OutcomeApprove かどうかを判定します。
    • 承認 (Yes) の場合
      1. Excel Online (Business) – 行の更新 アクションで該当行を更新します。テーブル内のキー列(申請ID)を指定し、承認ステータス を「承認」、承認者コメントComments を入力します。申請日時や申請IDなど他の列は動的コンテンツで埋め直す必要があります。Power Automate の Excel アクションは行全体を更新する仕様のため、必要な列をすべて指定してください。
      2. 次に Run script アクション(Excel Online コネクタ)で先ほどの expense_flow.ts を実行します。スクリプトにパラメータを渡したい場合は main 関数の引数を追加して Run script アクションに入力できます。
      3. 最後に Teams 通知を送るアクションを追加します。
    • 否認 (No) の場合
      1. 同様に 行の更新 アクションで 承認ステータス を「否認」にし、承認者コメント に理由を記載します。
      2. スクリプト実行は不要なので省略します。
      3. 否認通知を Teams またはメールで申請者に送るアクションを追加します。否認理由を明記することで次回の申請改善に役立ちます。

5. Teams への通知

承認処理が完了したら、申請者や経理チームに知らせるために Teams へ通知を投稿します。Power Automate の Microsoft Teams – メッセージを投稿 アクションを利用します。

  • Post asFlow bot もしくは User。通常は Flow bot を選ぶとメッセージの送信者が自動化されます。
  • Post inChat with Flow bot(ユーザーへの直接メッセージ)または特定の Channel
  • Message には承認完了のテンプレートを用意し、動的コンテンツで申請情報を挿入します。例えば、 🧾 経費申請 承認完了 • 申請ID: @{申請ID} • 申請者: @{申請者} • 用途: @{用途} • 金額: ¥@{金額} • 添付: @{添付URL} 集計シートへ転記が完了しました。ご確認ください。

Teams カードを利用してリッチなレイアウトにすることも可能ですが、初めての構築ではシンプルなテキスト投稿から始めるとエラーが少なく済みます。

6. フローのテストと展開

フローができたら実際にテストしてみましょう。Excel で 承認ステータス を「審査中」に変更して保存するとフローが起動し、承認リクエストが届きます。Power Automate の 実行履歴 から各ステップの入力・出力を確認し、想定通りにデータが渡っているかチェックします。

運用に入る前に以下の項目を検証すると安心です。

  • トリガーが正しく発動するか(テーブルに行を追加・更新したときのみ実行されるか)。
  • 承認者が応答した後、Excel の行が正しく更新されているか。
  • スクリプトがエラーなく実行され、集計シートに転記されているか。
  • Teams の通知が期待通りのチーム・チャネル・チャットに届いているか。

ガバナンスと運用のポイント

自動化がうまく機能しても、管理体制やセキュリティが整っていなければ情報漏えいや承認プロセスの混乱につながります。以下の運用ポイントを参考にしてください。

アクセス権と役割の整理

  • 申請用 Excel ファイルのアクセス権を限定する:申請者が編集できる列と、承認者や経理担当のみ編集できる列(ステータスや承認者コメント)を分ける場合は、Power Automate で行の更新を行う際に値を上書きするので列保護が必要です。SharePoint ライブラリで列レベルのアクセス制御を設定する、あるいはファイルを複数に分ける方法もあります。
  • 承認ルートの明確化:金額のしきい値(例えば 5 万円以上は部長承認)や部署ごとの承認者を事前に定義し、フロー内で条件分岐として実装します。組織構造が頻繁に変わる場合は、Power Automate の Dataverse や SharePoint リストにマスターを置いておき、そこから承認者を読み出す設計がメンテナンスしやすいでしょう。
  • 監査ログの確保:Power Automate は各実行ログを保存してくれますが、承認履歴を別途保存したい場合は集計シートやログシートに承認者・承認日時・承認コメントなどを転記する列を追加します。これにより内部統制の証跡になります。

拡張・応用アイデア

  • 自動採番:Power Automate の utcNow() 関数や formatNumber 関数を使い、申請ID を自動で生成するステップを追加できます。行の追加時に ID を発行し、Excel の 申請ID 列に書き込むことで重複を防ぎます。
  • ファイル添付のチェック:添付URL が必須の場合、トリガー直後に条件で 添付URL が空かどうかを判定し、空の場合はエラー通知を返す、といったバリデーションも実装できます。
  • 複数承認者による並列承認:Approvals コネクタの「Everyone must approve」タイプを使用すると、全員の承認が揃うまでフローが次へ進みません。部門長と経理の双方の承認が必要なケースに便利です。
  • Adaptive Card の活用:Teams の Adaptive Cards で承認画面をカスタマイズすると、申請内容の確認やコメント入力がより直感的になります。Adaptive Card からの応答を取得する場合、Power Automate の Post an adaptive card and wait for a response アクションが利用できます。
  • 定期レポートの自動送信:月末や四半期ごとに集計シートを PDF や CSV にエクスポートし、会計ソフトに取り込むフローを追加できます。Create file アクションや Export to file アクションを組み合わせ、メールや Teams で経理チームに配布します。
  • Power BI 連携:集計データを Power BI に取り込むと、経費の傾向分析や予算管理が容易になります。Power BI データフローや OneDrive データセットに接続し、リアルタイム更新を行う設計も検討してください。

よくあるトラブルと解決策

問題主な原因と対策
Office Scripts が Power Automate で失敗するワークシート名やテーブル名が正しいか確認し、相対参照 API (getActiveWorksheet() など) を避ける。ファイルが他のユーザーによって開かれている場合や保存場所が異なるテナントの場合も実行に失敗するので、ファイルを閉じてから実行する。
Excel のトリガーが動作しないデータをテーブル化していない場合や、トリガー対象のテーブルを誤って選択している場合はイベントが起動しない。新規作成・更新時に正しい行が返されているか、フローの実行履歴で確認する。
Teams のメッセージが空白になるTeams の投稿で HTML や Adaptive Card を使用する際に構文エラーがあるとメッセージが表示されないことがある。初期はプレーンテキストで投稿し、徐々に装飾を増やす。
日付や時刻がずれるExcel はユーザーのローカルタイムゾーンを使用する一方、Power Automate は UTC で動作する。日付を正しく表示するには convertTimeZone アクションや toLocaleString() を用いて変換する。
承認結果が反映されないApprovals アクションの OutcomeComments の取得名が変更されることがある。動的コンテンツのラベルが分かりづらい場合は「承認の応答」データを直接確認して対応する。また、Flow 実行時に Approvals コネクタと接続されているアカウントが有効であるか確認する。

まとめ:小さな自動化から全社展開へ

Excel × Power Automate × Office Scripts を組み合わせることで、経費申請に伴う面倒なメールや Excel の往復を排除し、リアルタイムに承認・集計・通知が行える環境を実現できます。初めはシンプルな単一チームで運用し、承認ルートや通知先を自社の規程に合わせて微調整しながら試運転すると安心です。運用が安定したら、金額別承認ルートの分岐や Adaptive Card によるユーザーインターフェース、Power BI や会計ソフトとの連携など拡張も容易です。

2024 年以降は Power Automate に Copilot 機能が追加され、自然言語でフローの骨格を作成できるようになっています。また、Power Automate のアクションで 入力パラメーターを任意にする 機能や メールアドレスを候補から選択できる 機能など、生産性を向上させる改善が提供されています。こうした最新機能も積極的に活用すると構築のハードルがさらに下がります。

業務プロセスのデジタル化は一足飛びではなく、既存の業務を理解したうえで適切に自動化することが成功の鍵です。本記事を参考に、自社の経費申請フローを効率化し、従業員の満足度や経理の処理速度を高めてみてください。

記事では、経費申請の自動化に必要なExcelシートの設計やOffice Scriptsの具体的なコード例、Power Automateによる承認フローの作成手順、Teams通知の送信方法、ガバナンス上のポイント、拡張アイデア、トラブルシューティングまで体系的に説明しています。業務プロセス改善やスモールスタートから全社展開へのヒントも盛り込みましたので、ぜひ参考にしてみてください。

Copyright©サンスクエア株式会社,2021All Rights Reserved.