# 他アプリの集計について

**URL:** <https://community.cybozu.dev/t/topic/4914>\
**Category:** kintone 開発相談\
**Created:** [2020 年 2 月 26 日午前 8:06 UTC](https://community.cybozu.dev/t/topic/4914 "2020-02-26T08:06:11Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![Legacy\_Account1244](https://avatars.discourse-cdn.com/v4/letter/l/858c86/32.png) [@Legacy\_Account1244](https://community.cybozu.dev/u/Legacy_Account1244)\
**Post date:** [2020 年 2 月 26 日午前 8:06 UTC](https://community.cybozu.dev/t/topic/4914/1 "2020-02-26T08:06:11Z")

</div>

アプリAのフィールド

回答者、対象、カテゴリ1の設問10個（フィールドコードは1＿1～1＿10）、カテゴリ2の設問10個（フィールドコードは2＿1～2＿10）

設問はすべて1～6の数値が入ります。

&nbsp;

アプリBにてこのアプリの集計をしたいです。

アプリAの「対象」毎に、カテゴリ1の設問の平均値、カテゴリ2の設問の平均値を集計したいです。

1レコードで1つの対象を集計するイメージです。

&nbsp;

[関連レコードの項目を条件付きで集計](https://community.cybozu.dev/hc/ja/articles/203030394-%E9%96%A2%E9%80%A3%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E9%A0%85%E7%9B%AE%E3%82%92%E6%9D%A1%E4%BB%B6%E4%BB%98%E3%81%8D%E3%81%A7%E9%9B%86%E8%A8%88)を参考にしようと試みましたが、どのように当てはめればいいかわからず・・・

何もわからない状態ですが、少しでもご教授いただければ幸いです。

---

<div class="post-metadata">

**Author:** ![Legacy\_Account1740](https://avatars.discourse-cdn.com/v4/letter/l/ed8c4c/32.png) [@Legacy\_Account1740](https://community.cybozu.dev/u/Legacy_Account1740)\
**Post date:** [2020 年 2 月 26 日午後 12:18 UTC](https://community.cybozu.dev/t/topic/4914/2 "2020-02-26T12:18:48Z")

</div>

初心者様

お世話になっております。  
トヨクモの江田と申します。

アプリBは作成せずに、アプリAでkintone標準の集計機能を使うのはいかがでしょうか？  
[https://jp.cybozu.help/k/ja/user/app\_collectdata/summarize.html](https://jp.cybozu.help/k/ja/user/app_collectdata/summarize.html)

---

<div class="post-metadata">

**Author:** ![Legacy\_Account1244](https://avatars.discourse-cdn.com/v4/letter/l/858c86/32.png) [@Legacy\_Account1244](https://community.cybozu.dev/u/Legacy_Account1244)\
**Post date:** [2020 年 2 月 28 日午前 4:20 UTC](https://community.cybozu.dev/t/topic/4914/3 "2020-02-28T04:20:31Z")

</div>

江田様

ご回答ありがとうございます。

説明不足でした。対象者毎に平均値を出したのち、その値に応じてS,A,B,C,D,Eの6段階で区分けしたいため、このような形を取ろうとしております。

対象者毎に平均値をフィールドに入れ、IFを使いS~Eで区分けしようと考えています。

---

<div class="post-metadata">

**Author:** ![Legacy\_Account1740](https://avatars.discourse-cdn.com/v4/letter/l/ed8c4c/32.png) [@Legacy\_Account1740](https://community.cybozu.dev/u/Legacy_Account1740)\
**Post date:** [2020 年 3 月 10 日午前 7:55 UTC](https://community.cybozu.dev/t/topic/4914/4 "2020-03-10T07:55:56Z")

</div>

初心者様

お世話になっております。  
返信が遅くなり申し訳ございません。

標準の集計機能では実装困難ということですね。

私個人の意見としては、アプリAのデータのみを集計するのであれば、アプリBをつくらずに、アプリAのカスタマイズビュー等に集計結果ｗ表示する方が楽かと思います。  
集計結果をレコードとして保存する場合、アプリ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](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,
      });
    }, '');
  });
})();

```
