OneDriveやSharePointに置いたExcelブックから、Power Automateで重複行を削除したい場合は、Office Scriptと組み合わせるのが扱いやすい方法です。Office Scriptで「どの列を基準に重複を判定するか」「見出し行があるか」を受け取って重複を削除し、Power Automateのクラウドフローからそのスクリプトを実行します。

この記事では、スクリプトの作成からフローの組み立てまでを順に説明します。実行前にファイルのコピーを残す方法と、削除した件数を確認する方法も扱います。

全体の流れと前提

作業は次の3段階です。

  1. Excel(Web版)で、重複を削除するOffice Scriptを作る
  2. Power Automateで、「ファイルのコピー」→「スクリプトの実行」→「結果の記録」の順に動くフローを作る
  3. テスト用のファイルで実行し、削除件数とデータが正しいかを確かめる

前提として、次の条件が必要です。

  • 職場または学校のMicrosoft 365アカウントで、Office ScriptsとPower AutomateのExcel Online (Business)コネクタが使えること
  • 対象のブックが.xlsx形式で、OneDrive for BusinessかSharePointに保存されていること

Excelの画面に「自動化」タブが表示されない場合は、組織の設定でOffice Scriptsが無効になっている可能性があります。管理者に確認してください。

1. 重複行を削除するOffice Scriptを作る

ブックをWeb版のExcelで開き、「自動化」→「新しいスクリプト」を選んで、次のコードを貼り付けます。スクリプト名は「重複行の削除」など、内容が分かる名前にして保存します。

interface RemoveResult {
  sheetName: string;
  rowsBefore: number;
  removed: number;
  uniqueRemaining: number;
}

function main(
  workbook: ExcelScript.Workbook,
  sheetName: string,
  startCell: string,
  keyColumns: string,
  hasHeader: boolean
): RemoveResult {
  const sheet = workbook.getWorksheet(sheetName);
  if (!sheet) {
    throw new Error(`シート「${sheetName}」が見つかりません。`);
  }

  // startCell を含む、ひと続きの表全体を対象にする
  const range = sheet.getRange(startCell).getSurroundingRegion();
  const columnCount = range.getColumnCount();

  // "0,2" のような文字列を [0, 2] に変換する(0 = 表の左端の列)
  if (keyColumns.trim() === "") {
    throw new Error("基準列が指定されていません。");
  }
  const columns = keyColumns.split(",").map(s => Number(s.trim()));
  if (columns.some(c => !Number.isInteger(c) || c < 0 || c >= columnCount)) {
    throw new Error(`基準列の指定が正しくありません: ${keyColumns}(0〜${columnCount - 1}で指定)`);
  }

  const rowsBefore = range.getRowCount();
  const result = range.removeDuplicates(columns, hasHeader);

  return {
    sheetName: sheetName,
    rowsBefore: rowsBefore,
    removed: result.getRemoved(),
    uniqueRemaining: result.getUniqueRemaining()
  };
}

フローからは、次の4つの値を渡します。

パラメーター 渡す値の例 意味
sheetName 売上一覧 重複を削除するシートの名前
startCell A1 表の中のどこか1セル。通常は見出しの左上を指定する
keyColumns 0,2 重複の判定に使う列の番号。表の左端の列が0で、カンマで区切って複数指定できる
hasHeader true 1行目が見出しなら true。見出しは削除の対象から外れる

指定するときは、次の点に注意してください。

  • 列の番号は表の左端から数える:シートのA列からではありません。表がB列から始まっている場合は、B列が0です。
  • 表の範囲:対象は getSurroundingRegion で取得した「startCellを含む、ひと続きの範囲」です。表の途中に空白の列があると、そこで範囲が途切れます。範囲に入らなかった右側の列は、行が詰められても一緒には動かず、対応がずれてしまいます。表の中に空白の列がないことを、実行前に確認してください。
  • 表の上にタイトル行がある場合:タイトル行が表のすぐ上にくっついていると、タイトル行も範囲に含まれ、1行目が見出しとして扱われなくなります。タイトル行と表の間を1行空けてください。
  • 判定のされ方:重複は、Excelの画面の「重複の削除」と同じ考え方で判定されます。値の前後の空白や、全角・半角の違いがあると、別の値として残ります。

2. フローを作る

Power Automateで「インスタント クラウド フロー」を作ります。トリガーは「フローを手動でトリガーする」にします。動作を確かめるまでは、手動で実行するのが安全です。メールの受信や決まった時刻をきっかけに動かす設定は、テストが済んでから行ってください。

手順1:ファイルのコピーを残す

スクリプトを実行する前に、対象のブックを別のフォルダにコピーします。OneDrive for BusinessかSharePointのコネクタにある「ファイルのコピー」アクションを使います。

コピー先のファイル名に日付と時刻を入れておくと、いつ実行した分のコピーかが分かります。名前は、たとえば次の式で作れます。

concat('/バックアップ/売上一覧_', convertFromUtc(utcNow(), 'Tokyo Standard Time', 'yyyyMMdd_HHmm'), '.xlsx')

utcNow() が返すのは協定世界時(UTC)なので、convertFromUtc で日本時間に直しています。コピー先の指定方法や入力欄の名前は、コネクタによって異なります。実際のアクションの画面で確認してください。

アクションは、前のアクションが成功した場合だけ次に進むのが初期設定です。コピーに失敗したまま重複の削除に進まないよう、次のアクションの「実行条件の構成」は初期設定のまま変えないでください。

手順2:スクリプトを実行する

Excel Online (Business)の「スクリプトの実行」アクションを追加し、次の項目を指定します。

  • 場所:OneDrive for Business、または対象のSharePointサイト
  • ドキュメントライブラリ:ブックが保存されているライブラリ
  • ファイル:重複を削除するブック
  • スクリプト:手順1で保存した「重複行の削除」

スクリプトを選ぶと、sheetName・startCell・keyColumns・hasHeader の入力欄が表示されます。前の表を参考に値を入れてください。

手順3:結果を記録する

スクリプトの戻り値は、次のアクションで動的なコンテンツとして使えます。removed(削除した行数)と rowsBefore(実行前の行数)を、自分あてのメールやTeamsのメッセージで受け取るようにしておくと、実行のたびに件数を確認できます。

「条件」アクションを使えば、削除件数がいつもより多いときだけ通知することもできます。通知する基準の件数は、運用しながら決めてください。

3. テスト用のファイルで確かめる

本番のファイルで実行する前に、重複が何件あるか分かっているテスト用のファイルで確かめます。

  1. 本番のブックをコピーし、テスト用のファイルを作ります。テスト用ファイルの重複件数は、Excelの画面で数えておきます(たとえば「20行のうち重複が3行」)。
  2. フローの対象をテスト用のファイルにして、手動で実行します。
  3. Power Automateの実行履歴で「スクリプトの実行」アクションの出力を開き、removed が想定した件数と一致するかを確認します。
  4. テスト用のファイルを開き、次の点を確かめます。
    • 見出し行が残っているか
    • 残ったデータの行数が「rowsBefore − 見出しの1行 − removed」と合っているか
    • 各行で、基準列以外の値(日付・金額など)が同じ行のまま残っているか
    • 表の右側にある、範囲外の列とずれていないか
  5. バックアップフォルダに、日付付きのコピーができているかを確認します。

uniqueRemaining(重複を削除したあとに残った行数)も、残ったデータの行数と比べてください。数字が合わない場合は、スクリプトの対象範囲が想定どおりかを確認します。

うまく動かないときの確認点

  • 「シートが見つかりません」と出る:sheetName の値がシート名と完全に一致しているか確認します。前後の空白や、全角・半角の違いにも注意してください。
  • 削除件数が0件、または想定より多い:keyColumns の番号が「表の左端から0で数える」形になっているか確認します。hasHeader の設定が正しいかも確認してください。
  • 集計行のあるテーブル:Excelのテーブルで集計行を表示していると、集計行も判定の対象に含まれることがあります。実行前に集計行をオフにするか、集計行のない範囲を対象にしてください。
  • 結合セルがある:結合セルがあると、重複の削除がエラーになることがあります。対象の表では結合セルを解除しておきます。
  • ほかの人が編集中:共同編集中のブックに対して実行すると、編集とぶつかるおそれがあります。利用者の少ない時間帯に実行してください。
  • 大きなファイルで失敗する:Office ScriptsとPower Automateには、実行時間やデータ量の上限があります。行数が多い表で失敗する場合は、Microsoftの公式ドキュメントで現在の上限を確認してください。
  • 元に戻したい:手順1で作ったバックアップのコピーから戻します。OneDriveやSharePointのバージョン履歴から、実行前の版を復元することもできます。
おすすめの記事