他アプリの集計について

アプリ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,
      });
    }, '');
  });
})();