本記事では、GASでスプレッドシートの行・列を削除する方法を解説しています。
複数の行を手動で削除していくのは地味に大変です。GASを使えば一発で削除できるので、ぜひ参考にしてみてください。
今回のサンプル動画
GASでスプレッドシートの行を削除するスクリプト
GASで行を削除するには、1行だけ削除ならdeleteRow
メソッド、複数行まとめて削除するならdeleteRows
メソッドを使用します。それぞれのメソッドの使い方は以下の通りです。
Sheetオブジェクト.deleteRow(行番号);
Sheetオブジェクト.deleteRows(先頭の行番号,削除する行数);
実際のスクリプトをみてみましょう。
1行だけを削除するならdeleteRow
function deleteRow() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getActiveSheet();
const deleteRow = 5; // 削除したい行番号
sheet.deleteRow(deleteRow);
}
5行目で削除する行番号を指定し、7行目のdeleteRow
メソッドで削除しています。
複数行まとめて削除するならdeleteRows
function deleteRows() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getActiveSheet();
const deleteRow = 5; // 削除したい先頭の行番号
const deleteNum = 3; // 削除したい行数
sheet.deleteRows(deleteRow,deleteNum);
}
deleteRows
メソッドは第1引数に削除する先頭の行番を指定し、第2引数に削除する行数を指定します。
上記のスクリプトの場合は5行目から3行分削除するので、5・6・7行目が削除されます。
GASでスプレッドシートの列を削除するスクリプト
続いて列を削除するスクリプトです。GASでシートの列を削除するにはdeleteColumn
deleteColumns
メソッドを利用します。
Sheetオブジェクト.deleteColumn(行番号);
Sheetオブジェクト.deleteColumns(先頭の行番号,削除する行数);
こちらも実際のスクリプトをみてみましょう。
1つの列だけを削除するならdeleteColumn
function deleteColumn() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getActiveSheet();
const deleteColumn = 5; // 削除したい列番号
sheet.deleteColumn(deleteColumn);
}
deleteRow
メソッドと同様に、5行目で削除する列番号を指定し7行目のdeleteColumn
メソッドで列を削除しています。
複数列まとめて削除するならdeleteColumns
function deleteColumns() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getActiveSheet();
const deleteColumn = 5; // 削除したい先頭の列番号
const deleteNum = 3; // 削除したい列数
sheet.deleteColumns(deleteColumn,deleteNum);
}
こちらもdeleteRows
メソッドと同様の使い方です。
離れた行・列を削除するときは大きいものから削除する
削除したい行・列が離れていて複数ある場合は、deleteRow
deleteColumn
メソッドを削除したい行数・列数分繰り返す必要があります。
その際、削除する順番は行数・列数が大きいものから削除しなければいけません。以下は、3行目と7行目を削除するスクリプトです。小さい番号から削除した場合と大きい番号から削除した場合の結果の違いを見てみましょう。
小さい番号から削除
function deleteRow_roopNG() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getActiveSheet();
// 1回目の削除処理
sheet.deleteRow(3);
// 2回目の削除処理
sheet.deleteRow(7);
}
大きい番号から削除
function deleteRow_roopOK() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getActiveSheet();
// 1回目の削除処理
sheet.deleteRow(7);
// 2回目の削除処理
sheet.deleteRow(3);
}
大きい番号から削除した場合は3行目と7行目が正しく削除されていますが、小さい番号から削除すると3行目と8行目が削除されています。
これは、3行目を最初に削除したことで1行分ずれてしまい、元々の8行目が7行目になってしまったことで起きる意図しない挙動です。行・列を削除する際は、必ず大きい番号から削除するようにしましょう。
forEachを使ってコードをきれいにする
上記のコードは、削除したい行・列の番号を配列に格納しておきforEach
を使うことでコードを見やすくすることができます。
function deleteRow_roop() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getActiveSheet();
// 削除したい行を配列で指定
let deleteRowsNum = [1,5,2,7,4,9];
// 大きい順に並べ替え
deleteRowsNum.sort(function(a, b) {return b - a;});
deleteRowsNum.forEach(function(num) {
sheet.deleteRow(num);
});
}
格納した配列にsort
メソッドを使って自動的に大きい順に並べ替えています。(8行目)
空白行だけを削除するテクニック
指定した行ではなく、空白行だけを削除したいケースもよくあります。
function deleteBlank() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getActiveSheet();
const lastRow = sheet.getLastRow(); // 値が入っている最後の行
// const lastRow = sheet.getMaxRows(); // シート全体の最終行
for(let i = 1; i <= lastRow; i++) {
const cellCheck = sheet.getRange(i,1); // 1列目のセルの空白チェック用
if(cellCheck.isBlank()) {
sheet.deleteRow(i);
}
}
}
1行ずつ空白か確認し、空白であれば削除という処理にすることで空白行だけを削除できます。
最終行をgetLastRow
で取得すれば値が入っている行までの間の空白行を削除でき、getMaxRows
にすればシート全体の空白行を削除することができます。(4〜5行目)
GASでスプレッドシートの行・列を削除するサンプル動画のコード全体像
最後に、記事冒頭のサンプル動画のコードを掲載しておきます。
function m_deleteRow() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getActiveSheet();
const input_deleteNum = Browser.inputBox("削除したい行番号を入力してください。\\n\\n※複数ある場合は「,」で区切る",Browser.Buttons.OK_CANCEL);
const deleteNum = input_deleteNum.split(',');
const deleteRowNum = [];
deleteNum.forEach(function(num) {
deleteRowNum.push(Number(num));
});
deleteRowNum.sort(function(a, b) {return b - a;});
deleteRowNum.forEach(function(num) {
sheet.deleteRow(num);
});
}
function m_deleteColumn() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getActiveSheet();
const input_deleteNum = Browser.inputBox("削除したい列番号を入力してください。\\n\\n※複数ある場合は「,」で区切る",Browser.Buttons.OK_CANCEL);
const deleteNum = input_deleteNum.split(',');
const deleteColumnNum = [];
deleteNum.forEach(function(num) {
deleteColumnNum.push(Number(num));
})
deleteColumnNum.sort(function(a,b) {return b - a;});
deleteColumnNum.forEach(function(num) {
sheet.deleteColumn(num);
});
}
// 独自メニュー作成
function onOpen() {
const ui = SpreadsheetApp.getUi();
/**
* 行・列操作
*/
const menuRowColumn = ui.createMenu("行・列操作")
.addSubMenu(
ui.createMenu("行")
.addItem("削除","m_deleteRow")
)
.addSubMenu(
ui.createMenu("列")
.addItem("削除","m_deleteColumn")
)
.addToUi();
}
inputBox
で取得した値は文字列になってしまうため、数値に変換し新しい配列に格納しています。(9〜11行目)
行・列の削除は地味に手間な作業なので、ぜひ本記事を参考にGASで効率化しましょう。