スプレッドシートの最終行・最終列を取得する方法を紹介します。
- 「特定列」の「最終行」
- 「特定行」の「最終列」
参考サイト:Re: 【GAS】指定行の最終列番号・指定列の最終行番号を取得する
特定列の最終行を取得する方法
A列の最終行を取得する方法です。2通りあります。
- 列の先頭行から下方向に取得する
- 列の最終行から上方向に取得する
コードの紹介です(解説は後の項でしますよ!)
1 2 3 4 5 6 7 8 9 10 |
//対象のシートを取得 var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('sample'); //①列の先頭行から下方向に取得する var lastRow1 = sheet.getRange(1, 1).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow(); Logger.log(lastRow1); //5 //②列の最終行から上方向に取得する var lastRow2 = sheet.getRange(sheet.getMaxRows(), 1).getNextDataCell(SpreadsheetApp.Direction.UP).getRow(); Logger.log(lastRow2); //8 |
特定行の最終列を取得する方法
1行目の最終列を取得する方法です。2通りあります。
- 行の先頭列から右方向に取得する
- 行の最終列から左方向に取得する
コードがこちら!
1 2 3 4 5 6 7 8 9 10 |
//対象のシートを取得 var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('sample'); //①行の先頭列から右方向に取得するコード var lastCol1 = sheet.getRange(1, 1).getNextDataCell(SpreadsheetApp.Direction.NEXT).getColumn(); Logger.log(lastCol1); //4 //②行の最終列から左方向に取得するコード var lastCol2 = sheet.getRange(1, sheet.getMaxColumns()).getNextDataCell(SpreadsheetApp.Direction.PREVIOUS).getColumn(); Logger.log(lastCol2); //7 |
getNextDataCellメソッドとは?
ポイントは、RangeオブジェクトのgetNextDataCellメソッドです。
Rangeオブジェクト.getNextDataCell(direction)
指定の方向(direction)の次のセルを返します。データが含まれる連続したセル範囲の端、または、その方向のスプレッドシートの端のセルです。これは、スプレッドシート上のCtrl+[矢印キー]と同じ動作です。
引数directionに指定できるのは下記の4種類です。
引数 | 説明 |
---|---|
SpreadsheetApp.Direction.DOWN | 下方向(行インデックスの増加) |
SpreadsheetApp.Direction.UP | 上方向(行インデックスの減少) |
SpreadsheetApp.Direction.NEXT | 右方向(列インデックスの増加) |
SpreadsheetApp.Direction.PREVIOUS | 左方向(列インデックスの減少) |
DOWNとNEXTを使用するときの注意点
スプレッドシート全体でA1セルのみに値が入ってる状態で、DirectionにDOWNとNEXTを指定すると、
- DOWN → A列の”シート全体の”最終行が取得される
- NEXT → 1行目の”シート全体の”最終列が取得される
※これはgetNextDataCellメソッドが、スプレッドシートの[Ctrl + 矢印キー]と同じ挙動をするためです。
また、途中で空白セルが存在する場合、空白セルの前のセルを取得します。
よって、下方向の検索(DOWN)・右方向の検索(NEXT)は以下の場合のみ使用しましょう。
- 最低でも2行(2列)以上、存在する
- データの途中に空白セルが存在しない
コードの解説
「A列の最終行から上方向に取得するコード」を、3つの処理に分解します。
- A列の”シート全体の”最終行のセルを取得する
→ getMaxRows():スプレッドシート全体の最終行を取得するメソッド - A列の最終セルでCtrl+↑を押した時に選択されるセルを取得
- ②で取得したセルの行番号を取得(getRow)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
function myFunction() { //対象のシートを取得 var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('sample'); //処理①A列の最終行のセルを取得(デフォルト1,000行) var maxRng = sheet.getRange(sheet.getMaxRows(), 1); Logger.log(maxRng.getA1Notation()); //A1000 //処理②maxRngのセル(=A1000セル)で[Ctrl+↑]を押したときに選択されるセルを取得 var lastRng = maxRng.getNextDataCell(SpreadsheetApp.Direction.UP); Logger.log(lastRng.getA1Notation()); //A8 //処理③lastRngの行番号を取得 var lastRow = lastRng.getRow(); Logger.log(lastRow); //8 } |
以上の3つの処理を1行(※)で書くとこうなります!(※sheetを取得する処理は除く)
1 2 3 4 5 6 7 8 9 |
function myFunction() { //対象のシートを取得 var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('sample'); var lastRow = sheet.getRange(sheet.getMaxRows(), 1).getNextDataCell(SpreadsheetApp.Direction.UP).getRow(); Logger.log(lastRow); //8 } |
サンプルコード
サンプルコードをいくつか作ってみました。ポイントはgetRangeメソッドの行・列の指定が変わるだけですね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
function myFunction() { var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('sample'); //C列の最終行を下方向に検索 var lastRow1 = sheet.getRange(1, 3).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow(); //B列の最終行を上方向に検索 var lastRow2 = sheet.getRange(sheet.getMaxRows(), 2).getNextDataCell(SpreadsheetApp.Direction.UP).getRow(); //5行目の最終列を右方向に検索 var lastCol1 = sheet.getRange(5, 1).getNextDataCell(SpreadsheetApp.Direction.NEXT).getColumn(); //4行目の最終列を左方向に検索 var lastCol2 = sheet.getRange(4, sheet.getMaxColumns()).getNextDataCell(SpreadsheetApp.Direction.PREVIOUS).getColumn(); } |
コードまとめ
GASで、スプレッドシートの「特定列の最終行」「特定行の最終列」を取得する方法を紹介しました。
getLastRowメソッド,getLastColumnメソッドでは目的の値が取得できない…って場合に、ぜひ使ってみてくださいね。
コードのまとめです!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
function myFunction() { var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('sample'); //A1セルから[Ctrl + ↓] var lastRow1 = sheet.getRange(1, 1).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow(); //A列の最終行のセルから[Ctrl + ↑] var lastRow2 = sheet.getRange(sheet.getMaxRows(), 1).getNextDataCell(SpreadsheetApp.Direction.UP).getRow(); //A1セルから[Ctrl + →] var lastCol1 = sheet.getRange(1, 1).getNextDataCell(SpreadsheetApp.Direction.NEXT).getColumn(); //1行目の最終列のセルから[Ctrl + ←] var lastCol2 = sheet.getRange(1, sheet.getMaxColumns()).getNextDataCell(SpreadsheetApp.Direction.PREVIOUS).getColumn(); } |