ADVERTISEMENT

【Googleスプレッドシート】Apps Scriptでセル数式と値の取り分け!getFormulaとgetValueの使い分け

【Googleスプレッドシート】Apps Scriptでセル数式と値の取り分け!getFormulaとgetValueの使い分け
🛡️ 超解決

Googleスプレッドシートでセルの値を取得するとき、getValueとgetFormulaのどちらを使うべきか迷ったことはありませんか。シート上で数式が入っているセルから、計算結果の値だけを取り出したい場合と、数式そのものを取得したい場合では、適切なメソッドが異なります。本記事では、Apps ScriptにおけるgetValueとgetFormulaの違いを詳しく解説し、それぞれの使い分け方を具体例とともに紹介します。これを読めば、セルのデータを正確に取得できるようになります。

【要点】getFormulaとgetValueの使い分けをマスターします

  • getValue: セルの計算結果の値を取得します。数式が入っていても値だけを返します。
  • getFormula: セルに入力されている数式文字列を取得します。値のみのセルでは空文字列を返します。
  • 使い分けの基本: 値が必要ならgetValue、数式が必要ならgetFormulaを使用します。両方を取得する場合は併用します。

ADVERTISEMENT

getFormulaとgetValueが返すものの違い

Apps Scriptでセルを操作するとき、まずRangeオブジェクトを取得します。そのRangeに対して、getValue()はセルの値を取得し、getFormula()はセルに入力された数式を文字列として返します。数式がないセルでは、getFormula()は空文字列を返す点が重要です。また、値がエラーの場合、getValue()はエラーオブジェクトを返すことがあります。これらの動作を理解していないと、予期しない結果を得ることになります。

例えば、セルA1に「=SUM(B1:B10)」という数式が入っていて、その計算結果が100だとします。このとき、getValue()は100を返し、getFormula()は「=SUM(B1:B10)」を文字列として返します。一方、セルA2に単に「200」と値が直接入力されている場合、getValue()は200を返し、getFormula()は空文字列を返します。この違いを把握しておくことで、スクリプトのロジックを正しく組むことができます。

具体的なスクリプトで使い分けを確認する

getValueで値を取得する手順

  1. スクリプトエディタを開く
    スプレッドシートを開き、メニューから「拡張機能」→「Apps Script」を選択します。エディタが開きます。
  2. 値を取得する関数を記述する
    以下のコードを記述します。
    function getCellValue() {
    var sheet = SpreadsheetApp.getActiveSheet();
    var range = sheet.getRange("A1");
    var value = range.getValue();
    Logger.log(value);
    }
  3. 実行してログを確認する
    関数を実行し、表示メニューから「ログ」を開くと、セルA1の値が出力されています。数式が入っていても計算結果の値が取得できます。

getFormulaで数式を取得する手順

  1. 同様にスクリプトエディタを開く
    先ほどと同じ手順でエディタを開きます。
  2. 数式を取得する関数を記述する
    以下のコードを記述します。
    function getCellFormula() {
    var sheet = SpreadsheetApp.getActiveSheet();
    var range = sheet.getRange("A1");
    var formula = range.getFormula();
    Logger.log(formula);
    }
  3. 実行してログを確認する
    関数を実行すると、セルA1の数式が文字列として出力されます。もし値のみのセルなら空文字列が出力されます。

両方を取得してセルの状態を判定する

実際のスクリプトでは、getValueとgetFormulaを組み合わせて、セルに数式が入っているかどうかを判定することがあります。例えば、数式が入っているセルだけを対象に処理を行いたい場合です。以下のサンプルコードでは、範囲内の各セルについて、getFormulaが空でなければ数式と値をログ出力します。

function checkFormulas() {
var sheet = SpreadsheetApp.getActiveSheet();
var range = sheet.getDataRange();
var values = range.getValues();
var formulas = range.getFormulas();
for (var i = 0; i < values.length; i++) {
for (var j = 0; j < values[0].length; j++) {
if (formulas[i][j] !== "") {
Logger.log("Cell (" + (i+1) + "," + (j+1) + ") has formula: " + formulas[i][j] + " with value: " + values[i][j]);
}
}
}
}

このように、getValues()とgetFormulas()を併用することで、範囲全体の値と数式を一度に取得できます。それぞれ二次元配列で返されるため、ループ処理で個別にアクセスできます。

よくあるトラブルと対処法

getFormulaで値のみのセルを取得すると空文字になる

数式が入っていないセルに対してgetFormulaを呼び出すと、空文字列が返されます。これをそのまま利用しようとすると、文字列結合などで予期しない結果になることがあります。対処法としては、事前にgetFormulaの戻り値を判定してから処理を行います。空文字列の場合は、数式がないものとして別の処理に切り替えます。

数式がエラーの場合のgetValue

セルにエラーが発生している数式(例えば#N/Aや#DIV/0!)がある場合、getValueはエラーオブジェクトを返します。そのままログ出力すると「NaN」や「[object Object]」と表示されることがあります。エラーを判定するには、isError()メソッドを使用するか、typeofでチェックします。また、getDisplayValue()を使うとエラーメッセージを文字列として取得できます。

以下はエラーを検出するサンプルです。
function checkError() {
var sheet = SpreadsheetApp.getActiveSheet();
var range = sheet.getRange("A1");
var value = range.getValue();
if (typeof value === "string" && value.indexOf("#") === 0) {
Logger.log("Error found: " + value);
} else if (value instanceof Error) {
Logger.log("Error: " + value.toString());
} else {
Logger.log("Value: " + value);
}
}

getFormulaで等号を忘れない

getFormulaで取得した数式文字列は、先頭に「=」が含まれます。その文字列を別のセルにsetFormulaで設定するときは、そのまま使用できます。ただし、手動で文字列を組み立てる場合、先頭に「=」を付け忘れないように注意してください。

ADVERTISEMENT

getFormulaとgetValueの比較

項目 getValue getFormula
戻り値の型 数値、文字列、真偽値、日付、エラーなど 文字列(数式がない場合は空文字列)
取得対象 セルの計算結果の値 セルに入力された数式そのもの
数式セルの例(=SUM(A1:A5)) その合計値(例:150) 文字列 “=SUM(A1:A5)”
値のみのセル(例: 100) 100 空文字列 “”
エラーセル(例: #N/A) エラーオブジェクト 数式文字列(例: “=VLOOKUP(…)”)
主な用途 計算結果を利用する処理 数式の分析、バックアップ、複製

このように、2つのメソッドは明確に異なる役割を持っています。状況に応じて適切に使い分けることが、スクリプトの品質向上につながります。

本記事では、getValueとgetFormulaの違いと使い分けを解説しました。値を取得するだけであればgetValue、数式そのものを分析したい場合にはgetFormulaを使用します。実際のスクリプトでは、両方を組み合わせることでセルの状態をより詳細に把握できます。次のステップとして、getDisplayValueと組み合わせた応用も試してみてください。これにより、表示形式の文字列も含めてセルの情報を完全に取得できるようになります。

ADVERTISEMENT

この記事の監修者
✍️

超解決 第一編集部

疑問解決ポータル「超解決」の編集チーム。正確な検証と、現場視点での伝わりやすい解説を心がけています。