見出し画像

\初心者でも大丈夫!/キントーンの自動計算の書き方①

標準機能で使えるkintoneの「自動計算」。
合計や条件表示など、簡単なものならプラグインやカスタマイズなしで、Excelの関数くらいの知識で書けるので、私もかなり重宝してます。

でも最近キンコミでこの自動計算の書き方について、「よく分からない💦」の書き込みをよく見るようになった(Excelの関数くらい、と言いましたが、それほど自由でもない。)のと、実は自動計算の書き方がプログラミング初心者には難しい(ヘルプにも丁寧に書かれていますが、ガチな初心者やちょっと応用したいと思う人にはちょっと分かりづらい)ので、ここにまとめていこうと思います!


kintoneの「自動計算」でできること

kintoneでの「自動計算」とは、レコードの登録内容に合わせて、その場で自動計算してくれる、Excelで言う、SUMやIFが事前に設定できるフィールドのことです。
でも使える関数が限られているので、何が出来て、何が出来ないのか改めて確認していきましょう!

使える関数

・IF/AND/OR/NOT
・CONTAINS
・ROUND/ROUNDUP/ROUNDDOWN
・SUM
・DATE_FORMAT
・YEN

それぞれの初歩的な使い方はkintoneのヘルプに丁寧に書かれていますので、こちらをご確認ください。

2024年3月現在使えるのは、以上の11個。
お気づきの方もいるかもしれませんが、そうなんです。
TODAYCOUNTACOUNTIF(S)SUMIF(S)はありません。
じゃあどうやってカウントするんだ…!?という話なんですが、そういったテクニックを今回しっかりまとめていきます!

アプリ設定からも使える関数は常に確認出来ますよ♪

*******

計算フィールドの使い分け

実はあまり知られていないようですが、計算フィールドは2つ存在します。

一つは単純に「計算」と書かれたフィールド。
こちらは「数字のみ」を計算結果として出します。

もう一つは「文字列(1列)」フィールド。
計算結果を文字として表示したい場合に使用します。

よくある間違いとして、計算結果に応じて文字を入れたい!という場合に「計算」フィールドを使っていると一生エラーします。(泣
じゃあ文字列だけ使えばいんじゃね?と思うかもしれませんが、計算は計算で表記や単位、小数点以下の表示まで計算式不要で細かく設定できるので楽なんですよね~。

ということで、ここからは実践!
実際にあったケースを参考に、計算式を書いていきます!


*******


【ケース①】在庫計算

テンプレートアプリとしてよく使われる在庫管理アプリ。在庫数を入れて、出庫数を入れれば、紙ベースでは管理が大変だったのが、kintoneにすればすっきり簡単!というのが売りです。(ほんとにそう。)

キンコミで良くあるのは、

出庫数が在庫数をオーバーしたらアラートしたい

というもの。
実際に管理する側としてはそうですよね。
「保存できなくする」とかはまた別のカスタムが必要なので(条件分岐処理プラグイン(無料)で出来ますね)、今回は省きますが、「ここにマイナス(オーバーしてる)って出たら出庫出来ないですからね!」という現実を突きつけたい。(よく見ろマジで。って思いますよね。笑)
あとはレコード条件通知などで、在庫がゼロになったら関係者に通知する、ということも出来ます。

【例1】在庫数と出庫数だけを計算したい場合

計算フィールドです。

在庫数 - 出庫数

と入れるだけ。(フィールドコードを変えた場合はそれに応じて設定してください。)
あとは、コンマが付けたい!単位も!というところを欲しいままに設定。

こんな感じですかね。

フィールドコードは変えられるので適宜変えましょう。
「数値」「数値_0」となってると後で「これどれのことだ?」となるので、必ず変えましょう!

【例2】出庫数が在庫数を上回ったらNGを出したい

文字列(1列)フィールドです。
計算式も変わります。例1にIF文を追加していきましょう。

IF(( 在庫数 - 出庫数 ) > 0 , "OK" , "在庫数をオーバーしています" )

こんな感じですかね。
もう少し応用してみましょう。

IF(( 在庫数 - 出庫数 ) > 0 ,
     "OK 在庫残り:" & ( 在庫数 - 出庫数 )  & "個" ,
     "在庫数を" & ( 出庫数 - 在庫数 ) & "個オーバーしています" )

とすると、0より大きければ(在庫があれば)「OK 在庫残り:○個」、
マイナスなら「在庫数を○個オーバーしています」と出ます。
Excelみたいですね。笑

*******

★記載時の注意事項

kintoneの計算式は、Excelとは違い、プログラミングに近い仕様になっています。
ですので、Excelの関数とは若干書き方が変わります。

①各フレーズの間に半角スペースを入れる

IF((在庫数-出庫数)>0,
     
"OK",
     ␣"在庫数をオーバーしています")

前述したものを分解するとこんな感じ(␣の部分がスペース)

「どこに入れたらいいか分かんないです!」という方は、とりあえず上記のように要素ごとに入れるのがおすすめ。
ちょっと面倒かもしれませんが、視認性が良くなるのと、スペースが余分にある分にはちゃんと動くので、(改行以外でいくつもスペースを重ねるのはあまりおすすめできませんが…)スペース入れ忘れて「動かない!💦」というストレスを減らすためにも、丁寧に入れていくのをおすすめします。

②頭に「=(イコール)」は要らないの?

不要です!

プログラミングでもそうですが、先頭に「=」は付けません。
まあ間違えて付けても勝手に削除してくれる安心仕様ですので、
「Excelの関数も良く使う」という人は、混同してExcelの方を忘れないように頭に「=」付けて書くのもアリだと思います。(´ー`*)ウンウン

ちなみに、Excelもですが、関数は適宜改行OKです。つらつら書くと後から修正する時に「どこだ!?」となりがちなので(私もExcelではつらつら書きすぎて他の人には難解に…( ̄▽ ̄;))、こんな風に⇩改行することをおすすめします。

IF(( 在庫数 - 出庫数 ) > 0 ,
     "OK 在庫残り:" & ( 在庫数 - 出庫数 )  & "個" ,
     "在庫数を" & ( 出庫数 - 在庫数 ) & "個オーバーしています" )

「うまく改行できない💦」という場合は、ChatGPTくんに書き直してもらうのも良いですよ~♪

*******

【ケース②】日にち・時間計算

例えば出退勤を管理したい、という場合、朝9時に出社して、20時に退社。何時間働いた?という計算を自動でさせたいですよね~。
でも時間の計算ってちゃんと把握していないと訳が分かりません。
そこで、まず前提条件を確認していきましょう!

一応ヘルプにも書かれていますが、文系にはちょっとキツい…💦(呪文かな?)ので、もう少しざっくり書いていきます。

【日にちの計算】
日付、日時、時間フィールドは”秒”で計算されます。
開始日:2024/1/1 ~ 終了日:2024/1/2 なら
1日分 × 24時間 × 60分 × 60秒 = 86,400 (秒)

開始時間:9:00 ~ 終了時間:20:00
( 20 - 9 ) * 60 * 60 = 39,600 (秒)
ということですね。

※四則演算記号:
(足す)+ → + (引く)- → - (かける)× → *  (割る)÷ → /
(乗)^

※等式、不等式記号(比較演算子):
(一致)= (以上)>= (以下)<= (超)> (未満)<
(以外/ノットイコール)<>(もしくは !=)
 ※文字列の場合の以外:"<>○○"

これを踏まえて計算していきましょう!

【例1】勤務時間だけを計算

日時の計算をする際に、必ず使う関数として「DATE_FORMAT」があります。ただ単純に「退社時刻 - 出勤時刻」とすると、計算結果が「秒数」で表示されるので、「何時間働いたのか」がパッと分からないため、DATE_FORMATを使って、「時間」に直していきましょう!

まず、出勤時間と退勤時間のフィールド、そして勤務時間を計算する計算フィールドを用意します。

開始時刻と終了時刻にはフィールドコードをそれぞれセットしておきましょう。

フィールドコードは日本語でもOKですが、SEに慣らされた私は英語です。
JSカスタマイズなどをする際はフィールドコードが日本語だと結構面倒だから、という理由です。
(実際にかなり面倒w)

ではこれを踏まえて計算式を書いていきます。

DATE_FORMAT ( goal - start , "hh:mm" , "Asia/Tokyo" )

日本時間での計算の場合

式の中身の解説としては、
DATE_FORMAT ( 終了時刻 - 開始時刻 , "表示形式" , "タイムゾーン" )
となっています。
表示形式についてはこちら⇩

あれ?秒数の変換は要らないの?と思うかもしれませんが、大丈夫です!
Excelでも数値指定しているセルに日付を入れると5桁くらいの数字で出ちゃうことありますよね。(「シリアル値」というものですね)
kintoneも表記を指定しないと秒数で表示される、というだけなので、日時を日時で返したいという場合は「DATE_FORMAT」を使用しましょう!


【例2】残業時間を計算したい

では応用編。
勤務時間は分かったけど、その勤務時間の内、残業時間は何時間?となりますよね。ということで計算していきます!

★何時から何時までが残業扱いなのか、確認しよう!

例えば、定時が9:00~18:00なら、18:00~9:00までは残業(一旦深夜とか早朝とかの区分は省きます。)になりますよね。(昼休憩1時間を含む形にしています)
ここで前述の「時間=秒数」ということを思い出します。
0時~24時までは秒数に直すと、0~86,400秒となりますね。
つまり、

開始時間:start >= 9 * 60 * 60(32,400秒以上)
終了時間:goal <= 18 * 60 * 60(64,800秒以下)

こちらが定時内になります。
しかし、このままだと早退や遅刻もOKになってしまいます。(9:00~18:00内なので)そこで勤務時間を指定していきましょう。

★最低勤務時間を計算しよう!

( 18 - 9 ) * 60 * 60 = 32,400(秒)

こちらが一日の最低勤務時間になりますね。
つまり、

IF ( goal - start >= (( 18 - 9 ) * 60 * 60 ) , 
DATE_FORMAT( goal - (18 * 60 * 60 ) , "hh:mm" , "Asia/Tokyo"
),
"残業なし" )

これで、勤務時間が9時間を超えてる場合は、残業時間が、超えていなかった場合は残業なしという扱いになりました。

ちなみに式内の算数を数値(32,400)ではなく式のまま((( 18 - 9 ) * 60 * 60 ))にしているのは、
後で見直した際に何を基準にしたものなのか分かりやすくする、というのと、万が一基準が変わった時に、(例えば勤務時間が9時~18時から10時から18時になったなど)時間の部分を書き換えれば計算不要で修正が簡単というメリットがあるためです。

【例3】深夜残業を指定したい

さてお次は深夜残業を指定してみましょう。
一般的には、22時~5時辺りが深夜残業に当たりますかね?(就業規則によって異なると思うので、実際に設定したい場合は必ず会社に確認しましょう。)
つまり、22:00~以降、0:00~5:00までを指定していきます。

※22:00~0:00 もしくは 22:00~23:59じゃないの?と思われますが、
 秒に直すと79,200~0と反転してしまうのと、23:59:59も深夜に該当する(86,340と計算できますが、秒以下の23:59:59:10とかが該当しなくなる)ので、22:00以降(以上)で計算するのがベター。

▲…深夜残業なし
○…深夜残業あり

IF ( AND ( start >= (5*60*60) , start <= (22*60*60) , goal >= (5*60*60), goal <= (22*60*60)), "▲" , "○" )

【キンコミ】深夜残業の計算方法に関する投稿

計算式を記述する際に重要なのは、条件確認です。
IF文などは特にそうですが、まず何を条件にしたいのか、その後、真ならどういう処理をしたいのか、偽ならどうするのか、というのをはっきりさせる必要があります。

例えば条件がいくつも重なっていて、どこから処理したらいいのか分からない場合は、一番”ない”ものを頭に持ってくるときれいに作れます。
(書き出してみるのも良いですね!)

あとよくあるのは、() や , の付け忘れ。
長くなるとやりがちなので、私は先にIF文をざっと書いてしまうようにしています。

IF(  ,  ,
    IF(  ,  ,
       IF(  ,  ,
          IF(  ,  ,
            IF(  ,  ,
               IF(  ,  ,  )))))

こんな感じ。

こうすればコンマの間に条件や真偽値を入れるだけなので、ミスを減らすことが出来ます。(試してみてください♪ 笑)

*******

自動計算はまだまだ奥が深いので、他のケースはまた次回書きます!
是非参考にしてみてくださいね~٩( ''ω'' )و


いいなと思ったら応援しよう!