GAS+スプシで上にある重複を削除する/降順で削除する

に公開

GASに追加されたremoveDuplicates()を使用すれば重複する値/列を削除することができます。

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var range = sheet.getRange("B1:D7");

// 範囲内の重複行を除去
range.removeDuplicates();

// 列Bに重複する値がある行を除去
range.removeDuplicates([2]);

// 列BとDの両方に重複する値がある行を除去
range.removeDuplicates([2,4]);

しかし、このメソッドでは上から順に重複を探していき、下にある重複が削除されます。
もし、キーとなる行が一意であればこちらの記事にあるようにSortメソッドを使用すれば降順でも昇順でも重複を削除できます。しかし、ソートをせずに今のデータの並びのまま重複を上から削除したい/つまり下にあるエントリを残しておきたい場合には一旦配列に取得し、上下を入れ替え、重複を削除、上下を戻して配列をsetValuesする必要があります。

コードは以下のとおりです。なお、初学者のため、コードの書き方がまどろっこしい場合があります。もしもっと容易な書き方があればぜひ教えて下さい。

function removeDuplicatesUpsideDown() {
  const sheets = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = sheets.getActiveSheet();
  let lastRow = sheet.getLastRow();
  let LastColumn = sheet.getLastColumn();
  let range = sheet.getRange(1, 1,lastRow,LastColumn);
  let value = range.getValues();
  range.clear().setValues(value.reverse());
  // キーとなる行を数字で指定する。
  range.removeDuplicates([1]);
  lastRow = sheet.getLastRow();
  LastColumn = sheet.getLastColumn();
  range = sheet.getRange(1, 1,lastRow,LastColumn);
  value = range.getValues();
  range.clear().setValues(value.reverse());
}

2026年3月13日 追記
もし removeDuplicates() に頼らず純粋にJSで完結させるなら、シートへの書き込みを1回に減らせます。

function removeDuplicatesKeepLast() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const data = sheet.getDataRange().getValues();
  const keyCol = 0; // キーとなる列(0始まり)

  // 後ろから走査するので、後にある行が優先される
  const seen = new Set();
  const result = [];
  for (let i = data.length - 1; i >= 0; i--) {
    const key = data[i][keyCol];
    if (!seen.has(key)) {
      seen.add(key);
      result.push(data[i]);
    }
  }
  result.reverse();

  sheet.clearContents();
  sheet.getRange(1, 1, result.length, result[0].length).setValues(result);
}

後ろからループして Set で既出チェックすることで、「下にある行を残す」を自然に実現しています。シートへのアクセスが読み1回・書き1回で済むので実行速度も上がります。

何の時にこのコードを書いたのかもはや今となっては思い出せません。

Discussion