「いま参照しているセルの番地を、文字列として数式に組み込みたい」「データの種類によって計算を切り替えたい」。スプレッドシートで集計表を作っていると、こんな場面が意外とよく出てきますよね。
そんなときに頼れるのが、スプレッドシートの CELL関数 です。セル番地・行列番号・データ型・列幅といった「セルそのものの情報」を、関数1本でまとめて取り出せます。INDIRECT関数やARRAYFORMULA関数と組み合わせれば、動的なセル参照や一括判定もスッキリ書けますよ。
この記事では、GoogleスプレッドシートのCELL関数の使い方をまとめます。info_type 7種類の戻り値早見表、INDIRECT連携・データ型分岐・条件付き書式・Apps Script代替まで、実務で使える7パターンを実例付きで整理します。Excel版CELL関数との差分や、#VALUE!エラーへの対処法もあわせて解説しますね。
スプレッドシートのCELL関数とは?セル情報を1関数で取得する関数
スプレッドシートのCELL関数(読み方:セル関数)は、指定したセルの情報を取り出す関数です。「どんな情報がほしいか」を最初の引数 info_type で切り替えながら、1本の関数で何種類もの用途に使えるのが特徴ですね。
CELL関数で取得できる情報は、おもに次の4種類です。
- セル番地(
$A$1のような絶対参照の文字列) - 行番号・列番号(数値)
- データ型(空白・文字列・数値の判別)
- 列幅(整数)
たとえば =CELL("address", B3) と書けば、結果は $B$3 という文字列になります。この文字列を INDIRECT関数 に渡せば、行や列の位置を動的に組み立てた参照が作れますよ。
CELL関数で何ができる?
CELL関数が活躍するのは、おもに次のような場面です。
- INDIRECT関数と組み合わせて 動的にセル参照を組み立てたい とき
- セルが空白か文字列か数値かによって 計算式を分岐させたい とき
- 条件付き書式で データ型に応じてセルをハイライト したいとき
- レイアウトのチェックで 列幅を数値として取得したい とき
- ADDRESS関数の代わりに セル番地を文字列で取得したい とき
揮発性関数としての注意点
CELL関数は揮発性関数(ボラタイル関数)です。シート上のどこかが再計算されるたびに評価され直すので、データ量が多いシートで多用すると、動作がもっさりすることがあります。大量のCELL関数を並べる前に、ROW関数・COLUMN関数・ISBLANK関数など 専用の軽い関数で代用できないか を先に検討してみてくださいね。
NOTE
GoogleスプレッドシートのCELL関数は、Excelに比べて使える info_type が少なめです。
"filename"や"format"などはスプレッドシートでは非対応で、シート名取得やセル書式の取得には別の方法が必要になります。詳しくは「Excel版との違い」セクションで解説します。
CELL関数の構文と引数
基本構文
=CELL(info_type, [参照])
引数の説明
| 引数 | 必須/任意 | 説明 |
|---|---|---|
| info_type | 必須 | 取得したい情報の種類を文字列で指定する(”address” / “col” / “row” / “type” / “width” / “contents” / “prefix”) |
| 参照 | 任意 | 情報を取得したいセル。省略するとアクティブセルが対象 |
info_type は 必ずダブルクォーテーションで囲んで文字列として渡します。=CELL("address", A1) のように、第1引数を文字列リテラルにするのがポイントですね。
TIP
第2引数を省略するとアクティブセル(選択中のセル)が対象になりますが、シートの再計算タイミングで結果が動いてしまいます。実務では参照を明示的に指定するのが安全ですよ。
info_typeは必ずダブルクォートで囲む
セル参照のように =CELL(A1, B2) と書いてしまうと、A1の値が info_type として渡されることになり、A1に “address” などの文字列が入っていない限り #VALUE! エラーになります。スペルミス("adress" のように d が1つ)や大文字小文字違い("Address")でも同じくエラーが返るので、注意しましょう。
info_type 7種類の戻り値早見表
スプレッドシートのCELL関数で使える info_type は、次の7種類です。
| info_type | 戻り値の例 | 用途 |
|---|---|---|
"address" | $B$3 | 絶対参照の文字列でセル番地を取得 |
"col" | 3 | 列番号(A=1, B=2, …)を整数で取得 |
"row" | 5 | 行番号を整数で取得 |
"type" | b / l / v | データ型(空白・文字列・数値)を1文字で取得 |
"width" | 8 | セルが属する列の幅を整数で取得 |
"contents" | セルの値 | 参照セルの中身をそのまま返す |
"prefix" | ' " ^ など | 文字列の配置プレフィックス記号を取得 |
NOTE
第2引数に範囲(例:
A1:C10)を渡すと、範囲の左上セルだけを対象にした結果が返ります。範囲のすべてのセルについて情報を取りたいときは、ARRAYFORMULA関数 との組み合わせが必要ですよ。
type が返す3種類の値(b / l / v)
"type" を指定したときに返る1文字は、それぞれ次のような意味を持ちます。
| 戻り値 | 意味 | 該当するセルの中身 |
|---|---|---|
b | blank(空白) | セルが空のとき |
l | label(文字列) | "東京" "商品A" など |
v | value(数値) | 100、日付(シリアル値)、TRUE/FALSE |
日付やTRUE/FALSEは内部的に数値として管理されているので、すべて v として扱われます。「数値か日付か」を判別したい場合は CELL ではなく ISDATE関数 を使うのが確実ですよ。
prefix が返す配置プレフィックス記号
"prefix" は、文字列の配置プレフィックス(セルの先頭に付ける揃え位置の記号)を返します。普段あまり意識しない引数ですが、Lotus 1-2-3 などのレガシーファイルから移行したデータを扱うときに役立ちます。
| 戻り値 | 意味 |
|---|---|
' | 左揃え |
" | 右揃え |
^ | 中央揃え |
| 両端揃え |
| 空文字 | 上記以外(数値や、プレフィックスが付いていない文字列) |
通常のスプレッドシート利用では空文字が返ることがほとんどなので、データ移行時のチェック用と覚えておけばOKです。
CELL関数の基本的な使い方
ここからは info_type 別に、よく使うパターンを順に見ていきます。コピペして使えるサンプル式付きで紹介しますね。
address でセル番地を絶対参照の文字列で取得する
=CELL("address", B3)
結果は $B$3 です。文字列として返るので、INDIRECT関数やQUERY関数の引数にそのまま組み込めます。
セル番地を文字列で組み立てるなら ADDRESS関数 を使う手もありますが、ADDRESS は行番号と列番号を別々に渡す必要があります。「あるセルから直接 $A$1 形式の文字列がほしい」だけなら CELL のほうが短く書けますよ。
row / col で行番号・列番号を取得する
=CELL("row", A5) → 5
=CELL("col", C1) → 3
行番号・列番号だけがほしい場合は、ROW関数 / COLUMN関数 のほうがシンプルに書けます。CELL関数を使うメリットは、address や type などほかの情報と 統一的な書き方 で扱える点にあります。
type でデータ型を1文字で判別する
=CELL("type", A1)
セルの中身に応じて b / l / v のいずれかが返ります。「このセルにデータが入っているか」「文字列か数値か」を数式で判定したいときに役立ちます。
ただし、空白判定だけなら ISBLANK関数、数値判定だけなら ISNUMBER関数、文字列判定だけなら ISTEXT関数 のほうが意図が伝わりやすいです。3種類を1つの数式で同時に判別したい場合に CELL の出番ですね。
基本パターン早見表
| 数式 | 戻り値の例 | 主な用途 |
|---|---|---|
=CELL("address", B3) | $B$3 | INDIRECTと組み合わせて動的参照 |
=CELL("row", A5) | 5 | 行番号取得(ROWの代わり) |
=CELL("col", C1) | 3 | 列番号取得(COLUMNの代わり) |
=CELL("type", A1) | b / l / v | データ型による分岐処理 |
=CELL("width", A1) | 10 | 列幅取得・レイアウト確認 |
=CELL("contents", A1) | A1の値 | =A1 とほぼ同じ |
=CELL("prefix", A1) | ' / " / ^ / / 空文字 | 配置プレフィックス確認 |
実務で使えるCELL関数の活用パターン7選
ここからは、CELL関数を他の関数と組み合わせた実務向けの応用パターンを7つ紹介します。自分のシチュエーションに近いものから試してみてください。
パターン1: INDIRECTと組み合わせて動的にセル参照を組み立てる
CELL関数で取得した行番号を INDIRECT関数 に渡し、参照先を動的に切り替える定番パターンです。
=INDIRECT("B" & CELL("row", A2))
「A2と同じ行のB列の値」を返します。A2の行位置が変わっても、CELL関数が現在の行番号を返してくれるので参照が自動で追従しますよ。
パターン2: type でデータ型に応じた計算分岐を組む
セルが数値か文字列かで計算を切り替えたい場面で使えます。
=IF(CELL("type", A2)="v", A2*1.1, "数値以外")
A2が数値(v)のときだけ1.1倍の計算を行い、それ以外なら「数値以外」と表示します。
TIP
「数値以外を空欄で残したい」場合は、第3引数を
""にすればOKです。=IF(CELL("type", A2)="v", A2*1.1, "")のように書けば、文字列セルは空欄のままになります。
パターン3: ARRAYFORMULAでデータ型を一括取得する
CELL関数は単独だと範囲を渡しても左上セルしか返しませんが、ARRAYFORMULA関数 で包むと配列処理に対応します。
=COUNTIF(ARRAYFORMULA(CELL("type", A1:A20)), "<>b")
A1:A20の各セルについてデータ型を取得し、空白(b)以外の個数をカウントする式です。
TIP
単純に空白以外の個数を数えるだけなら COUNTA関数 のほうがシンプルです。CELL関数を使うメリットは「文字列のみカウント」「数値のみカウント」のように データ型を細かく絞り込めること。たとえば
=COUNTIF(ARRAYFORMULA(CELL("type", A1:A20)), "l")なら文字列セルだけの個数が取れます。
パターン4: 条件付き書式でデータ型をハイライトする
「数値列のはずなのに文字列が混入しているセルを赤くしたい」といった場面で役立ちます。
- 対象範囲を選択する(例: A2:A100)
- メニュー「表示形式」→「条件付き書式」を開く
- 「カスタム数式」を選ぶ
- 数式欄に
=CELL("type", A2)="l"と入力する - 背景色などのフォーマットを設定する
数値列に文字列が紛れ込んだとき、視覚的にすぐ気づける仕組みになります。
パターン5: width で列幅に応じた表示制御を行う
=IF(CELL("width", A1)<10, LEFT(B1, 5) & "…", B1)
A1の列幅が10未満なら、B1の先頭5文字+「…」で短縮表示。それ以上ならB1の値をそのまま表示します。
パターン6: address と MATCH で動的範囲を組み立てる
CELL(“address”, …) と MATCH関数 を組み合わせると、「条件に一致した行のセル番地」を動的に取り出せます。
=SUM(INDIRECT("B2:" & CELL("address", INDEX(B:B, MATCH("合計", A:A, 0)))))
A列に「合計」という文字列が現れる行までのB列を合計します。データが増えても「合計」の位置に追従して集計範囲が自動で広がります。
パターン7: Apps Scriptでシート名を取得する代替策
スプレッドシートのCELL関数は "filename" 非対応のため、シート名を直接取得できません。Apps Scriptのカスタム関数で代替するのが現実的な解です。
メニュー「拡張機能」→「Apps Script」を開き、次のコードを貼り付けて保存します。
function SHEETNAME() {
return SpreadsheetApp.getActiveSheet().getName();
}
スプレッドシートに戻って、任意のセルに =SHEETNAME() と入力するとシート名が表示されます。
TIP
カスタム関数はシート名が変わっても自動で再計算されません。手動で再計算したい場合は、関数の引数に
NOW()などのダミーを渡す実装かトリガーで再計算を仕掛けてください。
CELL関数のよくあるエラーと対処法
| エラー・現象 | 原因 | 対処法 |
|---|---|---|
#VALUE! | info_type のスペル誤り(例: "adress") | "address" の d は2つ。スペルを正確に書く |
#VALUE! | スプレッドシートで非対応の info_type を使った | "filename" "format" などは非対応。7種類の対応リストを確認する |
#VALUE! | info_type をダブルクォートで囲み忘れた | 必ず "address" のように文字列として渡す |
| 値が更新されない | 揮発性関数の再計算が遅れている | セルを再編集する、またはシートを再読み込み(Ctrl+R)する |
| 範囲を渡したのに1つだけ返る | 仕様:参照に範囲を指定すると左上セルだけが対象 | 1セルずつ指定するか、ARRAYFORMULAで配列化する |
"type" で日付が v になる | 日付はシリアル値(内部的に数値)として管理されるため | 日付判定は ISDATE関数 を使う |
CELL関数とExcel版の違い
スプレッドシートのCELL関数は、Excel版に比べて 対応する info_type が大幅に少ない のが最大の違いです。
| info_type | Excel | Googleスプレッドシート |
|---|---|---|
"address" "col" "row" "type" "width" "contents" "prefix" | 対応 | 対応 |
"filename" | 対応 | 非対応(#VALUE!) |
"format" | 対応 | 非対応(#VALUE!) |
"color" "protect" "parentheses" | 対応 | 非対応(#VALUE!) |
filename と format の代替策
"filename"の代替: Apps Script カスタム関数(SpreadsheetApp.getActiveSheet().getName())"format"の代替: Apps ScriptでRange#getNumberFormat()を使うカスタム関数、または日付判定はISDATE関数を活用する
Excel版CELL関数の詳しい使い方は ExcelのCELL関数の使い方|セルの書式・位置・ファイル名を取得する方法 で解説しています。
CELL関数と似た関数の使い分け
| 関数 | 取得できる情報 | CELL関数との違い |
|---|---|---|
| CELL | セル番地・行/列番号・データ型・列幅・プレフィックス | 1関数で多種類の情報を取得 |
| ROW | 行番号 | row 引数より短い |
| COLUMN | 列番号 | col 引数より短い |
| ADDRESS | セル番地(文字列) | 行番号・列番号から番地を組み立てる用途向け |
| ISBLANK | 空白かどうか | type=”b” の判定専用、意図が明確 |
| ISNUMBER | 数値かどうか | type=”v” の判定専用 |
| ISTEXT | 文字列かどうか | type=”l” の判定専用 |
| ISDATE | 日付かどうか | type では区別できない日付判定が可能 |
行番号・列番号だけ取得するなら ROW / COLUMN のほうがシンプルです。CELL関数を選ぶのは、address や type など他の情報と 同じ書き方で並べたい とき、または3種類のデータ型を1数式で同時に分岐したいときです。
よくある質問
CELL関数でファイル名やシート名を取得できますか?
いいえ、スプレッドシートのCELL関数では "filename" は 非対応 です。Excelでは使えますが、スプレッドシートでは #VALUE! エラーになります。シート名を取得したい場合は、Apps Scriptのカスタム関数(SpreadsheetApp.getActiveSheet().getName())が現実的な代替策ですよ。
CELL関数で複数セルの情報を一括取得できますか?
範囲を渡しても 左上セルの情報しか返りません。複数セルに適用するには、ARRAYFORMULA関数 で包むか(=ARRAYFORMULA(CELL("row", A1:A5)) など)、行ごとに数式を入れてください。
CELL(“type”, A1) で日付や TRUE/FALSE はどう判別されますか?
すべて v(数値)として返ります。日付やブール値は内部的にシリアル値・0/1 として管理されているためです。日付かどうかを判別したい場合は ISDATE関数 を使ってください。
CELL関数は揮発性関数ですか?
はい、CELL関数は揮発性関数なので、シート上のどこかが再計算されるたびに評価されます。大量に使うとシートの動作が重くなります。行番号・列番号だけなら ROW / COLUMN、空白判定だけなら ISBLANK のように、専用関数で代用できないか を検討してくださいね。
まとめ
スプレッドシートのCELL関数は、セル番地・行列番号・データ型・列幅などの情報を1関数でまとめて取り出せる 多機能な関数です。
- 構文は
=CELL(info_type, [参照])。info_type には取得したい情報の種類を ダブルクォート付きの文字列 で指定する - 使える info_type は 7種類(
"address""col""row""type""width""contents""prefix") "address"は INDIRECT関数 との組み合わせで 動的なセル参照 を実現できる"type"でデータ型を判別すると、計算式の分岐や入力ミス検出に応用できる- 範囲を渡すと 左上セルしか返らない ので、配列処理は ARRAYFORMULA関数 で包む
- Excel版CELL関数で使える
"filename""format"などは スプレッドシートでは非対応。代替手段は Apps Script
まずは =CELL("address", A1) でセル番地を取得するところから試して、INDIRECTとの組み合わせまで広げてみてください。動的なセル参照が自在に書けるようになると、集計表のメンテがグッとラクになりますよ。
関連記事: スプレッドシートのINDIRECT関数の使い方 / スプレッドシートのARRAYFORMULA関数の使い方 / ExcelのCELL関数の使い方
