見出し画像

チャレンジ!きんとん関数ドリル(解説つき)〜kintone Café JAPAN2021

※更新(2021/11/16)記事の末尾に、kintoneアプリテンプレートをダウンロードできるようにしました。

ここ最近のkintone関数の進化の歴史と・・・

上の記事でも解説したように、2020年以降、kintoneの関数は大きな進化を遂げました。その歴史をざっとまとめると次のようになります。

  • 2020年1月  IF, AND, OR, NOT関数の追加

  • 2020年1月  計算式でドロップダウン/ラジオボタンの値を利用可能

  • 2020年2月  ROUND, ROUNDUP, ROUNDDOWN関数の追加

  • 2020年2月  計算式入力欄の改善(エリア拡大、複数行・改行対応)

  • 2020年2月  YEN関数とDATE_FORMAT関数が計算式内でも利用可能

  • 2020年6月  計算式を入力するときに関数名を小文字で入力可能

  • 2020年8月  フィールドコードを変更すると、計算式にも自動反映

  • 2020年12月  CONTAINS関数の追加

  • 2021年3月  全角記号を入力した際に注意を促すメッセージを表示

チャレンジ!きんとん関数ドリル

2021年11月13日開催の kintone Café JAPAN2021では、この関数に焦点をあて、kintoneの計算機能を使うときの知識やノウハウを元に10問のクイズを作成し、参加者のみなさんで楽しんでもらう企画を考えました。

この記事は、クイズのチャレンジャーが復習するための記事ですが、読み物として読んでも何かを得ることができるのではないかと思います。
できれば、解説を見る前に自分で解答を考えてみてください。
それでは行ってみましょう!!

Q1:kintoneの「IF関数」がリリースされたのはいつか?



ここまでの記事を読んできたあなたなら、もう正解は分かりますね!?
そうです、2020年は kintone関数元年! その第一弾としてリリースされたのが「IF関数」でした。正解はA3の、2020年1月です。

第一問は楽勝ですね!さぁ、続いて行ってみましょう。

Q2:kintoneの標準機能で使用できる関数はどれか?



どこかで聞いたような関数が並んでいますね。
kintoneの標準機能で持っている関数は次の通り。

黒背景の関数は残念ながらkintoneにはありません

Excelでおなじみの「VLOOKUP関数」はもちろん、kintoneにはありません。もしkintoneに実装されたとしたら、他のアプリのデータが関係してくることになるので、計算式の複雑さが今より超格段に難しくなってしまいますね。これは無いほうがよさそうです。。。

平均値を求めることができるAVERAGE関数は、ぜひとも作って欲しいところですね。データの対象の個数が決まっている場合は現状でも問題ないのですが、対象データの数が可変する場合などは、計算式が複雑になってしまいます。例をあげてみましょう。

データの個数を求めるために、IF関数を活用しています


Q3:数値を丸める関数の中で「四捨五入」ができるのはどの関数か?



次は「数値の丸め」に関する問題です。
2020年2月に追加された、ROUND三兄弟をきちんと理解していれば分かりますね!

  • ROUND関数・・・四捨五入

  • ROUNDUP関数・・・切り上げ

  • ROUNDDOWN関数・・・切り捨て

なので、四捨五入できるのは「ROUND関数」ですね!

ここで見逃しがちなのが、しれっと選択肢に入っている「YEN関数」です。
YEN関数ってなんだっけ??という人も多いかもしれません。
ROUND関数ができるまでは、kintone唯一の数値丸め機能でした。あ、アプリの高度な設定数値と計算の精度」で、数値の桁数を設定することができ、この桁数への丸め方法を指定することができますが、今回は省略します。
ヘルプを読んでみましょう。

YEN関数
計算結果を3桁区切りの「¥(円)」形式で表示します。また、指定した桁数で数値を四捨五入します。

YEN関数は、次の書式で使用します。
YEN(数値, 四捨五入の桁数)
「数値」には、「数値」フィールドのフィールドコード、値が数値になる計算式、または数値を指定します。
「桁数」には、四捨五入する小数点以下の桁数を指定します。負の数値を指定すると、正の桁で四捨五入されます。四捨五入の桁数は省略できません。
計算結果は文字列型になります。

※数値フィールドと計算フィールドでは、フィールドの設定画面で桁区切りの表示を設定できます。

演算子と関数の一覧〜 kintoneヘルプ

このYEN関数も、数値を四捨五入することができます。
ただし、計算結果は文字列になってしまうため、次工程にさらに数値の計算がある場合などには使用することができないことに注意が必要です。


Q4:テーブル内の数値フィールドに対して、テーブル外からその合計を求めたい時に使う関数は何か?



kintoneアソシエイトを取得されたみなさんであれば、楽勝問題ですね!
SUMIF関数は kintoneにはありませんね。
SUM関数は、次の2とおりの使い方ができますので覚えておきましょう。

  1. SUM(数値1, 数値2, 数値3・・・) 
    指定した数値の合計を求める。「+」と同じイメージですね。

  2. SUM(テーブル内の数値型フィールド) 
    テーブル内の数値型のフィールド(数値フィールド、計算フィールド)を指定することで、テーブルの各行の合計を求めることができる。


Q5:2つの時刻フィールドの差を「何時間何分」の形式で求めたい。正しい計算式を全て選べ。



Q5は「時刻計算」です。2つの時刻フィールドの差を求めるという問題です。ポイントは「何時間何分」という形式で求めたい、というところです。

時刻フィールドの値の実体は数値形式の「秒数」です。
数値形式のデータなので、直接足し算引き算という数値演算を行うことができます。なので、「終了時刻 - 開始時刻」という計算式で時刻の差の秒数を求めることができますね。

ここで先ほどのポイント「何時間何分」という形式にする方法を考える必要があります。
上の図のように、計算フィールドには計算結果の表示形式を指定する機能があり、○時間○分という時間形式を選ぶことができます。

2番めの選択肢にある、「(時刻2 - 時刻1) / (60 * 60)」は何をしているでしょうか? 60*60秒というのは、1時間(60分)の秒数を表していますので、何時間か?ということを数値で求めることができることになります。
8時間30分の場合は、8.5時間という少数形式になります。

もう1つ、DATE_FORMAT関数も忘れてはいけません。日時や日付で使うものと思いがちですが、時刻に対しても使うことができるんです。
日時以外のフィールドに対してDATE_FORMAT関数を使うときに注意が必要なのは、タイムゾーンの指定。
いつでも、”Asia/Tokyo”とか”system”にしておけば大丈夫だろう。と考えている人もいるかもしれません。

日時フィールドを扱うときは、自分のいる場所のタイムゾーンにしておけばOKです。しかし、日時フィールド以外(日付フィールド、時刻フィールド)を使うときは、タイムゾーンを「”Etc/GMT”」にする必要があります
Etc/GMTのGMTは、Greenwich Mean Timeの略で、経度0であるイギリスのグリニッジ天文台の世界標準時を表しています。

時刻フィールドの値は、0:00を起点とした秒数です。一方でDATE_FORMAT関数のタイムゾーンは、GMTとの差の秒数を足し引きするという処理を行うため、せっかく時刻の差の秒数を求めたのに、それに対してタイムゾーンの差の秒数を足し引きされてしまうと、求めたい差の時間がずれてしまうことになります。

kintoneヘルプにも記載がありますので、確認しておくといいと思います。

[DATE_FORMAT関数]日付や時刻の表示形式を指定して表示する〜kintoneヘルプ


Q6:フィールドのデータと文字列を結合したい。文字列にダブルクォーテーションを含めたいが・・・

Q6は、文字列結合の問題です。
計算式の中で、文字列を入れるとき、ダブルクォーテーション「”」で囲んで入力します。フィールドコードや数値はそのまま入力しますが、任意の文字列を指定する場合は、ダブルクォーテーションで囲んであげる必要があります。

今回のお題は、このダブルクォーテーションを、計算結果の文字列に入れたいが、できるのかどうか?という質問です。お題では氏名が入力されたフィールドがありますが、その氏名をダブルクォーテーションで囲んだものを含んだ、計算結果を作りたいということです。



普通に計算式を頑張ってみましたが、どうやら計算式中で文字列(ダブルクォーテーションで囲まれている)の中に「ダブルクォーテーション」を含ませることはできませんでした。

こういう場合は、ちょっと頭を切り替えて工夫することが必要です。
初期値としてダブルクォーテーションだけを入れた、文字列(1行)フィールドを用意しておきます。フィールドコードは「区切り文字」としました。
これを計算式の中で結合してあげることで、見事、ダブルクォーテーションを含んだ文字列を得ることができました。

このように、1つのフィールドで全てを考えてしまわない。ということは、非常に大事な考え方です。
計算の途中過程で得られる値や、同じ計算式が何回も出てくるような複雑な計算を行う場合は、フィールドを分割してあげることで、結果的に読みやすくシンプルなアプリ構成にすることが可能です。


Q7:2つのラジオボタンで点数を選択させるアプリで、点数の合計を求めたい。正しい計算式を全て選べ。

数値を選択するラジオボタンが複数個あるときに、その選択された値の合計を出したい。何かのポイントをラジオボタンで選ばせ、その集計をしたいときなどによくある使い方です。



ラジオボタンの選択肢が数字が入っているとき、そのまま計算できそうな気もしますが、実はラジオボタンの値のデータ形式は文字列。これは数字が入っていたとしても、それは文字列として扱われます。

そのため、文字列の数字を、数値型に変換してやる必要があります。
文字列→数値の変換方法は2つあります。
1つめは「IF関数」を使う方法
ラジオボタンの値が「1」だった場合、1(数値)に、というようなIF関数を書きます。このとき値をダブルクォーテーションで囲んでしまうと、それは文字列形式になってしまいます。数値はダブルクォーテーションで囲まず、そのまま記載するよう注意しましょう。

1つめのA1は、計算フィールドの中でラジオボタンの値を直接足し算しようとしています。しかし、ラジオボタンの値は文字列型なので、文字列を足し算しようとしたため、型が違うというエラー(#VALUE!)になってしまいます。

A2とA3は、ロジックは違いますが、結果は同じになります。
A2は、2つのラジオボタンの各選択肢6つを、それぞれ数値に変換し、すべてを足してやることで合計を出します。選択されていない場合を0とすることで、IF文の入れ子(ネスト)を使わず、書きやすく読みやすい計算式とすることができます。

A3は、ラジオボタン毎に何が選ばれているかを判定し、数値を指定するという書き方をしています。
どちらも間違いではありません。今回のように単純に数値変換するだけの場合だと、A3よりもA2の方がシンプルな構文になりますね。両方とも理解できるようにしておきましょう。

もう一つの文字列→数値の変換方法は、計算フィールドを使う方法です。
計算フィールドに、文字列形式の数字を入れると、数値型に変換することができます。

この方法のメリットは、IF関数を使わずにすむことです。
ラジオボタンの数だけ計算フィールドを設置し、それぞれ数値へ変換してやります。そしてその変換された数値を合計してあげることで、シンプルな計算式で合計を求めることができました。

このように、フィールドを分けることで、あとから見たときに理解しやすく、シンプルな計算式でアプリを作ることが可能になります。いろいろなケースでこの方法を使うことができます。
計算用のフィールドは、通常のアプリ利用者に見えてしまうと、見た目が複雑になってしまうことも考えられます。通常利用に必要のないフィールドは、グループフィールドに入れて隠しておくというテクニックを使うことができますので、覚えておきましょう。


Q8:チェックボックスで選択された点数の合計を数値として取得したい。正しい計算式を全て選べ。

8問目はチェックボックスの選択肢が数値の場合、選ばれた数値の合計を求めたいというケースです。サンプルの場合、1と3が選択されているので、1+3=4を求めたい。



チェックボックスフィールドの特徴は、複数個の選択肢を選ぶことができるということです。
チェックボックスフィールドや、複数選択フィールドのように、複数個の値が入る可能性があるフィールドのデータの形式を「配列型」と呼びます。

配列型のデータの値は、直接計算式で用いることができません。配列型のフィールドは、CONTAINS関数の中で使うことができます。CONTAINS関数は、複数ある選択肢の中に、指定した選択肢があるかどうか?を判定するための関数です。
判定するということは、CONTAINS関数の結果は、真/偽(true/false)を表すということです。真偽を表すといえば、IF関数の条件式が思い浮かびますね!

CONTAINS関数は通常、IF関数の条件式に使います。単独でCONTAINS関数を使うことも可能です。計算フィールドと文字列(1行)フィールドでその結果は異なります。この結果をIF関数の条件式内で使うことも可能です。
条件式の中が複雑な計算式になってしまう場合は、フィールドを分割することを考えてもいいかもしれません。



Q9:「年齢計算」「経過年数」は標準機能でできるか?

kintoneヘルプには、年齢計算と経過年数の表示はJavaScriptカスタマイズを使用することで可能だと書いてあります。



関数芸人の芸は、公式ヘルプをハックする領域まで到達したようです(笑)
YMD法」と呼んでいますが、日付を「YYYYMMdd形式」の数値に変換することで、ある2つの日付フィールドの差を求めて、年齢計算や経過年数計算を行うことが可能です。

上の例では、生年月日:1967年8月8日を、19670808という数値に、
年齢算出の基準日:2021年11月13日を、20211113という数値に変換しています。
ここで使用するのはもちろん!DATE_FORMAT関数です。

YMD形式で数値変換した2つの値の差は、2つの日付の間の年月日を表しています。年齢を求めるときは、これをYYYY.MMddというふうに、10000で割ることで、年数を表す少数にすることができます(上の図参照)。

これを整数になるよう「切り捨て」をすれば、年齢を求めることができます。切り捨てはROUNDDOWN関数ですね!

経過年月(○年○ヶ月)を求めるのも、年齢計算の応用で可能です。
年数は年齢と同じ方法で求められます。
○年○ヶ月の月数を求めるためには、YYYY.MMddではなく、MM.dd形式を求めればいいですね。同じくROUNDDOWN関数を使うことで月数を求めることができます(上の図参照)。

このYMD法は、うるう年やうるう日にも対応した年齢計算を行うことができます。制約としては、年齢算出の基準となる日付を、フィールドのデータとして持ってやる必要があるということです。


Q10:計算式の文字数の制限値は?正しいものを1つ選べ。

最後の問題は、制限値問題です。
kintoneの計算フィールド、文字列(1行)フィールドの自動計算の計算式に入れることができる文字数の制限値は何文字か?



kintoneヘルプを参照してみましょう。
文字列(1行)フィールドについては、「値の重複を禁止」した場合は64文字という制限がありますが、重複禁止を設定していない場合は制限はありません。

計算フィールドも、計算結果については桁数制限があります。これはアプリの「高度な設定」で設定することができる数値の桁数設定の制限値となります。
ただし、計算式については制限値は無いようです。

そういえば、
2020年1月にIF関数が実装されたとき、愛媛のキン爺さんはなんと!IF関数の入れ子(ネスト)の限界に挑戦し、256個?512個?(正確な数字は忘れましたが、スゴイw)の多重IF関数が正しく動くことを確認されていました。

複雑な計算式をもつアプリ構築4つのポイント

kintoneの計算式は、私たちが実用上必要な文字数は、十分入るようです。
でも、実際に複雑な計算が必要な場合は、次のような方法を駆使して、なるべく後から見たときに理解しやすく、後々のメンテナンスがしやすいようなアプリを心がけましょう。

  1. 長い計算式を書くときは、改行・スペース・インデントを活用して、分かりやすく書く

  2. 計算の途中段階を別フィールドに分割することで、計算式のチェックや修正がしやすくなる

  3. 計算式の内容や考え方、目的などの解説をラベルフィールドに書いておく

  4. 中間フィールドや解説ラベルが通常運用時に邪魔になる場合は、グループフィールドに格納する

アプリを作るときは、「今動かす」ということだけに注意が行きがちです。でも kintoneの良さの1つとして、使い始めたアプリは業務改善の進捗や環境の変化に合わせて変化させていくことができることが挙げられると思います。
「今動かす」ことも大事ですが、常に半年後1年後、場合によっては、自分がいなくなった後のことを考えることも大切なことだと考えます。

みなさまの kintone活用、業務改善が楽しく実り多いものであるよう、応援しています!


こちらの記事も参考に!

今回の問題のネタが仕込まれているアプリテンプレートを配布します。
アプリテンプレートからアプリを作る方法は、、、ご存知ですよね!
>ヘルプ


いただいたサポートは、今後とも有益な情報を提供する活動資金として活用させていただきます! 対価というよりも、応援のキモチでいただけたら嬉しいです。