GASのgetValuesと
getDisplayValuesの違いと使い分け

日付が英語表記になる、金額のカンマが消える——スプレッドシートの値取得でよくあるつまずきは、getValues(生の値)とgetDisplayValues(見た目どおりの文字列)の違いを知れば解決します。動くコードで使い分けを解説します。

|対象: GAS / スプレッドシート / 値の取得

Table of Contents

getValuesとgetDisplayValuesの違い

どちらも範囲(Range)の中身をまとめて取得するメソッドですが、返ってくるものが違います。getValues()はセルに入っている「生の値」を型のまま返します。日付はDateオブジェクト、数値はnumberです。一方getDisplayValues()は、表示形式(書式)を適用したあとに「画面に見えている文字列」を、すべてstringで返します。

getValues()

生の値。型が保たれる(Date / number / boolean)。計算・日付操作・条件分岐に向く。

getDisplayValues()

見た目どおりの文字列。書式適用済み。すべてstring。転記・表示・CSV出力に向く。

単数形のgetValue()/getDisplayValue()は左上の1セルだけを返します。複数セルを扱うときは複数形(末尾に s)を使い、二次元配列で受け取ります。

同じセルで結果がどう変わるか

日付・通貨・パーセントが入った同じ行を、両方のメソッドで取得して見比べると違いが一目でわかります。getValuesは生の値、getDisplayValuesは書式を適用した文字列を返します。

function compareValues() {
  const sheet = SpreadsheetApp.getActiveSheet();
  // A1: 日付(2026/07/25)  B1: 通貨(1,000円 と表示)  C1: パーセント(35% と表示)
  const range = sheet.getRange("A1:C1");

  const raw = range.getValues()[0];
  const shown = range.getDisplayValues()[0];

  Logger.log(raw);   // [Sat Jul 25 2026 ..., 1000, 0.35]  ← 生の値(Date/number)
  Logger.log(shown); // ["2026/07/25", "1,000円", "35%"]   ← 見た目どおりの文字列
}

ポイントは、パーセントのセルです。画面には「35%」と見えていても、生の値は0.35です。ここを取り違えると、計算結果が100倍ずれる原因になります。

見た目どおりに転記・表示する(getDisplayValues)

別シートへ「見た目のまま」写したいときや、メール本文・画面表示にそのまま使いたいときはgetDisplayValuesが便利です。日付や金額の書式を自分で作り直す必要がありません。

function copyAsShown() {
  const src = SpreadsheetApp.getActive().getSheetByName("元データ");
  const dst = SpreadsheetApp.getActive().getSheetByName("転記先");

  // 見た目(書式)をそのまま文字列として写したいときは getDisplayValues
  const shown = src.getDataRange().getDisplayValues();

  dst.clearContents();
  dst
    .getRange(1, 1, shown.length, shown[0].length)
    .setValues(shown);
}

ただし、転記先はすべて文字列になります。転記した先で再び計算に使う予定があるなら、この方法は向きません。その場合は次のgetValuesを使います。

計算するなら生の値(getValues)

合計・平均・比較などの計算をするならgetValues一択です。getDisplayValuesで取った「1,000」は文字列なので、+すると数値の足し算ではなく文字列の連結になってしまいます。

function sumAmount() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const values = sheet.getRange("B2:B100").getValues(); // 生の数値で取得

  let total = 0;
  values.forEach((row) => {
    const n = row[0];
    if (typeof n === "number") total += n; // 空セルや文字列は除外
  });

  // getDisplayValuesだと "1,000" のような文字列なので合算できない点に注意
  Logger.log("合計: " + total);
  return total;
}

空セルは""(空文字)として返るため、typeofで数値かどうかを確認してから加算すると安全です。

日付は生の値+formatDateが安全

日付を扱うとき、getValuesで取ったDateをそのまま別セルやメールに入れると「Sat Jul 25 2026 ...」という英語表記になりがちです。 セルの見た目でよければgetDisplayValuesが手軽ですが、書式を自分で決めたいなら、生の値をUtilities.formatDate(日付を指定書式の文字列に変換する関数)で整形するのが確実です。

function formatDateColumn() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const range = sheet.getRange("A2:A100");
  const values = range.getValues(); // Dateオブジェクトで取得
  const tz = Session.getScriptTimeZone(); // 例: Asia/Tokyo

  const formatted = values.map((row) => {
    const d = row[0];
    if (d instanceof Date) {
      return [Utilities.formatDate(d, tz, "yyyy年MM月dd日")];
    }
    return [row[0]]; // 日付でないものはそのまま
  });

  sheet.getRange(2, 2, formatted.length, 1).setValues(formatted); // B列に整形結果
}

タイムゾーンを指定しないと9時間ずれることがあるため、Session.getScriptTimeZone()"Asia/Tokyo"を必ず渡します。

CSV・帳票では表示値が便利

CSV出力やPDF帳票のように「シートで見えているとおり」に出したいケースではgetDisplayValuesが向きます。日付や金額の書式をコード側で組み直さずに済むためです。

function exportCsvAsShown() {
  const sheet = SpreadsheetApp.getActive().getSheetByName("請求一覧");
  const rows = sheet.getDataRange().getDisplayValues(); // 見た目どおりに出す

  const csv = rows
    .map((row) =>
      row
        .map((cell) => {
          const s = String(cell);
          // カンマ・改行・引用符を含むセルはダブルクォートで囲む
          return /[",\n]/.test(s) ? '"' + s.replace(/"/g, '""') + '"' : s;
        })
        .join(",")
    )
    .join("\n");

  const blob = Utilities.newBlob("\ufeff" + csv, "text/csv", "請求一覧.csv");
  DriveApp.createFile(blob); // BOM付きUTF-8で文字化けを防ぐ
}

先頭にBOM()を付けたUTF-8で保存すると、Excelで開いたときの文字化けを防げます。

数式セルの挙動とgetFormulas

数式が入ったセルでは、getValuesgetDisplayValuesも「計算結果」を返します。前者は数値、後者は書式適用後の文字列です。数式そのもの(=SUM(...))が欲しいときはgetFormulasを使います。

function readFormulas() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const range = sheet.getRange("D2:D10");

  const results = range.getValues();        // 数式の「計算結果」
  const shown = range.getDisplayValues();   // 計算結果を書式適用した文字列
  const formulas = range.getFormulas();     // "=SUM(...)" などの数式そのもの

  Logger.log(results[0][0]);  // 例: 3000
  Logger.log(shown[0][0]);    // 例: "3,000"
  Logger.log(formulas[0][0]); // 例: "=SUM(B2:C2)"
}

同じ範囲で両方いるなら、それぞれ1回ずつ

生の値と表示値の両方が必要なときは、ループの外でgetValuesgetDisplayValuesを1回ずつ呼び、配列に保持してから使います。ループの中で毎回呼ぶと、スプレッドシートへのアクセスが増えて遅くなります。

書式が付いていなければ結果は同じに見える

表示形式を設定していない素の数値・文字列だけのセルでは、両者の見た目は一致します。違いが出るのは日付・通貨・パーセント・桁区切りなど、書式を設定したセルです。

まとめ

判断はシンプルです。表示・転記・CSV・帳票など「見た目のまま出したい」ならgetDisplayValues、合計・比較・日付操作など「値として使いたい」ならgetValuesです。特にパーセント(生の値は0.35)と日付(Dateオブジェクト)は取り違えやすいポイントなので、用途に合わせて選べば、書式まわりのバグの大半は防げます。

よくある質問

getValuesはセルに入っている「生の値」を型のまま返します。日付ならDateオブジェクト、数値ならnumberです。一方getDisplayValuesは、表示形式(書式)を適用したあとの「画面に見えている文字列」をすべてstringで返します。1,000円やyyyy/MM/ddのような見た目がそのまま文字列になります。

getDisplayValuesを使います。getValuesで取得するとDateオブジェクトになり、そのまま別シートやメールに貼ると「Sat Jul 25 2026 ...」のような英語表記になってしまいます。セルに「2026/07/25」と表示されている見た目をそのまま使いたい場合はgetDisplayValues、または生の値をUtilities.formatDateで整形します。

そのままではできません。getDisplayValuesが返すのは「1,000」のようなカンマ入りの文字列なので、足し算すると文字列結合になります。合計や比較などの計算をする場合はgetValuesで数値として取得してください。表示は表示値、計算は生の値、と役割を分けるのが基本です。

getValuesとgetDisplayValuesはどちらも数式の「計算結果」を返します。=SUM(A1:A3)なら合計値です。数式そのものの文字列(=SUM(...))が欲しい場合はgetFormulas(またはgetFormula)を使います。

getValuesと同じく、範囲全体を一度に取得するAPI呼び出しなので、1セルずつ読むより十分に高速です。ただしどちらも呼び出しのたびにスプレッドシートへアクセスするため、同じ範囲で両方が必要な場合は、それぞれ1回ずつ取得して変数に保持し、ループ内で繰り返し呼ばないようにします。

GAS開発・業務Webシステムを
相談する。

値の取得だけでなく、集計レポート・帳票出力・Gmail自動化など、日々の業務を自動化するGAS開発をご相談いただけます。

GAS Webシステム開発を見る