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

投稿更新日: 2026/9/2

サムネイル

Google Apps Script(GAS)でスプレッドシートを操作するとき、最初につまずきやすいのが「特定の列の値をどうやって取得するのか」です。

たとえば、次のような案件一覧の表があるとします。

A列B列C列D列E列
案件ID案件名ステータス担当者更新日時
P001Webサイト制作対応中田中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() の列番号12345

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() の列番号1123
配列のインデックス0012

ここはGASで特に間違えやすいポイントです。

シート上のC列:列番号3
配列内のC列 :インデックス2

getValues()と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でスプレッドシートの列を読む基本は、次の流れです。

  1. getSheetByName() で対象シートを取得する
  2. getRange() でセルや範囲を指定する
  3. 1セルなら getValue()、複数セルなら getValues() を使う
  4. データ件数が変わる場合は getLastRow() で最終行を求める
  5. 取得結果が二次元配列であることを意識する
  6. 複数行は一括取得し、配列内で処理する

まずは列番号を使った取得方法を理解することが、GASで表を扱う第一歩です。

ただし、列番号を固定したコードは列追加や並べ替えに弱いという課題があります。運用中に表の構成が変わる可能性があるなら、後編:ヘッダー名から列を特定する方法へ進みましょう。

参考

この記事をシェアする

合同会社raisexでは一緒に働く仲間を募集中です。

ご興味のある方は以下の採用情報をご確認ください。