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

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

A列のキーが同じ行から、最初または最後の1行を残して重複を削除するGASコードを紹介します。

GASはGoogleサービスを操作するスクリプトで、キーは重複の判定に使う値です。

削除するのはA列のセルだけでなく行全体なので、元ファイルを残したコピーで試してください。

最初・最後は現在の行の並び順を指し、日付の新旧は判定しません。

別の場所に重複のない一覧を出すだけなら、元の行を削除しないUNIQUE関数も選択肢です。

目次

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

以下の画像は既存の処理例で、今回の掲載コードを実行して撮影したものではありません。

例(上位を残して削除)

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

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

スポンサーリンク

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

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

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

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

重複削除は2種類の関数から選び、A列を空にする処理は必要な場合だけ別に実行します。

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

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

実行前にファイルをコピーし、コピー側で削除対象のシートを選択してください。

重複削除コードは、ファイル内で現在選択しているアクティブシートを対象にします。

別のシートを選んだまま実行すると、そのシートの行を削除するためタブ名を再確認しましょう。

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

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

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

コピー側の「拡張機能」から「Apps Script」を開き、次の最初・最後を残すコードを同じプロジェクトへ保存します。

既存コードを消さず、同名の関数がある場合は練習用の別ファイルで試してください。

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

大量データでは途中で停止することがあるため、まず小さな見本で残る行を確かめます。

重複削除のコードを保存して実行する

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);
}
  • 最初の行を残す:removeDuplicatesKeepFirstを選んで実行します。
  • 最後の行を残す:removeDuplicatesKeepLastを選んで実行します。
  • GASの承認が出たら、処理内容と要求権限を読んでから承認してください。

共通処理のdeleteDuplicateKeyRowsを直接実行せず、目的に合う上記のどちらかを選びます。

2つを続けて実行しても元の行は戻らないため、比較するときはそれぞれ別のコピーを使ってください。

見本で残る行と列全体を確認する

1行目を見出しにして、A2から順にA・B・A・空欄・Bと入力した見本を用意します。

B2からB6には元の行番号2・3・4・5・6を入れ、残った行を見分ける印にしてください。

  • 最初を残す場合:元の2・3・5行目が残る想定です。
  • 最後を残す場合:元の4・5・6行目が残る想定です。
  • どちらも:見出しと空キーの行が残り、B列以降の値が同じ行に対応するか確認します。

これはコードから読み取れる期待結果で、実際のGoogleスプレッドシートで今回実測した結果ではありません。

数式参照や別の表への影響も確認し、元ファイルとコピーを比べてから本番での利用を判断してください。

補足:A列の内容だけを空にする別の関数

次のresetValueは重複削除や復旧の手順には使いません。

使う場合はコード内のIDを練習用ファイルのIDに変更し、シート名も対象と一致させます。

指定したファイルの「シート1」で、A2から最終行までの値や数式を空にする処理です。

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();
}

コード保管先はMOTOKI-LLC/cg-method-codeですが、掲載版との一致は今回再検証していません。

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

スポンサーリンク

途中停止・想定外の削除が起きたとき

エラーで停止しても、それまでに削除された行は自動で戻りません。

同じファイルを繰り返し処理せず、実行前の元ファイルから作り直したコピーで原因を確認します。

保護された行や同時編集、実行時間の上限に当たる場合は、エラー内容を読んで条件を見直してください。

コードは処理開始時の行番号を使うため、実行中に他の人が行を追加・削除しない練習環境で試しましょう。

日時や数値の表示形式が違うとキーの文字列も変わるため、見た目の書式も確認します。

表示文字列の取得はgetDisplayValuesの公式仕様、行の削除はdeleteRowの公式仕様に基づきます。

A列の内容だけを消す処理はclearContentの仕様で、書式と行自体は残ります。

実行時間などの上限はApps Scriptの割り当て一覧を参照してください。

2026年10月25日に本文・コードと公式資料を照合しました。

実GASでの削除・復旧、現在の画面、保護範囲、数式参照への影響、大量データの処理は未検証です。

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

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

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

作業環境の作り方

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