アプリAのフィールド
回答者、対象、カテゴリ1の設問10個(フィールドコードは1_1~1_10)、カテゴリ2の設問10個(フィールドコードは2_1~2_10)
設問はすべて1~6の数値が入ります。
アプリBにてこのアプリの集計をしたいです。
アプリAの「対象」毎に、カテゴリ1の設問の平均値、カテゴリ2の設問の平均値を集計したいです。
1レコードで1つの対象を集計するイメージです。
関連レコードの項目を条件付きで集計を参考にしようと試みましたが、どのように当てはめればいいかわからず・・・
何もわからない状態ですが、少しでもご教授いただければ幸いです。
初心者様
お世話になっております。
トヨクモの江田と申します。
アプリBは作成せずに、アプリAでkintone標準の集計機能を使うのはいかがでしょうか?
https://jp.cybozu.help/k/ja/user/app_collectdata/summarize.html
江田様
ご回答ありがとうございます。
説明不足でした。対象者毎に平均値を出したのち、その値に応じてS,A,B,C,D,Eの6段階で区分けしたいため、このような形を取ろうとしております。
対象者毎に平均値をフィールドに入れ、IFを使いS~Eで区分けしようと考えています。
初心者様
お世話になっております。
返信が遅くなり申し訳ございません。
標準の集計機能では実装困難ということですね。
私個人の意見としては、アプリAのデータのみを集計するのであれば、アプリBをつくらずに、アプリAのカスタマイズビュー等に集計結果w表示する方が楽かと思います。
集計結果をレコードとして保存する場合、アプリAで更新があった際にアプリB側に差分を更新する必要があるなど、管理が複雑になるかと思います。
計算コストが大きい場合など、集計結果を保存してしまった方が良い場合もありますが…。
以下、アプリAのカスタマイズビューとして表示する例を載せます。
〇カスタマイズビューのHTML
<table border="1">
<thead>
<tr>
<th>対象</th>
<th>カテゴリ1平均</th>
<th>カテゴリ1ランク</th>
<th>カテゴリ2平均</th>
<th>カテゴリ2ランク</th>
</tr>
</thead>
<tbody id="my-tbody">
</tbody>
</table>
<script type="text/html" id="lodash_template">
<tr>
<td><%= target %></td>
<td><%= ave1 %></td>
<td><%= rank1 %></td>
<td><%= ave2 %></td>
<td><%= rank2 %></td>
</tr>
</script>
〇JavaScriptカスタマイズ
https://js.cybozu.com/lodash/4.17.11/lodash.min.js
と下記sample.jsを読み込みます。
フィールドコードは、「対象」と「_1_1」~「2_10」と想定して記述しています。(数字の前に「」をつけています。)
(function() {
"use strict";
kintone.events.on([
'app.record.index.show',
], function(event){
document.getElementById('my-tbody').innerHTML = _.reduce(event.records, function(html, record){
var ave1 = Array.apply(null, {length: 10}).reduce(function(sum, noUse, index){
return sum + Number(record['_1_'+(index+1)].value);
}, 0) / 10;
var rank1 =
ave1 > 50 ? 'S' :
ave1 > 40 ? 'A' :
ave1 > 30 ? 'B' :
ave1 > 20 ? 'C' :
ave1 > 10 ? 'D' : 'E';
var ave2 = Array.apply(null, {length: 10}).reduce(function(sum, noUse, index){
return sum + Number(record['_2_'+(index+1)].value);
}, 0) / 10;
var rank2 =
ave2 > 50 ? 'S' :
ave2 > 40 ? 'A' :
ave2 > 30 ? 'B' :
ave2 > 20 ? 'C' :
ave2 > 10 ? 'D' : 'E';
return html + _.template(document.getElementById("lodash_template").innerHTML)({
target: record.対象.value,
ave1: ave1,
rank1: rank1,
ave2: ave2,
rank2:rank2,
});
}, '');
});
})();