rex0220 標準計算式 vs 計算式プラグイン

kintone の計算式にもIF関数が追加されましたが、機能や使い方に違いがありますので、整理してみます。

# 標準計算式と計算式プラグイン比較概要

kintone 標準の計算式は、あまり複雑にならないように配慮しているのに対して、[計算式プラグイン](https://qiita.com/rex0220/items/ae83c6d5ce50ff7a9a73)はいろいろな要望に対応できるように関数の種類も多いです。
用途・方針に合わせて、使い分けてください。


| | 標準計算式    |  計算式プラグイン   |
|:------------|:------------------------|:-------------------------|
|条件分岐|IF関数|IF, IFS, SWITCH関数|
|IF関数のネスト|〇|〇 IFS, SWITCH推奨|
|IF関数の書き方| IF(条件式,真の場合,偽の場合) | IF(条件式,真の場合[,偽の場合)] |
|条件式| ＝, !=, <>, <, >, <=, >= を使った式と論理関数|計算式|
|比較演算子|＝, !=, <>, <, >, <=, >=|＝, !=, <>, <, >, <=, >=, ==, ===,!== |
|比較関数|CONTAINS|IN, TEST, TESTRE|
|論理演算子|なし|&&,  ｜｜|
|論理関数|AND, OR, NOT|BOOL, AND, OR, XOR, NOT|
|算術演算子|+, -, *, /, ^|+, -, **, /, ^, ***, % |
|文字列演算子|&|&|
|集計関数|SUM|AVE, AVEIF, COUNT, COUNTA, COUNTIF, MAX, MAXIF, MIN, MINIF, SUM, SUMIF, PRODUCT, PRODUCTIF, CONCAT, CONCATIF, FIRST, FIRSTIF, LAST, LASTIF, TARRAY, TARRAYIF, TDS, TDSIF, TR_SUM, MAX_STR, TR_MAX, MIN_STR, TR_MIN, TR_AVE|
|集計関数の引数に計算式|×|〇|
|その他関数|ROUND, ROUNDDOWN, ROUNDUP, DATE_FORMAT, YEN|ROUND, ROUNDDOWN, ROUNDUP, DATE_FORMAT, NVL, SUBTABLE, ARRAY, ARRAY_GET, ARRAY_COUNT, DISTINCT, DATE_DIFF, DATE_ADD, DATE_STARTOF, DATE_ENDOF, DURATION, DURATION_AS, DURATION_GET, DURATION_FORMAT, ASC, JIS, HIRAGANA, KATAKANA, FIND, SEARCH, CEIL, FLOOR, TEXTJOIN, REPLACE, REPLACEALL, REPLACERE, SPLIT, JOIN, UPPER, LOWER, LEFT, MID, RIGTH, SLICE, SUBSTR, SUBSTRING, LENGTH, NEWLINE, SEL_CODE, SEL_NAME, LOGIN_NAME, LOGIN_CODE, LOGIN_EMAIL|
|循環参照|×|〇 計算結果を収束させる前提|
|設定項目タイプ|計算,文字列(1行)|文字列(1行),数値,文字列(複数行),リッチエディター,チェックボックス,ラジオボタン,ドロップダウン,複数選択,リンク,日付,時刻,日時,ユーザー選択,ルックアップ,組織選択,グループ選択|
|使用できる項目|数値,計算,日時,日付,時刻,作成日時,更新日時,ルックアップ,文字列(1行),ドロップダウン,ラジオボタン,作成者,更新者|数値,計算,日時,日付,時刻,作成日時,更新日時,ルックアップ,文字列(1行),ドロップダウン,ラジオボタン,作成者,更新者,レコード番号,レコードID,文字列(複数行),リッチエディター,チェックボックス,複数選択,リンク,ユーザー選択,カテゴリー,ステータス,組織選択,グループ選択|
|計算方法|API|JavaScript による解析・実行|
|CSV読込|〇|×|
|REST API|〇|×|
|アプリ流用時の引継ぎ|〇|△ プラグイン設定のダウンロード・アップロードで対応|

※2020/2/10 時点

# 条件分岐処理

条件分岐処理でIF関数を使いますが、複雑な条件の場合は、AND, OR, NOT 関数などを組合せます。
処理が３種類以上ある場合は、IF関数のネスト（階層）で対応しますが、なかなか分かりにくい計算式になりがちです。
計算式プラグインでは、IFS, SWITCH関数で記述すると可読性が上がり、パフォーマンスも改善します。

||標準計算式|計算式プラグイン|
|:--|:--|:--|
|単純なIF|IF(ドロップダウン="A",1,0)|IF(ドロップダウン="A",1,0)|
|IFのネスト|IF(ドロップダウン="A",1,<br>IF(ドロップダウン="B",2,0))|IF(ドロップダウン="A",1,<br>IF(ドロップダウン="B",2,0))|
|IFS||IFS(<br>ドロップダウン="A",1,<br>ドロップダウン="B",2,<br>0)|
|SWITCH||SWITCH(ドロップダウン,<br>"A",1,<br>"B",2,<br>0)|

# IF関数の書き方

||標準計算式|計算式プラグイン|
|:--|:--|:--|
|IF関数の書き方| IF(条件式,真の場合,偽の場合) | IF(条件式,真の場合[,偽の場合]) |

計算式プラグインの場合、「偽の場合」を省略でき、省略時は""となります。

IF(ドロップダウン="A",1) ⇒ IF(ドロップダウン="A",1,"")


# 条件式

| | 標準計算式    |  計算式プラグイン   |
|:------------|:------------------------|:-------------------------|
|条件式| ＝, !=, <>, <, >, <=, >= を使った式と論理関数|計算式全般|

標準計算式が、比較演算子と論理関数で条件式を記述します。
計算式プラグインでは、比較演算子と論理関数の他に計算式全般を記述でき、計算結果を評価します。

- 計算式プラグインの計算結果評価

|計算結果 | 評価  |例|
|:------------|:------|:------|
|空文字| false|""|
|空文字以外の文字列| true|" ", "ABC", "0"|
|数値 0| false|0|
|数値 0以外|true |1, 10, -1|
|配列, オブジェクト|true |ARRAY()|



# 比較演算子
比較演算子は、標準計算式と計算式プラグインで微妙に挙動が異なります。
大まかには、型変換して比較するかどうかです。

| | 標準計算式    |  計算式プラグイン   |
|:------------|:------------------------|:-------------------------|
|比較演算子|＝, !=, <>, <, >, <=, >=|＝, !=, <>, <, >, <=, >=, ==, ===,!== |


|比較演算子    | 標準計算式    |  計算式プラグイン   |
|:----------------|:------------------------|:-------------------------|
|=|文字列または数値の値が等しければTRUE、等しくなければFALSEを返します。型が異なる比較はFALSEになります。|文字列または数値の値が等しければTRUE、等しくなければFALSEを返します。型が異なる比較は数値に換算できる場合は、数値比較。換算できない場合は、文字列比較|
|==|なし|=と同様の結果になります。|
|===|なし|標準計算式の「=」と同様|
|!=|「=」の比較結果を反転させたものになります。型が異なる比較はTRUEになります。|「=」の比較結果を反転させたものになります。|
|!==|なし|標準計算式の「!=」と同様|
|<>|!=と同様の結果になります。|!==と同様の結果になります。|
|<|数値で左の値より小さければTRUE、大きければFALSEを返します。|数値変換できる場合は、数値比較。数値換算できない場合は、文字列比較|
|<=|数値で左の値以下であればTRUE、以上であればFALSEを返します。|数値変換できる場合は、数値比較。数値換算できない場合は、文字列比較|
|>|数値で左の値より大きければTRUE、小さければFALSEを返します。|数値変換できる場合は、数値比較。数値換算できない場合は、文字列比較|
|>=|数値で左の値以上であればTRUE、以下であればFALSEを返します。|数値変換できる場合は、数値比較。数値換算できない場合は、文字列比較|

- 条件式の例

|条件式    | 標準計算式    |  計算式プラグイン   |
|:------|:-------|:------|
|0=0|true|true|
|0="0"|false|true|
|0==="0"|-|false|
|"ABC"="ABC"|true|true|
|0<10|true|true|
|0<"10"|-|true|
|"0"<10|-|true|
|"0"<"10"|-|true|
|"ABC"<"ABC"|-|false|
|"AB"<"ABC"|-|true|

# 比較関数
IN, TEST, TESTRE 関数が計算式プラグインで使えます。
IN関数は、標準でも欲しい。

|比較関数    | 標準計算式の例    |  計算式プラグイン   |
|:------|:-------|:------|
|CONTAINS|CONTAINS(チェックボックス,"A")|IN(チェックボックス,"A")|
|IN|OR(ドロップダウン="A",<br>ドロップダウン="B")|IN(ドロップダウン,"A","B")|
|TEST||TEST(会社名,"株式会社","合同会社")|
|TESTRE||TESTRE(会社名,"[株式｜合同]会社")|

# 論理演算子・論理関数

|論理演算    | 標準計算式の例    |  計算式プラグイン   |
|:------|:-------|:------|
|BOOL<br>論理値変換||BOOL(ドロップダウン)|
|AND<br>論理積|AND(ドロップダウン1="A",<br>ドロップダウン2="B")|AND(ドロップダウン1="A",<br>ドロップダウン2="B")|
|&&<br>論理積||ドロップダウン1="A" &&<br>ドロップダウン2="B"|
|OR<br>論理和|OR(ドロップダウン="A",<br>ドロップダウン="B")|OR(ドロップダウン="A",<br>ドロップダウン="B")|
|｜｜<br>論理和||ドロップダウン="A"｜｜,<br>ドロップダウン="B"|
|NOT<br>否定|NOT(<br>OR(ドロップダウン="A",<br>ドロップダウン="B")<br>)|NOT(<br>OR(ドロップダウン="A",<br>ドロップダウン="B")<br>)|
|XOR<br>排他論理和||XOR(ドロップダウン="A",<br>ドロップダウン="B")|

# 集計関数

|集計関数    | 標準計算式    |  計算式プラグイン   |
|:------|:-------|:------|
|SUM|SUM(数値)|SUM(数値)|
|条件で集計|SUM(計算)<br>※計算項目でIF(ドロップダウン="A",数値,0)|SUM(IF(ドロップダウン="A",数値))|
|条件付き関数|-|SUMIF(ドロップダウン="A",数値)|

- 集計関数使用例

<img width="676" alt="2020-02-10_21h06_43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/12a5ad8d-8223-25ae-6d3e-01ee1fefb508.png">

# 参考

[kintone ヘルプ 計算式の設定](https://jp.cybozu.help/k/ja/user/app_settings/form/autocalc.html)
[kintone 計算式プラグイン](https://qiita.com/rex0220/items/ae83c6d5ce50ff7a9a73)

# あとがき

計算式プラグインは、いろいろ関数を追加していったのでごちゃごちゃしてしまった。
kintone 、Excel、JavaScript の関数が混在している感じ。
一度公開した機能は、もう外せないのでこの状況は変わらないでしょう。