GASで列の値を取得するには?スプレッドシートの列データを読み込む基本

Google Apps Script(GAS)でスプレッドシートを操作するとき、最初につまずきやすいのが「特定の列の値をどうやって取得するのか」です。
たとえば、次のような案件一覧の表があるとします。
| A列 | B列 | C列 | D列 | E列 |
|---|---|---|---|---|
| 案件ID | 案件名 | ステータス | 担当者 | 更新日時 |
| P001 | Webサイト制作 | 対応中 | 田中 | 2026/08/20 |
| P002 | アプリ改修 | 完了 | 鈴木 | 2026/08/25 |
| P003 | データ移行 | 未着手 | 佐藤 |
この表から、次のような処理を作りたいケースは多いでしょう。
- C列のステータスを取得する
- 「完了」した案件だけを抽出する
- D列の担当者を一覧にする
- 最終行までのデータをまとめて読み込む
この記事では、セルや列の範囲を指定する getRange() と、値を取得する getValue()・getValues() の基本を解説します。
まずは1つのセルを取得してみよう
現在開いているスプレッドシートから「案件一覧」シートを取得し、C2セルの値をログへ出力します。
function getStatus() {
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const sheet = spreadsheet.getSheetByName('案件一覧');
const status = sheet.getRange('C2').getValue();
console.log(status);
}Apps Scriptのエディタで getStatus() を選んで実行すると、C2セルの値を実行ログで確認できます。
実行結果は次のようになります。
対応中コードを分解すると、それぞれの役割は次のとおりです。
const range = sheet.getRange('C2');
const status = range.getValue();getRange('C2'):C2セルを操作対象として選ぶgetValue():選んだセルの値を1つ取得する
getRange() は、スプレッドシート上の場所を指定するメソッドです。getValue() は、その場所に入っている値を取り出すメソッドです。
範囲の指定には2つの書き方がある
A1形式で指定する
スプレッドシートの画面と同じように、列をアルファベット、行を数字で指定します。
sheet.getRange('C2');
sheet.getRange('C2:C4');短い範囲を直接指定するときは、見た目で位置を把握しやすい書き方です。
行番号と列番号で指定する
getRange() には、行番号や列番号を数値で渡すこともできます。
sheet.getRange(2, 3);引数は「行、列」の順です。
getRange(行番号, 列番号)C2セルなら、2行目・3列目なので getRange(2, 3) となります。
| 列 | A列 | B列 | C列 | D列 | E列 |
|---|---|---|---|---|---|
getRange() の列番号 | 1 | 2 | 3 | 4 | 5 |
GASで行数や列数を計算して範囲を変えたい場合は、数値で指定する書き方が便利です。
複数セルはgetValues()で取得する
C2からC4までを一括で取得してみましょう。
function getStatuses() {
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const sheet = spreadsheet.getSheetByName('案件一覧');
const statuses = sheet.getRange('C2:C4').getValues();
console.log(JSON.stringify(statuses));
const secondStatus = statuses[1][0];
console.log(secondStatus);
}Apps Scriptのエディタで getStatuses() を実行すると、C2からC4までの値と、その中の2件目の値を実行ログで確認できます。
取得結果は、次のような二次元配列になります。
[
['対応中'],
['完了'],
['未着手'],
]1列しか取得していなくても、結果は単純な文字列配列ではありません。「行の配列」を複数持つ二次元配列です。
外側の配列:複数の行
内側の配列:その行に含まれる複数の列関数内では、2件目の値を statuses[1][0] で取得しています。JavaScriptの配列は0から数えるため、statuses[1] は配列内の2件目、[0] はその行の1列目です。
データがある最終行まで取得する
実際の表では、データ件数が増減します。C2:C1000 のように終端を固定すると、不要な空白セルまで取得したり、1001行目以降のデータを取りこぼしたりします。
そこで、getLastRow() を使って値が入っている最後の行を取得します。
const lastRow = sheet.getLastRow();1行目がヘッダー、2行目以降がデータなら、データの行数は次の式で求められます。
const headerRow = 1;
const firstDataRow = headerRow + 1;
const rowCount = lastRow - headerRow;C列のデータを最終行まで取得するコードは次のとおりです。
function getStatusValues() {
const sheet = SpreadsheetApp
.getActiveSpreadsheet()
.getSheetByName('案件一覧');
const headerRow = 1;
const firstDataRow = headerRow + 1;
const statusColumn = 3;
const lastRow = sheet.getLastRow();
if (lastRow < firstDataRow) {
return [];
}
const rowCount = lastRow - headerRow;
const values = sheet
.getRange(firstDataRow, statusColumn, rowCount, 1)
.getValues();
console.log(JSON.stringify(values));
}Apps Scriptのエディタで getStatusValues() を実行すると、次のような内容を実行ログで確認できます。
[["対応中"],["完了"],["未着手"]]データ行がないときに getRange() を呼ばないよう、先に lastRow を確認している点もポイントです。
1列の二次元配列を扱いやすい形にする
前の関数が返す値は、次のような二次元配列です。
[
['対応中'],
['完了'],
['未着手'],
]1列分の値だけを扱いたい場合は、map() で一次元配列へ変換できます。
function getStatusesAsArray() {
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const sheet = spreadsheet.getSheetByName('案件一覧');
const headerRow = 1;
const firstDataRow = headerRow + 1;
const statusColumn = 3;
const lastRow = sheet.getLastRow();
if (lastRow < firstDataRow) {
return [];
}
const rowCount = lastRow - headerRow;
const statusValues = sheet
.getRange(firstDataRow, statusColumn, rowCount, 1)
.getValues();
const statuses = statusValues
.map((rowValues) => rowValues[0]);
console.log(JSON.stringify(statuses));
}Apps Scriptのエディタで getStatusesAsArray() を実行すると、C列のデータを一次元配列として取得できます。
['対応中', '完了', '未着手']map() で各行の先頭要素を取り出しています。
行全体を取得して特定の列を読む
「ステータスが完了した案件名を取得したい」という処理では、案件名とステータスの両方が必要です。この場合は表をまとめて取得し、各行の配列から目的の列を読みます。
function getCompletedProjectNames() {
const sheet = SpreadsheetApp
.getActiveSpreadsheet()
.getSheetByName('案件一覧');
const firstDataRow = 2;
const lastRow = sheet.getLastRow();
const lastColumn = sheet.getLastColumn();
if (lastRow < firstDataRow || lastColumn === 0) {
return [];
}
const rowCount = lastRow - firstDataRow + 1;
const values = sheet
.getRange(firstDataRow, 1, rowCount, lastColumn)
.getValues();
const projectNameIndex = 1; // B列
const statusIndex = 2; // C列
const completedProjectNames = values
.filter((rowValues) => rowValues[statusIndex] === '完了')
.map((rowValues) => rowValues[projectNameIndex]);
console.log(JSON.stringify(completedProjectNames));
}getCompletedProjectNames() を実行すると、「完了」の案件名が次のように実行ログへ表示されます。
["アプリ改修"]getRange() の列番号は1から始まりますが、getValues() で取得したJavaScriptの配列は0から始まります。
| 対象 | 開始番号 | A列 | B列 | C列 |
|---|---|---|---|---|
getRange() の列番号 | 1 | 1 | 2 | 3 |
| 配列のインデックス | 0 | 0 | 1 | 2 |
ここはGASで特に間違えやすいポイントです。
シート上のC列:列番号3
配列内のC列 :インデックス2getValues()とgetDisplayValues()の違い
値の取得には getDisplayValues() も利用できます。
const values = range.getValues();
const displayValues = range.getDisplayValues();getValues() は、数値や日付、真偽値などの型を保った値を返します。一方、getDisplayValues() は、シート上に表示されている形式の文字列を返します。
たとえば、日付が入ったセルでは次のような違いがあります。
const rawValue = sheet.getRange('E2').getValue();
// Dateオブジェクト
const displayValue = sheet.getRange('E2').getDisplayValue();
// '2026/08/20' など、表示形式に従った文字列日付の計算や数値の集計を行うなら getValues()、画面に見えている文字列をそのまま扱いたいなら getDisplayValues() が向いています。
まとめ:範囲を決めてから値を取得しよう
GASでスプレッドシートの列を読む基本は、次の流れです。
getSheetByName()で対象シートを取得するgetRange()でセルや範囲を指定する- 1セルなら
getValue()、複数セルならgetValues()を使う - データ件数が変わる場合は
getLastRow()で最終行を求める - 取得結果が二次元配列であることを意識する
- 複数行は一括取得し、配列内で処理する
まずは列番号を使った取得方法を理解することが、GASで表を扱う第一歩です。
ただし、列番号を固定したコードは列追加や並べ替えに弱いという課題があります。運用中に表の構成が変わる可能性があるなら、後編:ヘッダー名から列を特定する方法へ進みましょう。
参考
この記事をシェアする
合同会社raisexでは一緒に働く仲間を募集中です。
ご興味のある方は以下の採用情報をご確認ください。