数式エンジン
ReoGrid Web は Excel 互換の数式エンジンを内蔵しています。数学・統計・三角関数・論理・文字列・日付/時刻・検索・情報・条件付き集計・乱数の 10 カテゴリで合計 109 個の組み込み関数を備え、AST パーサー、評価器、依存関係グラフによるリアルタイム再計算を行います。
Lite 版は算術演算子(+、-、*、/、^、&)、比較演算子、セル参照のみ対応。109 個の組み込み関数はすべて Pro 版で利用可能です。
基本的な使い方
セル値が = で始まると数式として解釈されます。
const ws = grid.worksheet
// 算術演算
ws.cell('C1').value = '=A1+B1'
ws.cell('C2').value = '=A2*B2'
// 関数呼び出し
ws.cell('C3').value = '=SUM(A1:A10)'
ws.cell('C4').value = '=IF(A1>100,"High","Low")'
ws.cell('C5').value = '=VLOOKUP("Apple", A1:B100, 2, FALSE)'
セル参照
| 形式 | 説明 | 例 |
|---|
| 相対参照 | 行・列のインデックスが変動 | A1, B2 |
| 絶対参照 | $ で固定 | $A$1, A$1, $A1 |
| 範囲参照 | コロンで範囲指定 | A1:B10 |
スマート数式エディター
数式(= 始まりのセル)を編集中、エディターは Excel 風の参照編集モードを有効化します。
- 他のセルをクリックすると、そのセル番地がキャレット位置に挿入されます。ドラッグで
A1:B5 のような範囲に拡張可能。
- 別のセルを再クリックすると、直前に挿入した参照を再ターゲットします(point モード)。文字入力や矢印キーで point モードを解除。
- 色分け参照。 式中のユニークな参照ごとに共通パレットから色が割り当てられ、グリッド上の参照範囲も同色の点線矩形で囲まれます。結合セルを含む参照は結合領域全体を囲うように展開されます。
API 呼び出しは不要 — 数式編集時に自動で有効になります。
組み込み関数一覧
10 カテゴリ・109 関数すべてを掲載します。
数学・算術(22)
| 関数 | 構文 | 説明 |
|---|
SUM | SUM(値1, 値2, ...) | 合計 |
PRODUCT | PRODUCT(値1, 値2, ...) | 積 |
AVERAGE | AVERAGE(値1, 値2, ...) | 平均 |
COUNT | COUNT(値1, 値2, ...) | 数値の個数 |
COUNTA | COUNTA(値1, 値2, ...) | 空でないセルの個数 |
COUNTBLANK | COUNTBLANK(範囲) | 空白セルの個数 |
MAX | MAX(値1, 値2, ...) | 最大値 |
MIN | MIN(値1, 値2, ...) | 最小値 |
ROUND | ROUND(数値, 桁数) | 四捨五入 |
ROUNDUP | ROUNDUP(数値, 桁数) | 切り上げ |
ROUNDDOWN | ROUNDDOWN(数値, 桁数) | 切り捨て |
ABS | ABS(数値) | 絶対値 |
MOD | MOD(数値, 除数) | 剰余 |
INT | INT(数値) | 小数部切り捨て(負方向) |
TRUNC | TRUNC(数値, [桁数]) | 小数部切り捨て(ゼロ方向) |
CEILING | CEILING(数値, 基準値) | 基準値の倍数に切り上げ |
FLOOR | FLOOR(数値, 基準値) | 基準値の倍数に切り捨て |
MROUND | MROUND(数値, 倍数) | 指定倍数に四捨五入 |
POWER | POWER(底, 指数) | べき乗 |
SQRT | SQRT(数値) | 平方根 |
SIGN | SIGN(数値) | 符号(1 / 0 / -1) |
SUMPRODUCT | SUMPRODUCT(配列1, [配列2, ...]) | 配列要素ごとの積和 |
統計(4)
| 関数 | 構文 | 説明 |
|---|
MEDIAN | MEDIAN(値1, ...) | 中央値 |
LARGE | LARGE(範囲, k) | k 番目に大きい値 |
SMALL | SMALL(範囲, k) | k 番目に小さい値 |
RANK | RANK(値, 範囲, [order]) | 順位(order=0 で降順) |
三角関数・対数(12)
| 関数 | 構文 | 説明 |
|---|
EXP | EXP(数値) | e の指数 |
LN | LN(数値) | 自然対数 |
LOG | LOG(数値, [底]) | 対数(底のデフォルトは 10) |
LOG10 | LOG10(数値) | 常用対数 |
SIN | SIN(数値) | 正弦(ラジアン) |
COS | COS(数値) | 余弦(ラジアン) |
TAN | TAN(数値) | 正接(ラジアン) |
ASIN | ASIN(数値) | 逆正弦 |
ACOS | ACOS(数値) | 逆余弦 |
ATAN | ATAN(数値) | 逆正接 |
ATAN2 | ATAN2(x, y) | 引数順は Excel 互換 |
PI | PI() | 円周率 |
乱数(2)
| 関数 | 構文 | 説明 |
|---|
RAND | RAND() | [0, 1) の一様乱数 |
RANDBETWEEN | RANDBETWEEN(下限, 上限) | 整数の一様乱数 |
現状 RAND / RANDBETWEEN は volatile 扱いではないため、再計算ごとに自動更新はされません。値を更新するにはセルを再入力してください。
論理(8)
| 関数 | 構文 | 説明 |
|---|
IF | IF(条件, 真の場合, [偽の場合]) | 条件分岐 |
IFS | IFS(条件1, 結果1, ...) | 多分岐(Excel 2019+) |
IFERROR | IFERROR(値, エラー時の値) | エラー捕捉 |
IFNA | IFNA(値, #N/A の代替) | #N/A のみ捕捉 |
AND | AND(条件1, ...) | 論理積(短絡評価) |
OR | OR(条件1, ...) | 論理和(短絡評価) |
NOT | NOT(条件) | 論理否定 |
SWITCH | SWITCH(式, 値1, 結果1, ..., [既定値]) | 値マッチで分岐 |
文字列(21)
| 関数 | 構文 | 説明 |
|---|
LEN | LEN(文字列) | 文字数 |
LEFT | LEFT(文字列, [n]) | 左から n 文字 |
RIGHT | RIGHT(文字列, [n]) | 右から n 文字 |
MID | MID(文字列, 開始, 長さ) | 部分文字列 |
UPPER | UPPER(文字列) | 大文字化 |
LOWER | LOWER(文字列) | 小文字化 |
PROPER | PROPER(文字列) | 単語先頭を大文字化 |
TRIM | TRIM(文字列) | 空白圧縮 |
CONCATENATE | CONCATENATE(文字列1, ...) | 連結(範囲は不可) |
CONCAT | CONCAT(値1, ...) | 連結(範囲も展開) |
TEXTJOIN | TEXTJOIN(区切り, 空文字無視, 値1, ...) | 区切り付き連結 |
TEXT | TEXT(値, 書式) | 数値を書式付き文字列に |
VALUE | VALUE(文字列) | 文字列を数値に |
FIND | FIND(検索, 対象, [開始]) | 大小区別あり、ワイルドカード不可 |
SEARCH | SEARCH(検索, 対象, [開始]) | 大小区別なし、ワイルドカード対応 |
EXACT | EXACT(文字列1, 文字列2) | 大小区別ありの厳密比較 |
SUBSTITUTE | SUBSTITUTE(対象, 旧, 新, [出現位置]) | 文字列置換 |
REPLACE | REPLACE(対象, 開始, 文字数, 新) | 位置指定置換 |
REPT | REPT(文字列, 回数) | 反復 |
CHAR | CHAR(コード) | コードポイント → 文字 |
CODE | CODE(文字列) | 先頭文字のコードポイント |
日付・時刻(14)
| 関数 | 構文 | 説明 |
|---|
TODAY | TODAY() | 今日のシリアル値(整数) |
NOW | NOW() | 現在日時のシリアル値 |
DATE | DATE(年, 月, 日) | 日付シリアル生成 |
YEAR | YEAR(シリアル) | 年 |
MONTH | MONTH(シリアル) | 月(1-12) |
DAY | DAY(シリアル) | 日(1-31) |
HOUR | HOUR(シリアル) | 時(0-23) |
MINUTE | MINUTE(シリアル) | 分(0-59) |
SECOND | SECOND(シリアル) | 秒(0-59) |
WEEKDAY | WEEKDAY(シリアル, [type]) | 曜日(type 1-3, 11-17 対応) |
EDATE | EDATE(開始日, 月数) | 月加算(月末はクランプ) |
EOMONTH | EOMONTH(開始日, 月数) | n ヶ月後の月末日 |
DAYS | DAYS(終了日, 開始日) | 日数差 |
DATEDIF | DATEDIF(開始, 終了, 単位) | 期間計算(単位: D/M/Y/MD/YM/YD) |
検索・参照(11)
| 関数 | 構文 | 説明 |
|---|
VLOOKUP | VLOOKUP(検索値, 表, 列番号, [近似一致]) | 縦方向の表検索 |
HLOOKUP | HLOOKUP(検索値, 表, 行番号, [近似一致]) | 横方向の表検索 |
XLOOKUP | XLOOKUP(検索値, 検索範囲, 戻り範囲, [既定], [match_mode], [search_mode]) | モダン検索 |
INDEX | INDEX(範囲, 行, [列]) | 位置指定で値取得 |
MATCH | MATCH(検索値, 範囲, [match_type]) | 値の位置を返す |
XMATCH | XMATCH(検索値, 範囲, [match_mode], [search_mode]) | モダン MATCH |
ROW | ROW([参照]) | 行番号 |
COLUMN | COLUMN([参照]) | 列番号 |
ROWS | ROWS(範囲) | 範囲の行数 |
COLUMNS | COLUMNS(範囲) | 範囲の列数 |
ADDRESS | ADDRESS(行, 列, [abs], [a1], [シート名]) | A1/R1C1 文字列を生成 |
制約: ROW(A5) のような単一セル参照は現状非対応(#VALUE! を返します)。引数なし ROW() / COLUMN() と範囲引数 ROW(A1:A10) は動作します。
未対応(見送り中): INDIRECT / OFFSET。依存グラフに volatile セル機構が必要なため、別タスクで対応予定。
情報・エラー判定(9)
| 関数 | 構文 | 説明 |
|---|
ISBLANK | ISBLANK(値) | 空セル判定 |
ISNUMBER | ISNUMBER(値) | 数値判定 |
ISTEXT | ISTEXT(値) | 文字列判定 |
ISLOGICAL | ISLOGICAL(値) | 真偽値判定 |
ISERROR | ISERROR(値) | エラー判定(#N/A 含む) |
ISERR | ISERR(値) | #N/A 以外のエラー判定 |
ISNA | ISNA(値) | #N/A 判定 |
NA | NA() | #N/A を返す |
ERROR.TYPE | ERROR.TYPE(値) | エラー種別を数値で返す(1-8) |
条件付き集計 — *IF / *IFS(6)
| 関数 | 構文 | 説明 |
|---|
SUMIF | SUMIF(範囲, 条件, [合計範囲]) | 単一条件の合計 |
COUNTIF | COUNTIF(範囲, 条件) | 単一条件のカウント |
AVERAGEIF | AVERAGEIF(範囲, 条件, [平均範囲]) | 単一条件の平均 |
SUMIFS | SUMIFS(合計範囲, 範囲1, 条件1, ...) | 複数条件の合計 |
COUNTIFS | COUNTIFS(範囲1, 条件1, ...) | 複数条件のカウント |
AVERAGEIFS | AVERAGEIFS(平均範囲, 範囲1, 条件1, ...) | 複数条件の平均 |
条件(criteria)の構文
SUMIF / COUNTIF / AVERAGEIF 系および *IFS で使える条件式:
| 例 | 意味 |
|---|
5 | 値が 5 と等しい |
"apple" | 文字列が apple(大小区別なし) |
">5" | 5 より大きい |
">=10" | 10 以上 |
"<>0" | 0 ではない |
"a*" | a で始まる文字列 |
"?at" | 任意の 1 文字 + at |
依存関係の自動追跡
数式間の依存関係は自動的に追跡されます。あるセルの値が変更されると、そのセルを参照しているすべての数式が自動的に再計算されます。
ws.cell('A1').value = '10'
ws.cell('B1').value = '20'
ws.cell('C1').value = '=A1+B1' // -> 30
// A1 を変更すると C1 が自動再計算
ws.cell('A1').value = '50' // C1 -> 70
データの一括変更後に数式の依存関係を再構築できます。
ws.rebuildFormulas()
使用例:VLOOKUP を使った請求書
const ws = grid.worksheet
// 価格表(A1:B4)
ws.cell('A1').value = '品名'; ws.cell('B1').value = '単価'
ws.cell('A2').value = 'ウィジェット'; ws.cell('B2').value = '500'
ws.cell('A3').value = 'ガジェット'; ws.cell('B3').value = '1200'
ws.cell('A4').value = 'スプロケット'; ws.cell('B4').value = '350'
// 明細行(D1:G4)
ws.cell('D1').value = '品名'; ws.cell('E1').value = '数量'
ws.cell('F1').value = '単価'; ws.cell('G1').value = '金額'
ws.cell('D2').value = 'ウィジェット'
ws.cell('E2').value = '10'
ws.cell('F2').value = '=VLOOKUP(D2,$A$2:$B$4,2,FALSE)' // -> 500
ws.cell('G2').value = '=E2*F2' // -> 5000
// 合計
ws.cell('G5').value = '=SUM(G2:G4)'
ws.cell('G6').value = '=ROUND(G5*0.1,0)' // 消費税 10%
ws.cell('G7').value = '=G5+G6' // 合計
エディション比較
| 機能 | Lite (無料) | Pro (有料) |
|---|
| 算術・比較演算子 | 対応 | 対応 |
| セル参照・範囲参照 | 対応 | 対応 |
| 依存関係グラフ | 対応 | 対応 |
| スマート数式エディター(色分け参照) | 対応 | 対応 |
| 組み込み関数(109 個) | — | 対応 |