※本記事はプロモーションを含みます
目次
横に伸びる表の右端を知りたい
Google Apps ScriptであるGASを使ってツールとしてのスプレッドシートを操作する時に、データが入力されている範囲を動的に把握することは重要です。ただし、スプレッドシートでデータが存在する最終列を取得する技術は、横方向にデータが追加されるシートを扱う場面で役立ちます。
あらかじめ列数が固定されている表であれば、直接数値を指定して処理を行うことも可能です。なので、運用が進むにつれて列数が増減するスプレッドシートで固定値を用いると、新しいデータが処理から漏れる原因になります。というのは、データがない空の列に対して無駄な処理を行ってエラーが発生することもあるからです。ただし、GASの組み込みメソッドを用いて動的に最終列を判定するアプローチをとれば、この問題を解決できます。
今のシートの最終列
実際にスプレッドシートの最終列を取得するためのコードを紹介します。なので、以下のコードはそのまま使用して実行しましょう。
const sheet = SpreadsheetApp.getActiveSheet();
const lastCol = sheet.getLastColumn();
Logger.log(lastCol);
getLastColumn が返す数字
1行ずつ確認しましょう。
- 1行目:
const sheet = SpreadsheetApp.getActiveSheet();
GASからスプレッドシートにアクセスするための基本クラスであるSpreadsheetAppを呼び出し、getActiveSheet()メソッドによって、現在アクティブになっている(選択されている)シートのオブジェクトを取得します。このシートオブジェクトを変数sheetに格納しています。 - 2行目:
const lastCol = sheet.getLastColumn();
先ほど取得したシートオブジェクトに対して、getLastColumn()メソッドを実行しています。これが今回のメインとなる処理です。このメソッドは、シート上でデータが存在する最も右側の列を判定し、その列番号(A列なら1、B列なら2、C列なら3…という数値)を返します。取得した数値は変数lastColに格納されます。 - 3行目:
Logger.log(lastCol);
取得した最終列の数値を、GASの実行ログに出力して確認するためのコードです。開発中のデバッグや、正しく値が取得できているかのテストとして機能します。
値だけでなく書式も見る
getLastColumn() メソッドの実行結果を正確に活用するために、仕様を確認しましょう。ただし、ただ単に一番右のデータを取得するだけでなく、重要なルールが存在します。
「最も右側」の基準はデータと「書式」
getLastColumn() メソッドは、シート内でデータや書式が存在する最も右側の列番号を返します。なので、セルにテキストや数値が入力されている場合はもちろんのこと、セルが空であっても背景色や罫線や文字色が設定されているセルはデータが存在するとみなされます。
途中の空白列の扱い(行取得との共通点)
データが連続していない場合の挙動も確認しましょう。というのは、行を取得する時と同様に、途中の空白列も判定範囲に含まれるからです。
例えば、以下のようなデータ配置について考えましょう。
| A列 (1) | B列 (2) | C列 (3) | D列 (4) | E列 (5) |
|---|---|---|---|---|
| データあり | データあり | (完全な空白) | データあり | (完全な空白) |
この場合、最も右側にデータが存在するのはD列の4列目です。ただし、途中のC列である3列目が全くの空白であっても、D列にデータがある限り getLastColumn() メソッドは4を返します。なので、途中の空白列によって取得結果が分断されることはありません。
なお、GASではアルファベットの列名ではなく、整数値であるインデックスで列を扱います。無料枠や利用容量の表示は公式サイトでの表記が優先されます。
横方向レポートの終端
最終列の取得は、実務のさまざまな場面で役立ちます。なので、頻繁に利用される具体的な例を確認しましょう。
1. ループ処理の終了条件としての利用
列単位でデータを順番に検証する際、for 文などのループ処理を実行します。ただし、無限ループを防ぎつつデータを処理するための終了条件として lastCol 変数が活用できます。
const lastCol = sheet.getLastColumn();
// 1列目(A列)から最終列まで順番に処理を実行する
for (let col = 1; col <= lastCol; col++) {
// 各列に対する具体的な処理ロジックをここに記述
}
このように記述することで、将来的にスプレッドシートの列が増減してもコードを書き換える必要がなくなります。なので、自動的にすべての列を処理対象に含めることができます。
2. 横方向にデータを展開するレポート作成
実務においては、日ごとの売上推移や月別のアクセス解析などで横方向にデータを展開するレポートを作成します。なので、新しい日のデータを追記する際は lastCol + 1 を指定しましょう。というのは、既存データを上書きすることなく安全に右端へ新しいデータを追加できるからです。
右端の塗り残しを疑う
便利な getLastColumn() メソッドですが、注意点が存在します。ただし、あらかじめ仕様を理解しておけば問題ありません。
意図せずシートの端に不要なデータが残っていると、大きな数値が返されてしまいます。なので、実行結果を事前に確認しましょう。
ゴミデータとは何か?
ここで言うゴミデータとは、人間の目では気づきにくい要素を指します。なので、以下の内容を確認しましょう。
- スペース(空白文字)だけが入力されているセル
- 過去にデータを入力して消したものの、背景色や罫線などの「書式」だけが残っているセル
- データのインポート等で生成された、見えない制御文字が含まれるセル
例えば、本来の有効なデータがF列の6列目までしかない状態を想定します。ただし、過去の編集によりZ列の26列目に背景色が設定されていると、getLastColumn() メソッドは26を返します。なので、そのままループ処理を実行すると、無駄な空白列に対しても処理が走りタイムアウトのエラーが発生します。
エラーを防ぐための対策とロジック
このエラーを回避するために、処理前に不要な列をクリアするロジックを導入しましょう。なので、以下の対策を実施しましょう。
- 定期的なシートの初期化: バッチ処理の冒頭で、データが存在するべき範囲外の列に対して
sheet.getRange(...).clear()やclearFormats()を実行し、不要な書式やゴミデータを完全に削除しておく設計にする。 - 配列内での空判定処理の追加: 取得した最終列までのデータを二次元配列として一括取得したのち、JavaScript側のループ処理内で「その列が本当に有効なデータを持っているか(空文字やNullではないか)」をチェックする
if文を挟むことで、空の列を安全にスキップする。
使う前にゴミ列を消す
GASを用いたスプレッドシートの最終列の取得は、getLastColumn() メソッドを呼び出すことで実現できます。ただし、途中の空白列を含んでカウントされる仕様や書式もデータとして認識される仕様を正しく理解する必要があります。というのは、仕様の理解が不足していると意図しないバグに直面するからです。
不要なデータという落とし穴に注意を払い、適切なクリアロジックやデータ検証処理と組み合わせましょう。なので、列方向へのループ処理やデータの動的追加をマスターして、業務の効率化を目指しましょう。

