拡張計算式に無い Excel 関数
拡張計算式の関数は、1.5.8.1 では 57 個です(Excel に対応するもの 54 個、独自の $DATETIME・$LOGINUSERID・$LOGINUSERNAME)。このページは、Excel の主な関数と比べて拡張計算式に無い関数を洗い出し、足すとしたらどれから足すかを整理した改修・設計メモです。ここに挙げた関数は本体にはありません。
前提にした現行実装
- 関数はすべて
FormulaServerScriptUtilities.csの中に JavaScript の文字列として定義され、計算式の前に連結して V8 で評価されます(FormulaServerScriptUtilities.cs#L15-L106)。 - 関数名は大文字・小文字を問いません(
ParseIgnoreCase)。 - 計算式が参照できるのは、計算しているレコード 1 件の項目(
model)とcontextだけです。
実装済みの関数の一覧と動きは 拡張計算式の実装ロジック を参照してください。
分類ごとの比較
Excel の関数は 500 を超えるので、拡張計算式で使いどころがありそうな 153 個に絞って比べています(独自関数は数に入れていません)。
| 分類 | 比べた数 | 実装済み | 無い | 割合 |
|---|---|---|---|---|
| 日付・時刻 | 24 | 13 | 11 | 54% |
| 文字列 | 30 | 12 | 18 | 40% |
| 論理 | 13 | 6 | 7 | 46% |
| 数学・三角 | 52 | 13 | 39 | 25% |
| 情報・判定 | 18 | 6 | 12 | 33% |
| 変換(ASC・JIS・TEXT・VALUE) | 4 | 4 | 0 | 100% |
| 検索・参照 | 12 | 0 | 12 | 0% |
| 合計 | 153 | 54 | 99 | 35% |
日付・時刻
実装済み: DATE・DATEDIF・DAY・DAYS・HOUR・MINUTE・MONTH・NOW・SECOND・TODAY・YEAR・WEEKDAY・EOMONTH
| 無い関数 | 内容 | 優先度 |
|---|---|---|
EDATE | 月数を足し引きした日付 | 高 |
DATEVALUE・TIMEVALUE | 文字列を日付・時刻に変換 | 中 |
TIME | 時刻を作る | 中 |
WORKDAY・NETWORKDAYS | 営業日の加減・営業日数 | 中 |
WEEKNUM・ISOWEEKNUM・WORKDAY.INTL・DAYS360・YEARFRAC | 週番号、休日指定の営業日、360 日基準、年の割合 | 低 |
文字列
実装済み: CONCAT・FIND・LEFT・LEN・LOWER・MID・RIGHT・SUBSTITUTE・TRIM・UPPER・REPLACE・SEARCH
| 無い関数 | 内容 | 優先度 |
|---|---|---|
TEXTJOIN | 区切り文字でつなぐ | 高 |
EXACT・REPT・CHAR・CODE | 完全一致、繰り返し、文字コードとの変換 | 中 |
CONCATENATE・T・CLEAN・FIXED・PROPER・NUMBERVALUE・LENB・LEFTB・RIGHTB・MIDB・DOLLAR・YEN・UNICODE・UNICHAR | 旧式の連結、バイト単位の操作、通貨書式など | 低 |
論理
実装済み: AND・IF・NOT・OR・IFS・IFERROR
| 無い関数 | 内容 | 優先度 |
|---|---|---|
SWITCH | 値で分岐する | 高 |
XOR・IFNA | 排他的論理和、#N/A のときの代替 | 中 |
TRUE・FALSE・LAMBDA・LET | 定数、関数・変数の定義 | 低 |
数学・三角
実装済み: ABS・AVERAGE・MAX・MIN・MOD・ODD・POWER・RAND・ROUND・ROUNDUP・ROUNDDOWN・SQRT・TRUNC
| 無い関数 | 内容 | 優先度 |
|---|---|---|
SUM・COUNT・INT | 合計、数値の個数、整数への切り捨て | 高 |
EVEN・SIGN・CEILING・FLOOR・RANDBETWEEN・COUNTA | 偶数への切り上げ、符号、倍数への丸め、整数の乱数、空でない個数 | 中 |
SUMIF・SUMIFS・COUNTIF・COUNTIFS・AVERAGEIF | 条件付きの集計 | 中(下の制約あり) |
三角関数・対数・PI・GCD・LCM・PRODUCT・QUOTIENT・MROUND など | 低 |
情報・判定
実装済み: ISBLANK・ISERROR・ISEVEN・ISNUMBER・ISODD・ISTEXT
| 無い関数 | 内容 | 優先度 |
|---|---|---|
ISNA | #N/A の判定 | 中 |
ISLOGICAL・ISNONTEXT・ISERR・ISREF・ISFORMULA・TYPE・N・NA・ERROR.TYPE・SHEET・CELL | 低 |
検索・参照
VLOOKUP・HLOOKUP・XLOOKUP・INDEX・MATCH・CHOOSE・INDIRECT・OFFSET・ROW・COLUMN・ROWS・COLUMNS はどれもありません。値を番号で選ぶ CHOOSE だけは、セルの範囲に頼らないので足しやすく、優先度は中です。
最初に足す候補
| 関数 | 分類 | 実装の難しさ |
|---|---|---|
SUM | 数学 | 低 |
COUNT | 数学 | 低 |
INT | 数学 | 低 |
SWITCH | 論理 | 中 |
EDATE | 日付・時刻 | 中 |
どれも業務の計算式でよく使われ、今は $IFS や四則演算を組み合わせて書くしかないものです。TEXTJOIN・EXACT・REPT・XOR・SIGN・CHOOSE なども、引数を受け取って値を返すだけなので実装は軽めです。
足すときの実装場所
FormulaServerScriptUtilities.csに、関数定義の JavaScript を返すGet〜Script()を足す(既存のGetIfScript()などと同じ形)。Executeで連結している関数定義の列に、そのGet〜Script()を加える。- 関数名の大文字・小文字をそろえる
ParseIgnoreCaseの対象に新しい関数名を加える。
関数定義は計算式の前に連結されるので、計算式側で同じ名前を宣言すると上書きされる点は、既存の関数と同じです。
設計上の制約
拡張計算式は計算しているレコード 1 件だけを見て値を出す設計です。そのため、次の関数は Excel と同じ意味では作れません。
| 制約 | 影響する関数 | 理由 |
|---|---|---|
| セル範囲が無い | VLOOKUP・HLOOKUP・INDEX・MATCH・OFFSET | ほかのレコードを参照できない |
| シート・セル座標が無い | SHEET・INDIRECT・ROW・COLUMN | プリザンターに対応する概念が無い |
| 複数レコードの集計ができない | SUMIF・COUNTIF・AVERAGEIF など | 集計はサーバースクリプトの items.Sum・items.Count などや API で行う |
SUM・COUNT なども、範囲ではなく引数に並べた値(同じレコードの複数の項目)を対象にする関数として作ることになります。