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

2021/09/18に公開

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

Discussion