セルを1個ずつ読まない
Google Apps Script(GAS)を用いて業務効率化や自動化システムを構築する際、スプレッドシートからデータを取得する処理は避けて通れません。特に実務においては、単一のセルではなく「複数行・複数列のまとまったデータ」を扱うケースが圧倒的に多くなります。
GASを用いてスプレッドシートのデータを二次元配列として一括取得する最も標準的かつ効果的な手法について解説します。この技術はデータ処理の基本であり、大規模データを扱う際の必須テクニックとなります。コードと、空行や日付の型でずれる点を書きます。
データがある範囲を表示どおり欲しいときは getDisplayValuesて取る
まずは、スプレッドシートに記述されているデータ全体を一括で取得する基本的なコードを見てみましょう。以下のコードはそのまま置いて実行することが可能です。
const sheet = SpreadsheetApp.getActiveSheet();
const values = sheet.getDataRange().getValues();
Logger.log(values);
getDataRange のあとに getValues
たった3行のシンプルなコードですが、内部的には非常に強力な処理が行われています。それぞれの行がどのような役割を果たしているのかを詳しく見ていきましょう。
- 1行目:
const sheet = SpreadsheetApp.getActiveSheet();
現在アクティブになっている(開かれている)スプレッドシートのシートオブジェクトを取得し、定数sheetに格納しています。特定のシートをシート名で指定したい場合はgetSheetByName('シート名')を使用することも可能です。 - 2行目:
const values = sheet.getDataRange().getValues();
ここが本記事の最重要ポイントです。getDataRange()は、データが存在する範囲全体(A1セルからデータが入っている右下端のセルまで)を自動的に認識して取得するメソッドです。そして、それに続くgetValues()によって、その範囲内のすべてのデータ値を二次元配列として一括で取り出し、定数valuesに格納しています。 - 3行目:
Logger.log(values);
取得した二次元配列のデータをGASのエディタ上のログに出力します。これで、実際にどのようなデータが取得できたかを確認することができます。
呼び出し回数を1回にする
GASにおいて、スプレッドシートのデータを取得する手段は複数存在しますが、複数データを扱う場合は必ず getValues() を使用して二次元配列として取得するべき明確な理由があります。
1. 高速化の要:一括取得による処理速度向上
GAS開発において最も意識すべきポイントの一つが「処理速度」です。GASには実行時間制限(通常のアカウントで6分間)が設けられており、非効率なコードを書くとタイムアウトエラーを引き起こします。
よく初学者がやってしまうミスとして、forループなどの繰り返し処理の中で getValue() を呼び出し、セルを1つずつ読み取っていく実装があります。GASからスプレッドシートへのアクセス(API呼び出し)は非常にコストが高く時間がかかる処理です。ループ内で getValue() を1000回繰り返すと、API呼び出しも1000回発生し、処理が極端に遅くなります。
一方、getValues() を用いて一括取得を行えば、API呼び出しはたったの1回で済みます。ループ内で getValue() を繰り返すより、getValues() で一括取得する方が数十倍から、データ量によっては数百倍も高速になります。大規模データを扱う際の必須テクニックと言われるのはこのためです。
2. 配列構造:0始まりのインデックスに注意
getValues() で取得したデータは「二次元配列」という形式で格納されます。二次元配列とは、配列の中にさらに配列が入っているデータ構造のことです。スプレッドシートの「行と列」の概念をそのままプログラムの世界に持ち込んだものと考えると理解しやすいでしょう。
注意すべき仕様として、JavaScript(GAS)の配列インデックスは「0」から始まります。取得したデータにアクセスする際は、values[行インデックス][列インデックス] のように記述しますが、スプレッドシートの行番号・列番号とは「1」ズレる点に細心の注意を払ってください。
| スプレッドシートのセル | 二次元配列でのアクセス方法 |
|---|---|
| A1(1行目・1列目) | values[0][0] |
| B1(1行目・2列目) | values[0][1] |
| A2(2行目・1列目) | values[1][0] |
メモリ上で絞ってから書き戻す
二次元配列として一括取得したデータは、様々な実務シーンで活用されます。具体的な活用例をいくつか紹介します。
特定の条件に合致するデータのみを抽出する
取得した二次元配列に対して、JavaScriptの強力な配列操作メソッド(filter や map など)を適用することで、高度なデータ処理が可能です。たとえば、顧客名簿のデータから「契約中の顧客」のみを抽出して別のシートに転記する、といった処理も、メモリ上(配列上)で行うことで一瞬で完了します。
データの一括置換やフォーマット変更
スプレッドシート上のデータを一括で読み込み、プログラム内で文字列の置換や日付フォーマットの変更を行った後、setValues() を用いて再度スプレッドシートへ一括書き込みを行う手法です。読み込み時と同様に、書き込み時も setValues() で一括処理を行うことで処理時間を大幅に削減できます。
空行は空文字のまま入る
二次元配列の扱いでつまずきやすいポイントとその対策を解説します。
空白セルや空行が含まれる場合の挙動
getDataRange() はデータが存在する最も外側の範囲を取得しますが、その範囲内に「完全な空白行」や「空白セル」が含まれている場合、二次元配列の中には空文字("")として格納されます。データ処理を行うループの中で「値が空の場合はスキップする」といった if (values[i][j] === "") { continue; } のような条件分岐を入れておかないと、予期せぬエラーを引き起こす原因となります。
日付データや数値の型に注意
スプレッドシート上で「日付」や「通貨」としてフォーマットされているセルを getValues() で取得すると、GAS側では自動的にJavaScriptの Date オブジェクトや Number 型として解釈されます。もし、画面に表示されている通りの「文字列」としてそのまま取得したい場合は、getValues() ではなく getDisplayValues() を使用するというテクニックも併せて覚えておくと実務で非常に役立ちます。
表示どおり欲しいときは getDisplayValues
GASにおいてスプレッドシートの複数データを取得する際は、getValues() を用いて二次元配列として一括取得することが鉄則です。API呼び出しの回数を減らすことで処理速度が劇的に向上し、大規模データの処理もスムーズに行うことができます。配列のインデックスが「0始まり」である点や、空白セルの扱いに注意しながら、より高度で実用的なGASスクリプトの開発に役立ててください。

