データがたまってきたら、「金額が高い順に並べ替える」「重複行を消す」といった整理をGASで自動化したくなります。並べ替えは sort、重複削除は removeDuplicates で行います。この記事ではコピペで動くコード例と、ヘッダ行や列番号のつまずきを解説します。
この記事のポイント
- 並べ替えは範囲に対して
sort({column: 列番号, ascending: true/false})- 複数キーは配列で
sort([{column:1...}, {column:2...}])- 重複削除は
removeDuplicates()(特定列基準はremoveDuplicates([列番号]))- ヘッダ行を巻き込まないよう、対象範囲は2行目からにする
範囲を並べ替える:sort
並べ替えたい範囲を getRange で取得し、sort に「どの列で・昇順か降順か」を渡します。ヘッダを動かさないよう、範囲は2行目からにします。
function sortByAmount() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const last = sheet.getLastRow();
// 2行目から(ヘッダ除く)A:C を、2列目(B列=金額)で降順
sheet.getRange(2, 1, last - 1, 3).sort({ column: 2, ascending: false });
}
注意:column はシートの絶対列番号です(A=1, B=2…)。範囲がB列始まりでも、B列は 2 と数えます。
複数の条件で並べ替える
「部署で昇順 → その中で金額の降順」のような多段ソートは、条件を配列で渡します。
function sortMulti() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const last = sheet.getLastRow();
sheet.getRange(2, 1, last - 1, 3).sort([
{ column: 1, ascending: true }, // まずA列で昇順
{ column: 2, ascending: false } // 同値ならB列で降順
]);
}
ヘッダを固定してシート全体を並べ替える
固定行(フリーズした行)を設定していれば、sheet.sort でシート全体をソートしても固定行は動きません。
function sortSheet() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
sheet.setFrozenRows(1); // 1行目を固定(ヘッダ)
sheet.sort(2, false); // 2列目で降順(固定行は除外される)
}
重複行を削除する:removeDuplicates
範囲に対して removeDuplicates() を呼ぶと、内容が完全に同じ行を1つ残して削除します。
function removeDup() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const last = sheet.getLastRow();
// 行全体が重複しているものを削除(最初の1件を残す)
sheet.getRange(2, 1, last - 1, 3).removeDuplicates();
}
「メールアドレス列が同じなら重複とみなす」のように特定の列だけで判定したいときは、列番号の配列を渡します。
function removeDupByEmail() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const last = sheet.getLastRow();
// 1列目(A列)が同じ行を重複とみなして削除
sheet.getRange(2, 1, last - 1, 3).removeDuplicates([1]);
}
よくあるつまずきと直し方
ヘッダまで並べ替えられる → 対象範囲を getRange(2, 1, ...) と2行目からにする。または setFrozenRows(1) + sheet.sort()。
違う列でソートされる → column はシートの絶対列番号(A=1)。範囲の何番目か、ではありません。
removeDuplicatesで思ったより消えない/消えすぎる → 引数なしは「行全体が完全一致」のみ。特定列基準にしたいときは removeDuplicates([列番号])。
空白や全角半角で重複扱いされない → 文字列の前後空白や全角/半角の違いは別物と判定されます。事前に整形を。
この記事のポイント(まとめ)
| やりたいこと | 使うもの |
|---|---|
| 1列で並べ替え | range.sort({column: 列, ascending: true/false}) |
| 複数条件で並べ替え | range.sort([{...}, {...}]) |
| シート全体(ヘッダ固定) | setFrozenRows(1) + sheet.sort(列) |
| 重複削除(行全体) | range.removeDuplicates() |
| 重複削除(特定列基準) | range.removeDuplicates([列番号]) |
次のステップ
- GASのセル読み書き|getRange/getValue/setValueの基本
- GASで行を追加・削除する方法(appendRow/deleteRow)
- GASの配列操作|map/filter/reduceの使い方
あわせて読みたい
日付の列で並べ替えるとき、値が日付ではなく文字列として入っていると意図した順序にならない。日付の作り方と型の見分け方は次の記事にまとめている。
コメント