Apps Scriptリファレンス: Apps Script Reference |障害・課題追跡: IssueTracker |Google Workspace: Status Dashboard - Summary

2016年6月15日水曜日

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

スプレッドシートに膨大なデータが入っている場合、新たにデータを入力したい空白セルまでスクロールするために、マウスやトラックパッドの操作で少し時間がかかってしまうことがあるかと思います。

そのスクロールのひと手間をコードで解決できないかと思って2パターンのコードを書きました。

(キーボードのショートカットでは⌘↓でできますがここではコードで実現する方法を書きます)

ひとつは列を決め打ちで指定して、その列でデータが入っている最終セルの行数を取得し、その次の行にカーソルを移動するものです。
もう一つは、スクリプトを実行した時にカーソルが置かれているセルの列を動的に取得して、同様に最終データ行の次のセルへカーソルを移動するというものです。
※どちらも空行を含まない前提です。


その1:A列の最終データ行を取得してカーソル移動する

対象の列をA列決め打ちで、カーソルを移動する例です。

ポイント
1. A列でデータが入っている最終行を取得します。
var last_row = sh.getRange("A:A").getValues().filter(String).length;

2. その次の行にカーソルを移動します。
sh.getRange((last_row + 1), 1).activate();

コード.gs
function colA_blank_cell() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sh = ss.getActiveSheet();
    var range = sh.getActiveRange();
    var last_row = sh.getRange("A:A").getValues().filter(String).length;
    sh.getRange((last_row + 1), 1).activate();
}


その2:実行した行の最終データを取得してカーソル移動する

対象の列を決め打ちではなく動的に取得して、カーソルを移動する例です。

実行する列をA列に限定せず、対象の列の最終データの行を取得する場合、まずはその列を特定する必要があります。
特定する一つの例として、getA1Notation()を利用しました。

ポイント
1. アクティブセルの番地を"A1"形式で取得します。
var value = range.getA1Notation();

2. 1で取得した値の数値を削除して列(アルファベットのみ)を取得します。
var col = value.replace(/[0-9]/g, "");

3. その列でデータが入っている最終行を取得して、その次の行にカーソルを移動します。
var last_row = sh.getRange(col + ":" + col).getValues().filter(String).length;
sh.getRange(col + (last_row + 1)).activate();

コード.gs
function col_blank_cell() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sh = ss.getActiveSheet();
    var range = sh.getActiveRange();
    var value = range.getA1Notation();
    var col = value.replace(/[0-9]/g, "");
    var last_row = sh.getRange(col + ":" + col).getValues().filter(String).length;
    sh.getRange(col + (last_row + 1)).activate();
}


おまけ
スクリプトエディタを開いて実行するというのも逆に手間がかかるので、メニューに追加して実行できるようにコードをまとめました。

シートに追加されるメニュー

下記コードをスクリプトエディタに保存すると、上記のメニューが追加されてメニューから一発でカーソル移動ができるようになります。

コード.gs
function onOpen() {
  SpreadsheetApp.getUi()
      .createMenu('SCRIPT')
      .addItem('A列の空白行', 'colA_blank_cell')
      .addItem('選択列の空白行', 'col_blank_cell')
      .addToUi();
}

function colA_blank_cell() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sh = ss.getActiveSheet();
    var range = sh.getActiveRange();
    var last_row = sh.getRange("A:A").getValues().filter(String).length;
    sh.getRange((last_row + 1), 1).activate();
}

function col_blank_cell() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sh = ss.getActiveSheet();
    var range = sh.getActiveRange();
    var value = range.getA1Notation();
    var col = value.replace(/[0-9]/g, "");
    var last_row = sh.getRange(col + ":" + col).getValues().filter(String).length;
    sh.getRange(col + (last_row + 1)).activate();
}


追記 指定した列でデータが入っている最終行を取得する
空行を含む場合に意図しない動作とならないよう、列内のすべての値を下から上へ地道に見て行く方法です。
function get_last_data_row() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getActiveSheet();
  var values = sh.getRange("A:A").getValues();
  for (var i = values.length - 1; i >= 0; i--) {
    if (values[i] != "") {
      break;
    }
  }
  var last_row = i + 1;
  Logger.log(last_row);
}



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

Latest post

Googleドキュメントに見出しを追加したい

今回の例では、ドキュメントの末尾に「見出しD」 を追加します。 見出しA, B, C, Dのスタイルは、見出し3 ( HEADING3 ) に設定しています。  下記Code.gsの  GOOGLE_DOCUMENT_URL を設定して  addHeadingToEnd()  を...