🐣
値が入っていない列を一斉に削除する方法
背景・概要
スプレッドシートに、テキストデータをまるっとコピー&ペーストする場合、テキストデータ内にタブが含まれていると、タブの数に応じて余分な列が作成されることがあります。
たとえば、1つのセル内にタブが2つ含まれている場合、そのセルが3つの列に分割され、余分な2つの列が作成されます。
列数が少ない場合は手作業で消しているのですが、量が多い時は苦労します。
そこで、1行目に =COUNTA(A2:A)
で「0」が入っている列がある場合、Google Apps Script(GAS)を使用して一括削除する方法を考えました。
手動で列を削除するのではなく、複数の列を一度に削除できるので、とても楽です。
準備
列にある値の入ったセルを数える
1行目に、列の個数を出す関数を入れて、関数を最後の列までコピーします。
右側へズバーっと。
=COUNTA(A2:A)
条件付き書式で、「0」に色をつける
「A1:JJ1」にて、0と等しい値は色をつける」
「色が消えたら削除された」とわかるように設定をします。
準備完了。
あとは、下記のGASを利用して、実行します。
GAS
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1");
でシート名を指定しています。
ここでは、「シート1」
// 列番号とアルファベット表記を変換するためのユーティリティ関数を提供するライブラリ
const columnUtils = (() => {
const base = 26; // 基数
const charA = 'A'.charCodeAt(0); // 'A' の文字コード
return {
/**
* アルファベット表記の列番号を、始まりを1とした数字にる列番号に変換する。
* @param {string} column - アルファベット表記の列名
* @return {number} 数字に変換された列番号
*/
alphaToNumber: (column) => {
let number = 0;
for (let i = 0, len = column.length; i < len; i++) {
// アルファベット表記の各文字を数字に変換し、加算する
number = (number * base) + (column.charCodeAt(i) - charA + 1);
}
return number;
},
/**
* 始まりを1とした数字にる列番号を、アルファベット表記の列番号に変換する。
* @param {number} number - 数字に変換された列番号
* @return {string} アルファベット表記の列名
*/
numberToAlpha: (number) => {
let column = "";
while (number >= 1) {
number--; // 数字に変換された列番号を1つ減算
// 数字に変換された列番号を逆に進数変換し、アルファベット表記に変換する
column = String.fromCharCode(charA + (number % base)) + column;
number = Math.floor(number / base);
}
return column;
}
};
})();
/**
* シートの最後の列から順に、値が0の列を削除する。
*/
function deleteZeroColumns() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1");
const lastColumn = sheet.getLastColumn();
for (let i = lastColumn; i > 0; i--) {
const value = sheet.getRange(1, i).getValue();
if (value === 0) {
sheet.deleteColumn(i);
}
}
}
おわりに
たまに削除できずに残ってしまう列がありますが、その場合は複数回GASを実行することで削除できます。
単純作業については、なるべく自動化したいと思っているので、今後も、このような汎用性の高いGASをもっと作っておきたいと思っています。
Discussion