公開日:2024-12-07
何それ?
あ、R3の沖と言います。
こちらはCustomine(カスタマイン) Advent Calendar 2024
12/7の記事になります!!
12/5にfindifの話題がありましたので、ご要望にお応えしてみました(^^
えーとですね、Customineには「findif 関数」という関数がありまして、よく「使い方が難しいよね」的に言われております。確かに機能がイメージし辛かったり、イメージできたとしてもどういう時に使うのかが分かりにくいようにも思います。
そこで基本的な動きから色々な組み合わせまで試してみよう、という内容になります。
findifの使い方
こちらのドキュメント内の使用例の箇所にも詳しく書かれています。
https://docs-customine.gusuku.io/ja/functions/findif/#使用例
簡単に言うとExcelのフィルタのような動きです。
例えば上のようなデータがあるとして、都道府県が愛媛県と等しいというフィルタだとこうなります。
元の表を $3 と表現してfindif関数で表すと、
findif($3.都道府県, “=”, “愛媛県”, $3)
になります。
findif($3.都道府県, “=”, “愛媛県”, $3.金額)
だと
だけです。関数の結果をどのように使用するかによって4つ目の引数の書き方を変える必要があるので、その点を意識していただくと良いと思います。なお、
findif($3.都道府県, “=”, “愛媛県”, $3).金額
でも結果は一緒です(と、混乱させてみるw
取得したレコードを使ってみよう
「条件を組み立ててレコードを取得する」などで取得したレコード内の売上を合計するような場合は「レコード中のフィールド合計値を計算する」だったり、項目別で合計するなら「レコード内の条件に合う行のフィールド合計値を計算する」があります。
ただ、これらは1アクションで1つの合計値なので、先ほどのように都道府県別で合計値をテーブルに追加となると「リストから要素を取り出す」で都道府県別に処理を繰り返す必要があります。その場合の設定は、こちらのページが参考になると思います。
https://support.gusuku.io/ja-JP/support/solutions/articles/36000381989
実は「リストから要素を取り出す」を使わなくても、「レコードをテーブルに書き出す」のマッピングで「findif 関数」を使うと1アクションで全都道府県の集計値をフィールドにセットできてしまうんです。
例えば、年月の明細がこんな感じだとします。
動作結果はこんな感じになります。日付を選ぶと年月が決まり、あれば集計結果に合計値をセットという動きになります。ただ、この場合はデータのある都道府県のみが集計の対象となるので、データのない都道府県を0にする場合は別アプリで全都道府県のレコードを作っておく必要があります。
設定画像はこんな感じです。せっかくなので日付が空欄時のエラーと読み込み画面の表示も追加しておきました。
こちらにも同じような設定があるので参考にしてください
https://support.gusuku.io/ja-JP/support/solutions/articles/36000395039
あ、そうそう
都道府県マスタを用意して集計する場合、明細の方にはレコードがないので「sum 関数」で合計しようとすると、
= sum([])
という感じになります。(一致する都道府県のレコードがないので、findifの結果が[]になる)
この場合は「sum 関数」のドキュメントに記載の
> 数値を表さないものを指定すると NaN (数値ではないことを示すもの)が返ります。
に該当するので結果を数値としては使用できません。
ではどうするのかというと、いろいろな対応方法はあるのですが一番シンプルなのは、
= sum(append(0,[]))
と、常に0を配列に追加しておくという方法です。こうすると「if 関数」や「count 関数」を使わなくていいのでシンプルになります。実際にfindifも入れると式はこんな感じになります。
= sum(append(0,findif($3.都道府県, “=”, 都道府県, $3.金額)))
なお、「if 関数」や「count 関数」を使うとこんな感じです(と、混乱を超えた混沌へ誘ってみるw
= if(count(findif($3.都道府県, “=”, 都道府県, $3.金額)) = 0, 0, sum(findif($3.都道府県, “=”, 都道府県, $3.金額)))
・・・いや、自分で書いておきながら言うのもアレだけど、なんだこれw
多段findifってのもあってね
先ほどのマッピングの値は
= sum(findif($3.都道府県 , “=”, 都道府県 , $3.金額))
でした。これは都道府県が同一の金額合計ですね。続いては、金額が一定額を超えている件数も計算してみましょう。今回は金額が50万以上を条件として件数を計算することにします。イメージとしては、
= count(条件に一致するデータ)
になります。簡単ですね。あとで置き換える箇所はハイライトしてます。最終的にこれが全て無くなると式の完成です。
今回の条件はセットする都道府県と同一の50万以上の件数を知りたいので、
= findif(同一都道府県のデータ.金額, “>=”, 500000, 同一都道府県のデータ)
になります。4つ目の引数は値が不要なのでデータのみの指定で大丈夫です(フィールドの指定は不要)。まとめると、
= count(findif(同一都道府県のデータ.金額, “>=”, 500000, 同一都道府県のデータ))
ですが、まだハイライトは消えてませんね。そこで最初の金額の式を代入してみると、
= count(findif(findif($3.都道府県 , “=”, 都道府県 , $3).金額, “>=”, 500000, findif($3.都道府県 , “=”, 都道府県 , $3)))
となります(伏線回収
さて、これで件数がカウント出来るかを試してみましょう。
出来ました。
このように幾つでも多段で記述できるので集計処理は大体なんでも出来ます。join的な動きも出来るし、なんなら「定期実行」で作成すると月次集計とかが楽々です。
こちらのページが参考になると思います。
https://support.gusuku.io/ja-JP/support/solutions/articles/36000370259
Job Runnerの場合は1アプリスロットで実行時間が3時間までなので、対象アプリ数や実行回数は特に制限はありません。ですので、日次集計と月次集計を店舗アプリ別ってのも可能です。しかも、元レコードを修正した後に「定期実行タスクを直ちに起動する」で時間に関係なく呼び出すことも出来ます。ヤバい。
こちらのページが参考になる。。かな?
https://support.gusuku.io/ja-JP/support/solutions/articles/36000268287
本当にできるの?
「定期実行」はJob Runnerという仕組みで動作していて「kintoneアプリのカスタマイズ」とは少しイメージが異なります。なのでそこで戸惑う人もいそうです。設定の概要を作ってみるとこんな感じになります。1番のアプリのレコードに、キーで紐づく2番のアプリのレコードのフィールド値をセットするという感じです。
接続設定の後に3番で2番のアプリからレコードを取得してから「レコード全行が準備できた時」で4番に繋ぐと、4番以降では3番の結果を全て使えます。この辺に注意が必要です。その後に4番で1番のアプリからレコードを取得して「レコード1行が準備できた時」で繋ぐと5番以降では4番の結果は1レコード単位になるので、フィールド値もそのレコードのフィールド値を参照できます。
・・・伝わるかな。。
まぁ、あくまで設定のイメージなので!
実際にはもっと色々とできますが、その辺はリクエストがあればー
なお「レコードをフィールド値毎に束ねる」という「やること」もあって、元になるレコードをまとめるという動きならこちらの方が良いかもです。先ほどの例は2つのアプリのレコードを結合したレコードを作成可能ということですね。日付は元レコードから転記でYYYYMMは別アプリから紐づく値をセットというイメージです。
なお、なぜ「stringmax 関数」があるかとういう話を始めると終わらなくなるので、リクエストがあればどこかで。。。
配列ならばなんでもいけるよ
先ほどまでは分かりやすい例でレコードの値を使いましたが、findifでは配列が対象なので、他にも色々と可能です。例えばチェックボックスの値とかユーザー選択とか添付ファイルとかも指定可能です。
ユーザー選択を使った例はこちらのページが参考になります。使用中のアカウントだけを抜き出すという動きです。
https://support.gusuku.io/ja-JP/support/solutions/articles/36000452797
もしかしてテーブルも?
いけます。例えば累計計算とかをするのなら行番号を用意しておくと、こんな感じ。
設定はこちら。
若干手を抜いているので、テーブルは全行更新になってます。なので、レコードの変更履歴がちょっと多めになりますね。
まさか関連レコードも・・・?
できらぁ! ・・・とは言え、どんな動きにするか。。
あ、そうだ、関連レコードの金額を合計するというシナリオで考えてみましょう。
まずは、こんなアプリを追加してみます。これは都道府県の年単位で金額を合計することを想定しています。計算の元になるレコードは関連レコードで表示しているという構成ですね。これに合わせて、年月の明細にもキーになる「YYYY_都道府県」というフィールドを追加してます。
このアプリ構成で、金額合計に関連レコードの合計値をセットすることは編集画面なら簡単と思うのですが、一覧画面で一括更新となると難しいと思います。そこで、画像のように一覧画面で表示する全レコードを更新して、金額合計に値をセットするという方向で作成してみます。
以下のようにボタンを配置して押すと、金額がセットされました。
設定はこちら。
読み込み中画面を表示した後に、終了させずにリロードするのが好みなので、今回もそんな設定にしてます。これで関連レコードの一括更新も楽々ですね。まぁ、更新対象レコードが数万とかになると集計元のレコード数が数十万とかになって時間がかかるとか、パソコンは負荷に耐えられるのかなどもありますので、ほどほどで。。
変わった例
一覧画面では「フィールド値が特定の値ならば」で表示しているレコード単位で処理が可能です。処理といっても、一覧画面を表示時なので大体はフィールド装飾になります。具体的な例はこちらを参考にしてください。
https://support.gusuku.io/ja-JP/support/solutions/articles/36000367520
重複判定用のフィールドが不要なので、リアルタイムに重複しているレコードの色を変更できるのが便利ポイントですね。
最後に
色々なfindifの使い方がありますが、組み合わせすぎると動作確認が大変になるので、行き詰まったら式を分解して個別に値を確認するようにしましょう。
その場合は「情報ダイアログを表示する」だったり「コンソールにメッセージを出力する」が便利だと思います。皆さんも色々と試してくださいね〜
あ、あと、出来るからと言って、使うのが良いというわけではありません。色々な「やること」で同じ結果を取得したり、「リストから要素を取り出す」で順に処理をする方が分かりやすいというケースもあるので適材適所でー
投稿者プロフィール
-
"サイボウズ公認kintoneエバンジェリスト
Customineでも色々とやってます"
最新の投稿
- gusuku2024年12月7日「findifや ああfindifや findifや」
- life-work2022年12月9日アメリカでリモートワークしてみた
- kintone2022年8月25日エキスパート試験を受けてみました!
- gusuku2020年9月10日作業時間を計算してみよう