【GAS】getLastRowでスプレッドシートの最終行を取得|注意点と別解あり

本記事では、GASでスプレッドシートの最終行を取得する方法を解説していきます。

最終行に追加する形で値を入力する際に使える方法ですので、ぜひ参考にしてみてください。

今回のサンプル動画

GASで最終行を取得
目次

GASでスプレッドシートの最終行を取得するスクリプト

スプレッドシートのアクティブなシートの最終行を取得するスクリプトです。

function gas_getlastrow() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getActiveSheet();
  const lastRow = sheet.getLastRow();

  console.log(lastRow);
}

4行目のsheet.getLastRow()でアクティブシートの最終行を取得し、変数lastRowに格納しログに出力しています。

getLastRowメソッドで最終行を取得するときの注意点

getLastRowメソッドはシートの最終行を一発で取得できる便利なメソッドですが、使う際には2点注意が必要です。

  1. シート全体の最終行を取得する
  2. 数式も値と見なされる

それぞれ詳しくみていきます。

シート全体の最終行を取得する

getLastRowメソッドは、指定したシート全体の最終行を返すメソッドです。そのため、B列の最終行を取得といったように、特定の列に絞って最終行を取得することができません。

以下の画像をみてみましょう。

ここでB列の最終行を取得するためにgetLastRowメソッドを利用してしまうと、A列の最終行を取得してしまいます。

行数が揃っていないテーブルの最終行をgetLastRowメソッドで取得する際は注意しましょう。

数式も値と見なされる

次に以下の画像をみてみましょう。

こちらは行数が揃っていますが、getLastRowメソッドで最終行を取得してみると意図しない結果が返ってきてしまいます。

これは、A列に入っている数式が原因です。数式でできた空白もgetLastRowメソッドでは値と見なしてしまうため、数式が列全体に入っている場合などは注意してください。

とはいえ、上記のような場合でも最終行を取得したいケースは多くあります。そのときは次に紹介するスクリプトを代わりに使用してみてください。

特定の列の最終行を取得する(数式での空白ありでもOK)

getLastRowメソッドで最終行を取得できないケースに代わりとして使えるスクリプトです。最終行を取得したい列を指定することも可能です。

function gas_getlastrow() {
  // アクティブなシートを取得
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getActiveSheet();

  // アクティブなセル情報から列番号を取得
  const cell = sheet.getActiveCell();
  const active_col = cell.getColumn();

  // 取得した列番号の列全体の範囲を取得
  const range = sheet.getRange(1,active_col,sheet.getMaxRows(),1);

  // 範囲に値が入っている場合のみ最終行を取得
  if( !range.isBlank() ) {
    const lastRow = sheet.getRange(1,active_col).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow();
    console.log(lastRow);
  } else {
    console.log("指定した列にはデータが1つも入っていません。");
  }
}

15行目のsheet.getRange(1,active_col).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow()でアクティブな列の最終行を取得しています。

11行目で指定した列の範囲全体を取得する理由は、値が入ってない場合の処理を分岐させるためです。その分岐が14行目のif( !range.isBlank() )です。rangeオブジェクト.isBlank()で、その範囲が空白かをTRUE・FLASEで返してくれます。

指定した列の最終行を取得するスクリプト

最終行を取得したい列を指定するスクリプトです。

function gas_getlastrow() {
  // アクティブなシートを取得
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getActiveSheet();

  // 最終行を取得したい列番号を指定(※A、Bなどの列名はNG)
  const COLUMN_NUM = 3;

  // 取得した列番号の列全体の範囲を取得
  const range = sheet.getRange(1,COLUMN_NUM,sheet.getMaxRows(),1);

  // 範囲に値が入っている場合のみ最終行を取得
  if( !range.isBlank() ) {
    const lastRow = sheet.getRange(1,COLUMN_NUM).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow();
    console.log(lastRow);
  } else {
    console.log("指定した列にはデータが1つも入っていません。");
  }
}

こちらのスクリプトも、最終行の取得自体は同じ書き方になります。

最終行を取得するサンプル動画のコード全体像

最後に、記事冒頭のサンプル動画のコード全体像を掲載しておきます。

function m_gas_getlastrow() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const active_col = sheet.getActiveCell().getColumn();
  const range = sheet.getRange(1,active_col,sheet.getMaxRows(),1);

  if( !range.isBlank() ) {
    const lastRow = sheet.getRange(1,active_col).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow();
    Browser.msgBox("選択している列の最終行:" + lastRow + "行");
  } else {
    Browser.msgBox("指定した列にはデータが1つも入っていません。");
  }
  
}

// 独自メニュー作成
function onOpen() {
  const ui = SpreadsheetApp.getUi();
  const menu = ui.createMenu("シート操作");

  menu.addItem("新規作成","m_gas_sheet_create");
  menu.addItem("コピー","m_gas_sheet_copy");
  menu.addSubMenu(
    ui.createMenu('削除')
    .addItem("特定のシートを削除","m_gas_sheet_delete_1")
    .addItem("特定のシート以外を削除","m_gas_sheet_delete_2")
    .addItem("特定の複数シートを削除","m_gas_sheet_delete_3")
    .addItem("特定の複数シート以外を削除","m_gas_sheet_delete_4")
     .addItem("全てのシートを削除","m_gas_sheet_delete_5")
  );
  menu.addItem("アクティブ化","m_gas_sheet_active");
  menu.addItem("アクティブ列の最終行を取得","m_gas_getlastrow");

  menu.addToUi();
}

最終行を取得して表示するだけということはありませんが、値をセットしたり範囲が動的に変わる場合などに最終行の取得は必須となります。

お好みにカスタマイズしてご活用ください。

よかったらシェアしてね!
  • URLをコピーしました!
目次