🐣

値が入っていない列を一斉に削除する方法

2023/04/19に公開

背景・概要

スプレッドシートに、テキストデータをまるっとコピー&ペーストする場合、テキストデータ内にタブが含まれていると、タブの数に応じて余分な列が作成されることがあります。
たとえば、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をもっと作っておきたいと思っています。

GitHubで編集を提案

Discussion