👻

GASでスプレッドシートの未使用行列を削除する

に公開

GASは制限があるので、不要な行列はできるだけ無くしたい。
そんな時に使えるコード。
使い方は以下

  1. コードをgasに入れる
  2. スプレッドシートを更新する
  3. メニュバーに表示される「ユーティリティー」をクリック
  4. 必要な操作を行う
/**
 * スプレッドシートの空列を削除する関数
 * この関数は「見た目上」空の列を正確に検出して削除します
 */
function deleteEmptyColumns() {
    var sheet = SpreadsheetApp.getActiveSheet();
    
    // 最大の行数と列数を取得
    var maxRows = sheet.getMaxRows();
    var maxCols = sheet.getMaxColumns();
    var lastCol = sheet.getLastColumn();
    
    // 使用されている最後の列以降の列を削除
    if (lastCol < maxCols) {
      // LastColumn+1から最後の列までを削除
      sheet.deleteColumns(lastCol + 1, maxCols - lastCol);
      Browser.msgBox((maxCols - lastCol) + "個の未使用列を削除しました。");
    } else {
      Browser.msgBox("削除対象の空列はありませんでした。");
    }
  }
  
  /**
   * スプレッドシートの空行を削除する関数
   * この関数は「見た目上」空の行を正確に検出して削除します
   */
  function deleteEmptyRows() {
    var sheet = SpreadsheetApp.getActiveSheet();
    
    // 最大の行数と列数を取得
    var maxRows = sheet.getMaxRows();
    var lastRow = sheet.getLastRow();
    
    // 使用されている最後の行以降の行を削除
    if (lastRow < maxRows) {
      // LastRow+1から最後の行までを削除
      sheet.deleteRows(lastRow + 1, maxRows - lastRow);
      Browser.msgBox((maxRows - lastRow) + "個の未使用行を削除しました。");
    } else {
      Browser.msgBox("削除対象の空行はありませんでした。");
    }
  }
  
  /**
   * スプレッドシートの空の行と列を一括削除する関数
   */
  function deleteEmptyRowsAndColumns() {
    // 空行と空列を削除
    deleteEmptyRows();
    deleteEmptyColumns();
  }
  
  /**
   * メニューを追加する関数
   * この関数はスプレッドシートを開いたときに実行される
   */
  function onOpen() {
    var ui = SpreadsheetApp.getUi();
    
    // カスタムメニューを追加
    ui.createMenu('ユーティリティ')
      .addItem('現在のシート: 未使用の列を削除', 'deleteEmptyColumns')
      .addItem('現在のシート: 未使用の行を削除', 'deleteEmptyRows')
      .addItem('現在のシート: 未使用の行と列を削除', 'deleteEmptyRowsAndColumns')
      .addSeparator()
      .addItem('全シート: 未使用の列を削除', 'deleteEmptyColumnsInAllSheets')
      .addItem('全シート: 未使用の行を削除', 'deleteEmptyRowsInAllSheets')
      .addItem('全シート: 未使用の行と列を削除', 'deleteEmptyRowsAndColumnsInAllSheets')
      .addToUi();
  }
  
  /**
   * 特定のシートの空の行と列を削除する関数
   * @param {string} sheetName - 処理対象のシート名
   */
  function deleteEmptyRowsAndColumnsInSheet(sheetName) {
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = spreadsheet.getSheetByName(sheetName);
    
    if (!sheet) {
      Browser.msgBox("エラー: シート「" + sheetName + "」が見つかりません。");
      return;
    }
    
    // 最大の行数と列数を取得
    var maxRows = sheet.getMaxRows();
    var maxCols = sheet.getMaxColumns();
    var lastRow = sheet.getLastRow();
    var lastCol = sheet.getLastColumn();
    
    // 使用されている最後の行以降の行を削除
    if (lastRow < maxRows) {
      sheet.deleteRows(lastRow + 1, maxRows - lastRow);
    }
    
    // 使用されている最後の列以降の列を削除
    if (lastCol < maxCols) {
      sheet.deleteColumns(lastCol + 1, maxCols - lastCol);
    }
    
    Browser.msgBox("シート「" + sheetName + "」で " + 
                  (maxRows - lastRow) + "個の未使用行と" + 
                  (maxCols - lastCol) + "個の未使用列を削除しました。");
  }
  
  /**
   * スプレッドシートのすべてのシートで空の行と列を削除する関数
   */
  function deleteEmptyRowsAndColumnsInAllSheets() {
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    var sheets = spreadsheet.getSheets();
    var totalRowsDeleted = 0;
    var totalColsDeleted = 0;
    
    for (var i = 0; i < sheets.length; i++) {
      var sheet = sheets[i];
      var sheetName = sheet.getName();
      
      // 各シートの最大の行数と列数を取得
      var maxRows = sheet.getMaxRows();
      var maxCols = sheet.getMaxColumns();
      var lastRow = sheet.getLastRow();
      var lastCol = sheet.getLastColumn();
      
      // 使用されている最後の行以降の行を削除
      if (lastRow < maxRows) {
        sheet.deleteRows(lastRow + 1, maxRows - lastRow);
        totalRowsDeleted += (maxRows - lastRow);
      }
      
      // 使用されている最後の列以降の列を削除
      if (lastCol < maxCols) {
        sheet.deleteColumns(lastCol + 1, maxCols - lastCol);
        totalColsDeleted += (maxCols - lastCol);
      }
    }
    
    Browser.msgBox("すべてのシートで " + 
                  totalRowsDeleted + "個の未使用行と" + 
                  totalColsDeleted + "個の未使用列を削除しました。");
  }
  
  /**
   * スプレッドシートのすべてのシートで空の列を削除する関数
   */
  function deleteEmptyColumnsInAllSheets() {
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    var sheets = spreadsheet.getSheets();
    var totalColsDeleted = 0;
    
    for (var i = 0; i < sheets.length; i++) {
      var sheet = sheets[i];
      
      // 各シートの最大の列数を取得
      var maxCols = sheet.getMaxColumns();
      var lastCol = sheet.getLastColumn();
      
      // 使用されている最後の列以降の列を削除
      if (lastCol < maxCols) {
        sheet.deleteColumns(lastCol + 1, maxCols - lastCol);
        totalColsDeleted += (maxCols - lastCol);
      }
    }
    
    Browser.msgBox("すべてのシートで " + totalColsDeleted + "個の未使用列を削除しました。");
  }
  
  /**
   * スプレッドシートのすべてのシートで空の行を削除する関数
   */
  function deleteEmptyRowsInAllSheets() {
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    var sheets = spreadsheet.getSheets();
    var totalRowsDeleted = 0;
    
    for (var i = 0; i < sheets.length; i++) {
      var sheet = sheets[i];
      
      // 各シートの最大の行数を取得
      var maxRows = sheet.getMaxRows();
      var lastRow = sheet.getLastRow();
      
      // 使用されている最後の行以降の行を削除
      if (lastRow < maxRows) {
        sheet.deleteRows(lastRow + 1, maxRows - lastRow);
        totalRowsDeleted += (maxRows - lastRow);
      }
    }
    
    Browser.msgBox("すべてのシートで " + totalRowsDeleted + "個の未使用行を削除しました。");
  }```

Discussion