【GAS】データ入力最終行・空欄でもOK最終行を取得する方法

GAS(Google Apps Script)で、スプレッドシートの最終行を取得したいときに使えるあれこれのプログラムを紹介していきます。最終行の取得は、for文で各行逐次処理につなげることができるので、よく必要になるかと思います。

  • データ入力がある範囲の最終行を取得したいとき
  • シートの最終行を取得したいとき
  • 特定列のデータ入力がある最終行を取得したいとき

このようなお悩みを解決できるのではないかと思います。興味ある方はぜひ御覧くださいませー。

記事を書いた人

こんにちは。当ブログの管理人の『くろん』です。
30代サラリーマン、新規事業推進室に所属。ブラック企業努め時代に身に着けた業務効率化ノウハウをアウトプットしていきます。
読んでくれた方の業務が一秒でも早く終わりますようにの精神で記事書いてます!!

スポンサーリンク
目次

最終行を取得する各種方法の比較

最終行を取得する方法にはいくつかあるのですが、それぞれに特徴がありますので、比較してみたいと思います。

比較する方法とテスト用GAS

  • getMaxRows
  • getLastRow
  • getDataRange & getValues & lengthの組み合わせ

これら3種類を比較してみます。サンプルスプレッドシートの内容と、GASはこちら。

function lastrow_test() {
  let sheet1 = SpreadsheetApp.getActiveSheet();

  //getMaxRowsを用いた最終行の取得
  let lastrow1 = sheet1.getMaxRows();
  console.log("getMaxRowsでの最終行は、" + lastrow1 + "行目です。");
  //getLastRowを用いた最終行の取得
  let lastrow2 = sheet1.getLastRow();
  console.log("getLastRowでの最終行は、" + lastrow2 + "行目です。");
  //getDataRangeとgetValuesとlengthを用いた最終行の取得
  let lastrow3 = sheet1.getDataRange().getValues().length;
  console.log("lengthでの最終行は、" + lastrow3 + "行目です。");
}

テストの結果

getMaxRows

getMaxRowsは、スプレッドシートのデータがあるかどうか関係なく、一番最後の行を取得します。今回のサンプルデータですと、『1000』となりました。
確かに最終行ではあるんですが、for文などでループ処理をするときに、getMaxRowsで取得した最終行を使用してしまうと、無駄な処理が増えてしまうことが予想されます。

getLastRow

getLastRowは、シート内におけるデータがある部分において、使用されている最後の行を取得します。
今回のサンプルデータだとA列が最も下までデータがあるので、その最終行である『11』が取得されました。

getDataRange & getValues & length

getDataRangeは、A1セルを起点とし、データが入っている一番右の列&データが入っている一番下の行を組み合わせたセルまでの範囲を取得することができます。今回のサンプルデータで言えば、A1セルからE11セルまでの範囲を取得します。
getValuesで、getDataRangeの範囲内の値を取得し配列化、lengthで配列の要素数を取得するという流れになります。

こちらも、getLastRowと同じく、『11』が最終行として取得されています。

まとめ

なので、まとめますと、スプレッドシートに表示されているデータ関係なく最終行を取得したい場合は、『getMaxRows』を。データが入力されている最終行を取得したい場合は、『getLastRow』もしくは、『getDataRange & getValues & length』を用いるのが良いと言えます。

ある特定の列のデータがある最終行を取得する方法

例えば、このサンプルデータで、『B列』のデータの最終行を知りたい(つまり『9』を取得したい)場合は、どうすればいいでしょうか。これまで紹介した方法ですと、他の列の情報に引きずられてしまい、うまく取得することができなさそうです。

特定列の最終行を取得するGAS(全てデータが埋まっている場合)

function lastrow_test() {
  let sheet1 = SpreadsheetApp.getActiveSheet();

  //B列の最終行の取得
  let lastrow1 = sheet1.getRange(1,2).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow();
  console.log("B列の最終行は、" + lastrow1 + "行目です。");
}

サンプルデータのB列のように、全ての行でデータが埋まっている場合に使える方法です。

ポイントとなるのは、『getNextDataCell(SpreadsheetApp.Direction.DOWN)』の部分ですね。
これは、キーボード操作の『Ctrl + ↓』に該当するメソッドで、データが繋がっている部分における最終行を取得することができます。で、最後に『getRow』で行数を取得しているといった流れになります。

特定列の最終行を取得するGAS(全てデータが埋まっていない場合)

今度は、サンプルデータのC列の最終行(『10』を取得)する方法を考えてみます。
上記の、方法ですと、C1セルから『Ctrl + ↓』するとC2セルに移動してしまうので、取得できる最終行も『2』となってしまいます。

function lastrow_test() {
  let sheet1 = SpreadsheetApp.getActiveSheet();

  //【ダメな例】C列の最終行の取得
  let lastrow1 = sheet1.getRange(1,3).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow();
  console.log("C列の最終行は、" + lastrow1 + "行目です。");
}

途中データが抜けていた場合でも最終行を取得するには、先頭行から『Ctrl + ↓』ではなく、最終行から『Ctrl + ↑』をして上げればなんだかうまく行きそうです。

function lastrow_test() {
  let sheet1 = SpreadsheetApp.getActiveSheet();

  // 表示されているスプレッドシートの最終行を取得(データありなし関係なく)
  let lastrow1 = sheet1.getMaxRows();

  //C列の最終行の取得
  let lastrow2 = sheet1.getRange(lastrow1,3).getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
  console.log("C列の最終行は、" + lastrow2 + "行目です。");
}

スプレッドシートの表示されているデータありなし関係ない最終行を取得するのは、『getMaxRowsメソッド』でしたね。それを利用して、一番下の行のC列部分から、上方向に『Ctrl + ↑』した流れになります。

注意点としては、『getMaxRowsメソッド』で取得した行に、データが存在していた場合、そこから上方向に『Ctrl + ↑』すると、次の区切り目まで行ってしまうので、必ずスプレッドシートの表示されている一番下の行は、空白である必要があります。

まとめ

最終行を取得する方法について、いくつかまとめさせてもらいました。
データがどのように入っているか、どの部分を最終行として取得したいかによって、使う方法が変わりますので、気をつけてください!

スポンサーリンク
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次