OneDriveやSharePointに置いたExcelブックから、Power Automateで重複行を削除したい場合は、Office Scriptと組み合わせるのが扱いやすい方法です。Office Scriptで「どの列を基準に重複を判定するか」「見出し行があるか」を受け取って重複を削除し、Power Automateのクラウドフローからそのスクリプトを実行します。
この記事では、スクリプトの作成からフローの組み立てまでを順に説明します。実行前にファイルのコピーを残す方法と、削除した件数を確認する方法も扱います。
全体の流れと前提
作業は次の3段階です。
- Excel(Web版)で、重複を削除するOffice Scriptを作る
- Power Automateで、「ファイルのコピー」→「スクリプトの実行」→「結果の記録」の順に動くフローを作る
- テスト用のファイルで実行し、削除件数とデータが正しいかを確かめる
前提として、次の条件が必要です。
- 職場または学校の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. テスト用のファイルで確かめる
本番のファイルで実行する前に、重複が何件あるか分かっているテスト用のファイルで確かめます。
- 本番のブックをコピーし、テスト用のファイルを作ります。テスト用ファイルの重複件数は、Excelの画面で数えておきます(たとえば「20行のうち重複が3行」)。
- フローの対象をテスト用のファイルにして、手動で実行します。
- Power Automateの実行履歴で「スクリプトの実行」アクションの出力を開き、
removedが想定した件数と一致するかを確認します。 - テスト用のファイルを開き、次の点を確かめます。
- 見出し行が残っているか
- 残ったデータの行数が「
rowsBefore− 見出しの1行 −removed」と合っているか - 各行で、基準列以外の値(日付・金額など)が同じ行のまま残っているか
- 表の右側にある、範囲外の列とずれていないか
- バックアップフォルダに、日付付きのコピーができているかを確認します。
uniqueRemaining(重複を削除したあとに残った行数)も、残ったデータの行数と比べてください。数字が合わない場合は、スクリプトの対象範囲が想定どおりかを確認します。
うまく動かないときの確認点
- 「シートが見つかりません」と出る:
sheetNameの値がシート名と完全に一致しているか確認します。前後の空白や、全角・半角の違いにも注意してください。 - 削除件数が0件、または想定より多い:
keyColumnsの番号が「表の左端から0で数える」形になっているか確認します。hasHeaderの設定が正しいかも確認してください。 - 集計行のあるテーブル:Excelのテーブルで集計行を表示していると、集計行も判定の対象に含まれることがあります。実行前に集計行をオフにするか、集計行のない範囲を対象にしてください。
- 結合セルがある:結合セルがあると、重複の削除がエラーになることがあります。対象の表では結合セルを解除しておきます。
- ほかの人が編集中:共同編集中のブックに対して実行すると、編集とぶつかるおそれがあります。利用者の少ない時間帯に実行してください。
- 大きなファイルで失敗する:Office ScriptsとPower Automateには、実行時間やデータ量の上限があります。行数が多い表で失敗する場合は、Microsoftの公式ドキュメントで現在の上限を確認してください。
- 元に戻したい:手順1で作ったバックアップのコピーから戻します。OneDriveやSharePointのバージョン履歴から、実行前の版を復元することもできます。
