Amazonで商品を見るセール会場へ

Googleスプレッドシート│重複データを一発削除する方法

Googleスプレッドシートでログや日次データを記録していると、同じキーのデータが複数行にわたって存在することがあります。

手動で削除すると手間がかかります。

本記事では、Google Apps Script(GAS)で重複データの削除処理を自動化する方法を解説します。

目次

A列の上位を残し、下位の重複を削除

たとえば、以下のような重複データを用意します。

例(上位を残して削除)

上位のデータを残して重複を削除する前のスプレッドシートの状態。
BEFORE
上位のデータを残してそれ以降の重複データを削除した結果。
AFTER

上から順に見て最初に登場したデータを残し、それ以降の重複を削除します。

A列の下位を残し、上位の重複を削除

一番下の重複を残す場合、A列の降順ソートだけでは同じキーのうち最後の行を選べません。

removeDuplicates()の代わりに、下からキーを確認して削除対象を決めるコードを使います。

下からキーを確認して重複を削除するコードを実行する前のデータ状態。
BEFORE
重複削除コードを実行した後のデータ結果。
AFTER

以下は実際のコード(自作関数)です。

  • A列の上位を残し、下位の重複を削除
  • A列の下位を残し、上位の重複を削除
  • 1列目の2行目以降のデータを空にする

Googleスプレッドシートのほかの操作は、まとめから確認できます。

実行前にシートを複製してください。

このコードはアクティブなシートの行全体を削除します。

A・B列だけでなく、同じ行の別の列にも影響します。

1行目を見出し、2行目以降をデータとして扱います。

A列の表示文字列を大文字・小文字や空白も含めて完全一致で比較し、空のキーは残します。

数値と文字列でも表示が同じなら同じキーとして扱います。

上の関数群をApps Scriptへ貼り付け、最初の行を残すならremoveDuplicatesKeepFirst、最後の行を残すならremoveDuplicatesKeepLastを選んで実行します。

両方を続けて実行する必要はありません。

行が非表示でも判定対象に含まれます。

大量データでは行ごとの削除が実行時間の制限に達することがあるため、複製した少量データで結果を確認してから使ってください。

コード

A列の上位を残し、下位の重複を削除

function removeDuplicatesKeepFirst() {
  deleteDuplicateKeyRows(false);
}

// 1行目は見出し。A列の表示文字列を完全一致で比較します。
function deleteDuplicateKeyRows(keepLast) {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const lastRow = sheet.getLastRow();
  if (lastRow < 2) return;
  const keys = sheet.getRange(2, 1, lastRow - 1, 1).getDisplayValues();
  const seen = new Set();
  const remove = [];
  for (let step = 0; step < keys.length; step++) {
    const i = keepLast ? keys.length - 1 - step : step;
    const key = keys[i][0];
    if (key === '') continue; // 空のキーは削除しません
    if (seen.has(key)) remove.push(i + 2);
    else seen.add(key);
  }
  // 行番号のずれを防ぐため下から削除します。
  remove.sort((a, b) => b - a).forEach(row => sheet.deleteRow(row));
}

A列の下位を残し、上位の重複を削除

function removeDuplicatesKeepLast() {
  // 上のdeleteDuplicateKeyRowsも同じプロジェクトへ貼り付けます。
  deleteDuplicateKeyRows(true);
}

1列目の2行目以降のデータを空にする

あわせて、データのクリア処理も解説します。

以下は、1列目の2行目以降のデータを空にする関数です。

function resetValue() {
  const id = '★スプレッドシートID★';
  const sheet = SpreadsheetApp.openById(id).getSheetByName('シート1');
  if (!sheet) throw new Error('シート1が見つかりません');
  const lastRow = sheet.getLastRow();
  if (lastRow >= 2) sheet.getRange(2, 1, lastRow - 1, 1).clearContent();
}

この記事で紹介しているコードは、GitHubのMOTOKI-LLC/cg-method-codeにもまとめています。

シートのデータを整える方法は、ほかにも書いています。

まとめ

日々のログ記録やデータ集計時に重複データ処理を自動化すると、作業効率が向上します。

次に学ぶ・作業環境を選ぶ

学習を続けたい方や、作業環境を整えたい方は、目的に合うガイドをご覧ください。

スプレッドシート・GASのおすすめ書籍

作業環境の作り方

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次