GASでスプレッドシートを扱う際に、最終行もしくは最終列を取得したいと思ったことはありませんか?
最終行(最終列)を取得できると以下のようなメリットがあります。
- 最終行(最終列)の値を取得/代入できる
- 最初の行(列)から最終行(最終列)までの全てのデータを取得/代入できる
- 行数分の繰り返し処理を行える
- 最終行を起点として書き込み位置を指定できる
この記事では、スプレッドシートの最終行(最終列)を取得する方法を3つご紹介します。
- スプレッドシート全体の行数(列数)を取得したい
- データが存在する最終行(最終列)を取得したい
- 特定の列の中でデータが存在する行を取得したい
まだ最終行(最終列)を取得したいと思ったことがなくても、この記事を読むことでGASの使い方に幅を持たせることができます。
ぜひ参考にしてみて下さい!
はじめに
最終行と最終列の取得方法はメソッドが異なるだけ
行と列で異なるのは、取得するときに使用するメソッドだけです。
しかも、行ならRow、列ならColumnにするだけなのでそんなに難しくないと思います。
この記事でご紹介するメソッドを行の場合と列の場合で表に記載しましたのでご参照ください。
最終行を取得する場合 | 最終列を取得する場合 |
---|---|
getMaxRows() | getMaxColumns() |
getLastRow() | getLastColumn() |
getNextDataCell(direction).getRow() | getNextDataCell(direction).getColumn() |
その他の基本的な操作は行でも列でも変わりないので、状況にあわせて使い分けて下さい。
以降、この記事では行の取得を例に説明したいと思います。
スプレッドシートの”最終行(最終列)”はどこを指すのか?
一言で”最終行(最終列)”といっても、場合によって場所が異なります。
具体的には以下のような3つのパターンが考えられます。
①シート全体の最終行を表す場合
データの有無に関わらず、シート内の1番下の行を表します。
例えば、下の図のようにシートの行数が100行の場合、シート全体の最終行は100行目になります。
このように、シート全体の最終行を取得したい場合にはgetMaxRow()メソッドを使用します。(詳細はこちら)
②シートの中でデータが存在する最終行を表す場合
前述の①では、データの有無に関わらず…でしたが、今回はシートの中でデータが存在する1番下の行を表します。
下の例では、Page1というデータがこのシートの中で1番下にあるデータです。
つまり、この場合の最終行は18行目になるということです。
このように、シートの中でデータが存在する最終行を取得したい場合にはgetLastRow()メソッドを使用します。(詳細はこちら)
③特定の列の中でデータが存在する最終行を表す場合
シートの中でもさらに範囲を狭めて、特定の列でデータが存在する1番下の行を表します。
例えば、A列に限定して考えた場合、データが存在する最終行は16行目になります。
つまり、前述の②のように離れ小島の位置にデータがあったとしても、それに影響されずに必要な最終行を取得できるということです。
この場合は、getNextDataCell()メソッドとgetRow()メソッドを使用します。(詳細はこちら)
①シート全体の最終行を取得する getMaxRows()
前述の通り、セル内のデータの有無に関わらず、シート内の1番下の行を取得したい場合は以下のメソッドを使用します。
Sheetオブジェクト.getMaxRows()
試しに、行数が100行のシートを使って最終行を取得して、ログに出力してみましょう。
サンプルコードです↓
function myFunction() {
let sheet = SpreadsheetApp.getActiveSheet(); //シートを取得
let max_row = sheet.getMaxRows(); //最終行を取得
console.log(max_row); //ログに出力
}
実行結果です↓
シートの1番下の行(100行目)が取得できていますね。
②シートの中でデータが存在する最終行を取得する getLastRow()
前述の通り、シートの中でデータが存在する1番下の行を取得したい場合は以下のメソッドを使用します。
Sheetオブジェクト.getLastRow()
※getLastColumn()で最終列を取得する場合、A列なら1、B列なら2のように、アルファベットではなく1からの連番で表されます。
試しに、以下のシートでデータのある最終行を取得して、ログに出力してみましょう。
サンプルコードです↓
function myFunction() {
let sheet = SpreadsheetApp.getActiveSheet(); //シートを取得
let last_row = sheet.getLastRow(); //最終行を取得
console.log(last_row); //ログに出力
}
実行結果です↓
最終行として18行目が出力されましたね。
つまり、getLastRow()ではデータが表の外にあろうが関係なく、データが存在する1番下の行を取得しているということです。
本当は表の1番下の行を取得したいのに…という方は、下記③をご参照下さい。
③特定の列の中でデータが存在する最終行を取得するgetNextDataCell(direction).getRow()
前述の通り、先程のgetLastRow()メソッドのように、本来の意図と異なるデータに邪魔される場合は特定の列を指定して、データが存在する1番下の行を取得します。
Rangeオブジェクト.
getNextDataCell(direction).getRow()
今回は少し複雑なので、getNextDataCell(direction)とgetRow()について先に解説します↓
指定した範囲の中に連続的にデータが入力されている場合、起点としたセルから最も端にあるセルを取得します。
(direction)部分には以下のいずれかを記載します。
行を取得する場合 | 列を取得する場合 |
---|---|
SpreadsheetApp.Direction.DOWN | SpreadsheetApp.Direction.NEXT |
SpreadsheetApp.Direction.UP | SpreadsheetApp.Direction.PREVIOUS |
事前に取得したセルの行数を取得します。getRowIndex()と記載することもあります。
予めセルを取得する必要があるため、getRange()やgetNextDataCell()と併用することが多いです。
試しに、A列の最終行を取得して、ログに出力してみましょう↓
サンプルコードです↓
function myFunction() {
let sheet = SpreadsheetApp.getActiveSheet(); //シートを取得
//↓A1セルを起点としてA列の最終行を取得
let last_row = sheet.getRange(1,1).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRowIndex();
console.log(last_row); //ログに出力
}
実行結果です↓
A列の最終行として16行目が取得できていますね。
Direction.DOWNとDirection.UPの使い分け
ところで、以下の図のように指定した範囲が途中で途切れている場合の最終行はどこになるのでしょうか?
試しに、先程と同じコードで最終行を取得してみました↓
function myFunction() {
let sheet = SpreadsheetApp.getActiveSheet(); //シートを取得
//↓A1セルを起点として下方向にA列の最終行を取得
let last_row = sheet.getRange(1,1).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRowIndex();
console.log(last_row); //ログに出力
}
実行結果です↓
ログの出力結果を見ると、8行目を最終行として取得していますね。
A1セルを起点として、8行目までは連続的にデータが入力されているため、正しい挙動です。
では、下段の表の最終行である17行目を取得するにはどうすれば良いのでしょうか。
下のサンプルコードを見て下さい↓
function myFunction() {
let sheet = SpreadsheetApp.getActiveSheet(); //シートを取得
let max_row = sheet.getMaxRows(); //シート自体の最終行(100行目)を取得
//↓A100セルを起点として上方向にA列の最終行を取得
let last_row = sheet.getRange(max_row,1).getNextDataCell(SpreadsheetApp.Direction.UP).getRowIndex();
console.log(last_row); //ログに出力
}
実行結果です↓
ログの出力結果を見ると、17行目を最終行として取得していますね。
今回は、予めgetMaxRows()でシート自体の最終行(100行目)を取得し、そこを起点に上方向に最終行を取得しているため、これも正しい挙動です。
Direction.DOWNとDirection.UPの違いは以下の図でイメージできると思います!
最終行が正しく取得できない場合
”メソッドは正しいのに、最終行が正しく取得できない”という場合には、以下の3パターンが考えられます。
①Rangeを指定してgetLastRow()メソッドを実行している
getLastRow()は、シートの中でデータが存在する最終行を取得するメソッドでしたね。
ですので、本来であればPage1というデータが入った18行目を取得するのが正しい挙動です。
ところが、Rangeを指定してからgetLastRow()メソッドを使用すると、指定した範囲の最終行を取得してしまいます。
下記の例では、A1〜G19の範囲を指定してgetLastRow()メソッドを使用していますので、19行目が誤った最終行として取得されてしまいます。
試しに、正しいコードと誤ったコードを比較してみましょう。
/*getLastRow()メソッドの正しい使い方*/
function myFunction() {
let sheet = SpreadsheetApp.getActiveSheet(); //シートを取得
let last_row = sheet.getLastRow(); //最終行を取得
console.log(last_row); //ログに出力
}
/*getLastRow()メソッドの誤った使い方*/
function myFunction() {
let sheet = SpreadsheetApp.getActiveSheet(); //シートを取得
let range = sheet.getRange('A1:G19'); //範囲(A1セル〜G19セル)を取得
let last_row = range.getLastRow(); //最終行を取得
console.log(last_row); //ログに出力
}
正しいコードでは18行目が取得できていますが、誤ったコードでは19行目が取得されていますね。
getLastRow()メソッドはSheetオブジェクトに使用し、Rangeオブジェクトには使用しないようにしましょう!
Sheetオブジェクト、Rangeオブジェクトが分からないという方はこちらの記事をどうぞ↓
②不要なデータが存在する
割とあるあるなパターンですが、シートの中でも見えない範囲にデータが隠れていることがあります。
出力結果で意図しない最終行が取得されていた場合は、不要なデータがシート内に隠れていないか確認しましょう。
非表示にしているセル内にデータが隠れていることもあるので要注意です!
③目で見て確認できないデータが存在する
”パッと見た感じ不要なデータは存在していない”という場合でも、スペースなどの目に見えないデータが埋め込まれている可能性があります。
目に見えなくてもデータがあれば最終行として取得してしまうので、注意が必要です。
こういった場合は、セル内のデータを消すか、行ごと削除してしまいましょう。
まとめ
今回は、『スプレッドシートの最終行・最終列を取得する方法』を3つご紹介しました。
- 最終行は場合によって異なる
- シート全体の最終行を取得 → getMaxRows()
- シートの中でデータが存在する最終行を取得 → getLastRow()
- 特定の列の中でデータが存在する最終行を取得 → getNextDataCell(direction).getRow()
それぞれを使い分けて、正しく最終行を取得できるようになりましょう!
コメント