LANG SELRCT

コードを書く場所についてはこちら

2017年11月23日木曜日

データが入力されている最終行を取得する


テータ(値)が入力されている最終行を取得したい時にぶつかった壁があり
それを乗り越えた時に書いたコードです

以下の3つのパターンについて書きます

  1. シート内で値が入力されている最終行を取得する
  2. 特定の範囲で値が入力されている最終行を取得する
  3. 特定の列で値が入力されている最終行を取得する


例として以下のようなシートを使います



1. シート内で値が入力されている最終行を取得する


これが1番簡単で
シートを指定して.getLastRow()で取得できます


コード.gs
function get_last_row(){
  var last_row = SpreadsheetApp.getActiveSheet.getLastRow();
  Logger.log(last_row);
}
意訳.gs
この処理は以下を実行する
今開いているシートの値が入っている最終行を取得して
ログに出す



ログを見ると6(行目)が返ってきています
これはA列で値が入っている最終行の6行目を返しています




2. 特定の範囲で値が入力されている最終行を取得する




次にB列とC列の範囲内で
データが入力されている最終行を取得するコードの例です


コード.gs
function get_last_row() {
  var sh = SpreadsheetApp.getActiveSheet();
  var values = sh.getRange("B:C").getValues();
  for1:
  for (var i = values.length - 1; i >= 0; i--) {
    for(var j = 0; j < values[i].length; j++){
      if(values[i][j] != ""){
        break for1;
      }
    }
  }
  var row = i + 1;
  Logger.log(row);
}
意訳.gs
この処理は以下を実行する
今開いているシートの
B列からC列の範囲にある値をすべて取得して
1つ目のfor文にfor1というラベルを付けて
1つ目のfor文で一番下の行から上に向かって以下を繰り返す
2つ目のfor文で一行のセルの数だけ以下を繰り返す
セルの値が空でなければ
1つ目のfor文から抜ける

  
 
iは0から始まっているので i に1を足したものを行数として
ログに出す



ログを見ると4(行目)が返ってきています
これはB列で値が入っている最終行の4行目を返しています




3. 特定の列で値が入力されている最終行を取得する




最後はC列で
データが入力されている最終行を取得するコードの例です


コード.gs
function get_last_row() {
  var sh = SpreadsheetApp.getActiveSheet();
  var values = sh.getRange("C:C").getValues();
  for (var i = values.length - 1; i >= 0; i--) {
    if (values[i] != "") {
      break;
    }
  }
  var last_row = i + 1;
  Logger.log(last_row);
}
意訳.gs
この処理は以下を実行する
今開いているシートの
C列の値をすべて取得して
一番下の行から上に向かって以下を繰り返す
セルの値が空でなければ
for文から抜ける


iは0から始まっているので i に1を足したものを行数として
ログに出す



ログを見ると3(行目)が返ってきています
これはC列で値が入っている最終行の3行目を返しています







補足

上記をアレンジして、対象の列を列番号(Aは1, Bは2, Cは3...)で指定して、最終行の次の行を取得したい場合


コード.gs
function get_next_row(){
  var sh = SpreadsheetApp.getActiveSheet();
  var col = 3;
  var next_row = get_last_row(sh, col) + 1;
  Logger.log(next_row);
}

function get_last_row(sh, col) {
  var start_row = 1;
  var num_cols = 1;
  var sh_last_row = sh.getLastRow();
  var values = sh.getRange(start_row, col, sh_last_row, num_cols).getValues();
  for (var i = values.length - 1; i >= 0; i--) {
    if (values[i] != "") {
      break;
    }
  }
  var last_row = i + 1;
  return last_row;
}
意訳.gs
この機能がやること
対象のシートを取得する
対象の列を番号で指定する
その列に入力されている最終行を取得して1足して
ログに出す


この機能がやること
開始行をしていして
対象の列数をしていして
シート内でデータが入力されている最終行を取得して
範囲内の値を取得して
値の数だけシートの下から順番に以下を繰り返す(配列のindexを表すiは0始まりなので、最終行の数から1引いた数が配列内の最後のindex番号)
値が空じゃなかったら
for分から抜ける


iは配列内の要素のindex番号で、0始まりなので、実際の行数は+1して
返す




関連記事
データが入力されている最終行の次の行へカーソルを移動する



参考
https://developers.google.com/apps-script/reference/spreadsheet/sheet#getLastRow()