【コピペで使える!kintone IF関数】IF関数・AND/OR/NOT関数を使いこなす(2020年1月アップデート)

みなさんこんにちは。サイボウズ公認 kintone エバンジェリストの松田です。
2020年1月のkintone アップデートで、kintoneの計算機能が大きく強化されます。

今回のアップデートでは、計算フィールド、文字列(1行)フィールドで使える計算式において、次のような機能が使えるようになります。

  1. IF関数
  2. AND/OR/NOT関数
  3. ドロップダウン・ラジオボタンの値が利用可能
  4. 「入力なし」のフィールドを含む計算が可能に(#N/A!エラーが解消)

機能が豊富になる反面、自分で計算式を作成するためのハードルが上がります。Excel等で関数を使うのに慣れていない人でも、kintoneの計算式が作れるようなパターン集を作りました。

IF関数を理解する

Excel関数を作ったことがある人であればおなじみですが、IF関数は、与えられた条件が成立するかどうかによって、結果を分岐させることができるという機能があります。下の図を見てください。

IF関数のカッコの中には、3つの項目をカンマで区切って入力する必要があります。このカッコの中の項目のことを「引数」(ひきすう)と呼びます。

1つめの引数は、条件式(論理式)。
ここに条件分岐させるための条件式を入力します。
2つめは、条件式が成立する場合に実行する計算式、3つめは条件式が成立しない場合の計算式です。
例えば、テストの点数が70点以上だったら合格。それ以外は不合格、という計算式を作りたい場合は、次のような計算式を作ります(文字列(1行)フィールドの自動計算)

※「論理式」についてはまた別途取り上げたいと思います。ここでは初心者の方にも分かりやすくするために「条件式」という表現を使います。

IF(点数 >= 70, “合格!”, “不合格”)

意味:
もし「点数が70以上なら」「合格!」それ以外なら「不合格」

上の図に当てはめてみると、下の図のようになります。
3つの項目(引数)が、カンマで区切られて入力されていることがわかります。
点数(これは数値フィールドのフィールドコード)が70以上。
これが成立するときには、「合格!」という文字を表示。
成立しない場合には、「不合格」という文字を表示させます。

この計算式は、文字列(1行)フィールドの自動計算に設定していますので、計算結果には文字列(ダブルクォーテーションで囲む)を設定することが可能となります。

この条件式と、条件成立時、非成立時の計算式を工夫することで、いろいろな表現をすることができるようになります。
条件式には、上の例のような数値の比較のほか、文字列(1行)、日付、時刻、ラジオボタン、ドロップダウンのフィールドを使うことができます。

条件式で使える演算子

条件式に使用できる演算子とフィールド種類を整理しておきましょう。
文字列や文字列(1行)フィールドについては、等しいかどうかという比較はできますが、大小の比較ができるのは数値のみ。
すなわち、「1月と2月、どっちが大きいか?」というような比較は、行うことができません。

表.条件式に使用できる演算子

演算子意味数値計算フィールド文字列文字列(1行)フィールド
=等しい
!=等しくない
<> 等しくない
<左辺が右辺より小さい
<=左辺が右辺以下
>左辺が右辺より大きい
>=左辺が右辺以上


【要チェック!1】
文字列同士の大小の比較はできません。計算結果がエラーになります。


【要チェック!2】
等しくないを表す演算子は「!=」です。
プログラミング経験者にはおなじみですが、Excel関数では「<>」が使われるので、注意が必要です。

(2020/01/06修正 
等しくないを表す演算子として、「!=」も「<>」も両方使えます。@toru_ さん、ご指摘ありがとうございます)

条件式に使えるパターン集

文字列が一致しているかどうか

例)文字列フィールドコード = “あいうえお”

上で説明したとおり、文字列の場合は「等しいかどうか」しか判定することができません。文字列というフィールドの値が「あいうえお」に完全に一致する場合にだけ、この条件式は成立し、「正解!」という文字が表示されます。
文字列を計算式内に書くときは、ダブルクォーテーションで囲んで書きます。

数値がある値より大きい(小さい)か?

数値の比較では、イコールの他に、大小を比較するための演算子を使うことができます。

例)数値 >= 70

IF(点数 >= 70, “合格!”, “不合格・・・” )

テストの点数が入っている数値フィールドがあって、合格点70点以上を満たしているかどうかによって、合格・不合格を表示させる、という式です。

IF(金額 >= 100000, 金額 * 0.9, 金額 )

次の例は、10万円以上購入する場合はディスカウントで10%割引という計算をさせています。
金額が10万円以上の場合は、金額に0.9をかけています。

時刻フィールドの取り扱い

時刻フィールドの値を判定して、午前中か午後かを表示させてみましょう。
時刻フィールドを計算式の中で使う際は注意が必要です。

kintoneヘルプ 日時の形式やタイムゾーンを変える(DATE_FORMAT関数)

ヘルプのDATE_FORMAT関数の中に記載があるように、日時や日付、時刻フィールドの値を計算式の中で使う場合、その値はUNIX時刻という値として扱われます。
例) 12:00 ==> 43200

IF(時刻 < 43200, “午前中”, “午後”)

12:00を表す、43200と比較することで、時刻が12:00より小さければ「午前中」それ以外であれば「午後」という文字を表示させています。

UNIX時刻の値を知るには、時刻フィールドを一度計算フィールドで変換してみるといいです。
上の「UNIX時刻」フィールド(計算フィールド)の計算式:時刻

ラジオボタンやドロップダウンの値を使う

条件式には、ラジオボタンやドロップダウンの値を使うこともできます。

IF(ラジオボタン=”sample1″, “1”, “”)

3つの選択肢を持ったラジオボタンの値によって、文字列に表示する値を変えてみます。

この計算式で、値がsample1のときは「1」を表示させることはできました。
しかし、sample2, sample3のときの対応はどうしましょうか。。。

このような場合には、IF関数を復数重ねて使うことができます。

IF(ラジオボタン = “sample1”, “1”,  IF(ラジオボタン = “sample2”, “2”,  “3”))

この式をよく眺めてみると、次の図のように、1つ目のIF関数の3つめの引数の位置に、まるごともう一つのIF関数が入っていることがわかります。

このように、必要に応じてIF関数を多重化することで、複雑な条件式を作ることができるようになります。

応用テクニック

応用テクニック:エディターの活用

今まで紹介してきたように、だんだんと複雑な計算式を作成する必要が出てきたときに、kintoneの計算式の設定エリアが狭く、計算式全体を見渡すことが難しくなってきます。
※2020年2月のアップデートで計算式の入力エリアが改善され、折返しや改行が可能になりました。

そんな時に使えるのがテキストエディターです。
わたしはいつも、以前別の記事でも紹介した、マイクロソフトの無料ソフト Visual Studio Code を使っています。

初心者だからこそ「形から入る」〜適切な道具選び〜エディター編(kintoneカスタマイズ初心者)

このように、改行やインデントを使って視覚的に分かりやすく記述することができるので、間違いが少なくなりますし、計算式の複雑なロジックを考える時の助けにもなってくれます。

さらに嬉しいのは、エディターで作成した改行やインデント混じりの計算式をそのままコピーして、kintoneの計算式設定エリアに貼り付けることでも、計算式は正しく動作してくれます。

2020年2月のアップデートで、計算式の入力エリアが改善され、折返しや改行が可能になりました。かなり編集がしやすくなりましたね!でも、複雑な計算式を編集するときは、カッコの自動補完等、エディターを使うメリットもあります。(2020/2/4追記)


帳票への応用

もう1つ応用テクニックを紹介します。
kintoneで作ったラジオボタンやドロップダウンの選択肢フィールドを帳票に出力する時、通常では選択した値だけが表示されます。
しかし帳票には、他にどんな選択肢があったのかを並べて示した上で、どれが選ばれたのかわかるようにしたい、というケースがあります。

次のような自動計算を設定した文字列(1行)フィールドを用意しておき、帳票にはこちらを出力するように設定しておけば、選ばれていない選択肢も表示することができるようになりました。


ドロップダウンの値を使う場合の注意

ドロップダウンフィールドの値を使う場合は、1つ注意が必要です。
ドロップダウンには、ラジオボタンとは違った次のような特徴があります。

ドロップダウンは値の未選択状態がある

未選択状態を条件式の中で使いたいときは、次のような記述をします。

IF(ドロップダウン = “”, “未選択”, “”)

未選択の状態は、空文字(ダブルクォーテーション2つ)で表すことができます。これを使って、以下のようにドロップダウンが未選択であることを明示的に表示することが可能になります。

複雑な条件に対応できるAND/OR/NOT関数

IF関数の条件分岐を考えるときに、2つ以上の条件を組み合わせる必要がある場合があります。復数の条件を組み合わせて条件式を作るのに必要なのが、AND/OR/NOT関数です。

関数意味
AND(A, B)AかつB
OR(A, B)AまたはBのどちらか
NOT(A)Aではない

先ほど紹介した、次の計算式。金額が10万円以上であれば、割引が10%というものでした。

IF(金額 >= 100000, 金額 * 0.9, 金額 )

ここに、もう1つ条件が出てきた場合を考えてみましょう。
「購入者が学生の場合は、10万円以下でも10%オフで購入できる」

10%オフとなる条件は、次の2つとなります

  1. 購入金額が10万円以上
  2. 購入者が学生の場合

購入者が学生の場合は、10万円未満でも10%オフということですね。
よって、上の2つの条件のどちらかが成り立つ場合に、割引が適用されるということになります。

IF( OR(金額 >= 100000, 職業 = “学生”), 金額 * 0.9, 金額 )

複数フィールドの複合条件による分岐

次のようなテーブルを作ってみましょう。
単価のところに注目してください。

製品(ラジオボタン)とコース(ドロップダウン)の2つのフィールドの値によって、単価を変化させています。
単価フィールドは後続の計算でも使用しますので、計算フィールドを使います。計算式には以下のように設定してあります。

単価フィールド(計算フィールド)の計算式

IF関数が4つの多重構造になっています。今回は2つの選択肢を持つフィールドが2つ。2×2=4つのパターンがありますので、IF関数を4つ使って表現しています。

もっと応用:フォーム内に単価マスタを持たせてみる

単価を計算式の中に書いてしまうと、単価が変更されたときのメンテナンスが分かりにくくなる可能性があります。そこでフォーム内に数値フィールドを4つ設置し、ここに初期値として単価を設定し、単価マスタとして利用する、という場合について考えてみました。

計算式の中の単価の値段が数値で書かれていたところが、単価マスタのフィールドコードに変わりました。これで単価変更への対応もしやすくなりますね!

年齢から世代を求める

お客様の分析をする際に、年齢層別に分布を調べたりすることがあります。
年齢がデータとして存在する場合に、そこから世代を導き出す計算式を作ってみました。
年齢は数値の大小比較をしますから、数値フィールドに持っておく必要があります。もし、文字列で持っている場合は、一度「計算フィールド」を経由させると数値に変換することができます。

IF(年齢 < 10, “9歳以下”,
IF(年齢 < 20, “10代”,
IF(年齢 < 30, “20代”,
IF(年齢 < 40, “30代”,
IF(年齢 < 50, “40代”,
IF(年齢 < 60, “50代”,
IF(年齢 < 70, “60代”,
IF(年齢 < 80, “70代”,
IF(年齢 < 90, “80代”,
“90歳以上”
)
)
)
)
)
)
)
)
)

IF関数が何層にも連なっている計算式になりますが、IF関数はこのようなことにも応用できますね!

さいごに

どうだったでしょうか? これまでは、kintoneの標準機能では実現できないため、JavaScriptカスタマイズやプラグイン等を使うしかなかったことが、一気に可能になりました。

今回あげた例の他にも、いろいろな活用例があると思います。
kintoneは標準機能をうまく組み合わせることで、いろいろなことを実現することができます。みなさんもぜひアイデアを考えてみてください。

おもしろい活用アイデアができたら、ぜひ教えて下さい。この記事に加筆していきたいと思います。

こちらの記事もぜひ読んでみてください!

【kintone 業務改善】IF関数を使って軽減税率対応区分記載請求書アプリを作る

kintone導入・活用のご相談はこちら!

こんな悩みを抱えていませんか?

◇ kintone導入がなかなか進まない
◇ アプリが思ったような動きをしてくれない・・・
◇ カスタマイズやプラグインをどう選んだらいいの??
◇ 業務改善の進め方がよくわからない

サイボウズ公認 kintone エバンジェリストの 松田正太郎(kintone認定アプリデザインスペシャリスト資格保有)があなたの相談相手になります。

★業務改善アドバイス、kintone構築支援
★連携サービス・プラグイン選定支援、カスタマイズ
★詳細ヒアリングの上、御社に最適なプランを提案します
★初回打合せ(2時間程度)は無料。まずはお問い合わせください!(WebミーティングOK)
/* ページリンク */