A列のキーが同じ行から、最初または最後の1行を残して重複を削除するGASコードを紹介します。
GASはGoogleサービスを操作するスクリプトで、キーは重複の判定に使う値です。
削除するのはA列のセルだけでなく行全体なので、元ファイルを残したコピーで試してください。
最初・最後は現在の行の並び順を指し、日付の新旧は判定しません。
別の場所に重複のない一覧を出すだけなら、元の行を削除しないUNIQUE関数も選択肢です。
A列の上位を残し、下位の重複を削除
以下の画像は既存の処理例で、今回の掲載コードを実行して撮影したものではありません。
例(上位を残して削除)


上から順に見て最初に登場したデータを残し、それ以降の重複を削除します。
A列の下位を残し、上位の重複を削除
一番下の重複を残す場合、A列の降順ソートだけでは同じキーのうち最後の行を選べません。
removeDuplicates()の代わりに、下からキーを確認して削除対象を決めるコードを使います。


重複削除は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での削除・復旧、現在の画面、保護範囲、数式参照への影響、大量データの処理は未検証です。
