※2019/9/4追記:もっと便利な書き方を見つけました!
スプレッドシートで最終行・最終列を取得したい!ことってありますよね
sheetオブジェクト.getLastRow()
スプレッドシートのデータ範囲の最終行を取得する
sheetオブジェクト.getLastColumn()
→スプレッドシートのデータ範囲の最終列を取得する
このメソッドを使用して、スプレッドシートを検索してみます。
コードがこちらです。「最終行=7」と「最終列=5(E列)」が取得できます。
1 2 3 4 5 6 7 8 9 |
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート1'); function main() { //シート全体の「最終行」と「最終列」を取得 Logger.log(sheet.getLastRow());// 7 Logger.log(sheet.getLastColumn());// 5 } |
B列の最終行は?とか、
3行目の最終列は?が知りたいぞ
「特定の列」の最終行の行番号を取得する
関数を作ってみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
/** * 指定列の「最終行の行番号」を返す * * @param {number} 列番号 * @return {number} 最終行の行番号 */ function findLastRow(col) { //指定の列を二次元配列に格納する※シート全体の最終行までとする var ColValues = sheet.getRange(1, col, sheet.getLastRow(), 1).getValues(); Logger.log(ColValues);// [[列2], [2], [2], [2], [2], [], []] //二次元配列のなかで、データが存在する要素のlengthを取得する var lastRow = ColValues.filter(String).length; return lastRow;// 5 } |
B列の最終行=5が取得できました。
filterメソッドを使用しています。引数にStringを与えると、データが存在する要素のlengthを取得できます。
Arrayオブジェクト.filter()
→配列の内容を特定の条件で絞り込む
「特定の行」の最終列の列番号を取得する
こちらも関数を作ってみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
/** * 指定行の「最終列の列番号」を返す * * @param {number} 行番号 * @return {number} 最終列の列番号 */ function findLastCol(row) { // 指定の行を二次元配列に格納する ※シート全体の最終行までとする var RowValues = sheet.getRange(row, 1, 1, sheet.getLastColumn()).getValues(); Logger.log(RowValues);// [[1, 2, 3, 4, ]] //二次元配列を一次元配列に変換する RowValues = Array.prototype.concat.apply([], RowValues); Logger.log(RowValues);// [1, 2, 3, 4, ] var lastCol = RowValues.filter(String).length; return lastCol;// 4 } |
3行目の最終列=4(D列)が取得できます。
空白セルがある場合も取得できる?
このように、途中に「空白セル」がある場合を試してみました。
コードがこちらです。関数findLastRowとfindLastColの中身は、上で示したコードと同じです。
1 2 3 4 5 6 7 8 9 |
function main() { //2列目(B列)の最終行の行番号を取得する Logger.log(findLastRow(2));// 6 //3行目の最終列の列番号を取得する Logger.log(findLastCol(3));// 5 } |
最終行と最終列ではありませんね・・・。
逆向きループで取得してみる
データを少し変えてみました。※getLastColumn()で取得する最終列は8です。
3行目の最終列番号「6」を取得するコードがこちら。
1 2 3 4 5 6 7 8 9 10 11 |
function findLastCol2(row) { var RowValues = sheet.getRange(row, 1, 1, sheet.getLastColumn()).getValues(); var maxIndex = RowValues[0].length-1; for(var i=maxIndex; i>=0; i--) { if(RowValues[0][i] !== "") {//ここが最終列 return i+1;//配列の要素番号は0から始まるので、+1して列番号にする } } } |
【処理の概要】
getLastColumn()で取得する最終列(8)までの1行を、二次元配列RowValuesに格納する。
配列の中身を逆向きループでチェックし、もし空でなければ、その要素番号が最終列となる。
ただし、要素番号は0から始まるので、スプレッドシートの列番号に合わせるため+1する。
【追記】1行で書ける方法
※2019/9/4追記:こちらも併せてご覧ください!