# アプリAの商品データを商品ごとに集計しアプリBのレコードにセットし販売状況を確認したい。

**URL:** <https://community.cybozu.dev/t/topic/2350>\
**Category:** kintone 開発相談\
**Created:** [2016 年 1 月 5 日午後 12:47 UTC](https://community.cybozu.dev/t/topic/2350 "2016-01-05T12:47:26Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![Legacy\_Account103](https://avatars.discourse-cdn.com/v4/letter/l/9dc877/32.png) [@Legacy\_Account103](https://community.cybozu.dev/u/Legacy_Account103)\
**Post date:** [2016 年 1 月 5 日午後 12:47 UTC](https://community.cybozu.dev/t/topic/2350/1 "2016-01-05T12:47:26Z")

</div>

はじめまして。

現在ECサイトの注文履歴アプリAと販売実績管理アプリBを作って、  
販売状況を日々わかるようにしたいと思っております。

現在アプリAには注文ごとにレコードを追加し、  
その中にグループがありそこに各商品の販売個数をセットしています。

グループ1  
商品A・・・1  
商品B・・・0  
商品C・・・2

アプリBにおいては、月ごとにレコードを追加し、  
月間の商品別販売目標数値をセットしております。  
アプリAの商品A、商品B、商品Cの1ヶ月間の販売数量を  
商品A販売数、商品B販売数、商品C販売数のフィールドにセットし、  
日々の販売状況を確認したいと思っています。

日付・・・更新日

商品A目標数・・・300  
商品B目標数・・・20  
商品C目標数・・・360

商品A販売数・・・アプリAの商品Aの1ヶ月間の販売数合計  
商品B販売数・・・アプリAの商品Bの1ヶ月間の販売数合計  
商品C販売数・・・アプリAの商品Cの1ヶ月間の販売数合計

商品A達成率・・・自動計算  
商品B達成率・・・自動計算  
商品C達成率・・・自動計算

商品A目標残・・・自動計算  
商品B目標残・・・自動計算  
商品C目標残・・・自動計算

&nbsp;

プログラム初心者なもので、  
アプリBのレコード更新でデータを取得したかったのですが、  
アプリAのデータを取得して集計し、  
アプリBにセットするやり方が分からず困っております。  
初歩的な内容かもしれないのですが、  
サンプルプログラム等があればご教授いただければと思います。  
よろしくお願い申し上げます。

---

<div class="post-metadata">

**Author:** ![Legacy\_Account1574](https://avatars.discourse-cdn.com/v4/letter/l/76d3ee/32.png) [@Legacy\_Account1574](https://community.cybozu.dev/u/Legacy_Account1574)\
**Post date:** [2016 年 1 月 5 日午後 1:36 UTC](https://community.cybozu.dev/t/topic/2350/2 "2016-01-05T13:36:41Z")

</div>

okaさん

&nbsp;

先日のトピック（[1](https://community.cybozu.dev/hc/ja/community/posts/205000076)、[2](https://community.cybozu.dev/hc/ja/community/posts/205018616)）は近いかと思います。前者のトピックの担当者を商品に置き換えれば商品ごとにレコードは出来る形にはなりますが同等かと。やはり月ごとに1レコードとしたいとのことであれば、レコード取得APIで得られるres.recordsから商品ごとに数をカウントして、event.recordにそれぞれ入れることで実現できます。難しそうであれば、後者のトピックのような標準機能の表で集計やそのCSV出力を利用するのも良いかと思います。

---

<div class="post-metadata">

**Author:** ![Legacy\_Account103](https://avatars.discourse-cdn.com/v4/letter/l/9dc877/32.png) [@Legacy\_Account103](https://community.cybozu.dev/u/Legacy_Account103)\
**Post date:** [2016 年 1 月 6 日午前 6:54 UTC](https://community.cybozu.dev/t/topic/2350/3 "2016-01-06T06:54:17Z")

</div>

Ryu Yamashita様

&nbsp;

早速のコメントありがとうございます。感謝致します。

res.recordから商品ごとの数量カウントのやり方がまだよくわかっておりませんが、月ごとにレコードにしたいので、教えて頂いたトピックを参考に一度やってみます。

また分からない点が出てきましたらご相談させてください。

---

<div class="post-metadata">

**Author:** ![Legacy\_Account103](https://avatars.discourse-cdn.com/v4/letter/l/9dc877/32.png) [@Legacy\_Account103](https://community.cybozu.dev/u/Legacy_Account103)\
**Post date:** [2016 年 1 月 6 日午前 10:03 UTC](https://community.cybozu.dev/t/topic/2350/4 "2016-01-06T10:03:47Z")

</div>

いろいろなサンプルコードなどを見てデータの取得はできたのですが、アプリBへの合計数の代入ができないのですが、どこがおかしいのか教えて頂けますでしょうか？

```
(function() {
"use strict";

kintone.events.on(['app.record.edit.submit', 'app.record.create.submit'], function(event){

//アプリAのID
var TappId = **;

//アプリBの設定日付を取得
var record = event.record;
var start = record['日付'].value;
var end = record['日付_0'].value;

//アプリAの商品1の合計数を入れる変数
var item1 = 0;

function fetchRecords(appId, opt_offset, opt_limit, opt_records) {
var offset = opt_offset || 0;
var limit = opt_limit || 100;
var allRecords = opt_records || [];
var params = {app: appId, query: 'order by レコード番号 asc limit ' + limit + ' offset ' + offset};
return kintone.api('/k/v1/records', 'GET', params).then(function(resp) {
allRecords = allRecords.concat(resp.records);
if (resp.records.length === limit) {
return fetchRecords(appId, offset + limit, limit, allRecords);
}

return allRecords;
});
}

fetchRecords(TappId).then(function(records) {

for(var i = 0; i < records.length; i++){

if(records[i]['b_day']['value'] >= start && records[i]['b_day']['value'] <= end ){

item1 = item1 + parseInt(records[i]['数値']['value']);

}
}

//アプリBの商品1フィールドにアプリAの商品1の合計数をセット
record['数値_4']['value'] = item1;

});

return event;
});

})();

```

item1には正しい数量が取得できています。

---

<div class="post-metadata">

**Author:** ![Legacy\_Account103](https://avatars.discourse-cdn.com/v4/letter/l/9dc877/32.png) [@Legacy\_Account103](https://community.cybozu.dev/u/Legacy_Account103)\
**Post date:** [2016 年 1 月 6 日午前 11:50 UTC](https://community.cybozu.dev/t/topic/2350/5 "2016-01-06T11:50:45Z")

</div>

なんとか自己解決できました。

下記のコードで思っている動きができるようになりましたが、  
もっとこうした方がいいという書き方などがあれば是非教えて頂きたいと思います。

```
(function() {
"use strict";

//アプリAのID
var TappId = **;

function fetchRecords(appId, opt_offset, opt_limit, opt_records) {
var offset = opt_offset || 0;
var limit = opt_limit || 100;
var allRecords = opt_records || [];
var params = {app: appId, query: 'order by レコード番号 asc limit ' + limit + ' offset ' + offset};
return kintone.api('/k/v1/records', 'GET', params).then(function(resp) {
allRecords = allRecords.concat(resp.records);
if (resp.records.length === limit) {
return fetchRecords(appId, offset + limit, limit, allRecords);
}

return allRecords;
});

}

fetchRecords(TappId).then(function(records) {

kintone.events.on(['app.record.edit.submit', 'app.record.create.submit'], function(event){

//アプリBの設定日付を取得
var record = event.record;
var start = record['日付'].value;
var end = record['日付_0'].value;

//アプリAの商品1の合計数を入れる変数
var item1 = 0;

for(var i = 0; i < records.length; i++){

if(records[i]['b_day']['value'] >= start && records[i]['b_day']['value'] <= end ){

//アプリAの商品1の合計数を取得
item1 = item1 + parseInt(records[i]['数値']['value']);

}
}

//アプリBの商品1フィールドにアプリAの商品1の合計数をセット
record['数値_4']['value'] = item1;

return event;

});

});

})();

```

&nbsp;

---

<div class="post-metadata">

**Author:** ![Legacy\_Account1574](https://avatars.discourse-cdn.com/v4/letter/l/76d3ee/32.png) [@Legacy\_Account1574](https://community.cybozu.dev/u/Legacy_Account1574)\
**Post date:** [2016 年 1 月 6 日午後 1:12 UTC](https://community.cybozu.dev/t/topic/2350/6 "2016-01-06T13:12:07Z")

</div>

submitイベントにおけるPromise対応（[関連Tips](https://community.cybozu.dev/hc/ja/articles/204564604)）の書き方としては、

```
kintone.events.on(['app.record.edit.submit', 'app.record.create.submit'], function(event){

return fetchRecords().then(function(resp){
return event;
});
});

```

のように、submitイベントの中で&nbsp;fetchRecords（Promiseオブジェクト）をreturnし、.thenの中で、eventをreturnする形になります。こうすることで、fetchRecordsからのPromiseチェーンが終わって、最終的にeventをsubmitイベントに返すことができるようになります。fetchRecords()の定義は ‘use strict’; の後（もしくはkintone.events.on()の後）にでも置いておくといいと思います。

---

<div class="post-metadata">

**Author:** ![Legacy\_Account103](https://avatars.discourse-cdn.com/v4/letter/l/9dc877/32.png) [@Legacy\_Account103](https://community.cybozu.dev/u/Legacy_Account103)\
**Post date:** [2016 年 1 月 7 日午前 10:50 UTC](https://community.cybozu.dev/t/topic/2350/7 "2016-01-07T10:50:27Z")

</div>

Ryu Yamashita様

&nbsp;

ありがとうございます。

コードの方を修正させて頂きました。  
この度はご丁寧に教えて頂きありがとうございました。

&nbsp;

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/flex015/uploads/cybozu/original/1X/d5c841c3c5a6cb66eed514001c1b45147c9e1f4f.png) [@system](https://community.cybozu.dev/u/system)\
**Post date:** [2025 年 10 月 29 日午前 8:56 UTC](https://community.cybozu.dev/t/topic/2350/8 "2025-10-29T08:56:28Z")

</div>

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。
