GASのgetValuesと
getDisplayValuesの違いと使い分け
日付が英語表記になる、金額のカンマが消える——スプレッドシートの値取得でよくあるつまずきは、getValues(生の値)とgetDisplayValues(見た目どおりの文字列)の違いを知れば解決します。動くコードで使い分けを解説します。
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
数式が入ったセルでは、getValuesもgetDisplayValuesも「計算結果」を返します。前者は数値、後者は書式適用後の文字列です。数式そのもの(=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回ずつ
生の値と表示値の両方が必要なときは、ループの外でgetValuesとgetDisplayValuesを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開発をご相談いただけます。