アプリAボタン押下で、アプリCのデータをGET集計し、アプリBへPUTしたい。

背景・実現したいこと

 タイトルの通りで、アプリCのGETのところで、工番は取得できましたが、金額は"undefined"です。おそらくreduceなどが使えそうなのかと思いましたが、注文番号をまとめてからの原価別に計算するまでの方法が分からず進めずにいます。

GETの部分の①for~if、②for~ifの②に"debugger;"を付けましたが、たどりついていないようです。そもそもこの方法でPUTまで辿り着けるのかも分かっていないかもしれません…。

PUT用の「 if (Number(event.record.材料費.value) === Number(amount)) { 」以下は

まだ未確認です。

プログラム初心者でもあり、拙い文章だとは思いますが、お知恵を拝借させていただけると幸いです。

 

利用したソースコード

(function() {
    'use strict';
    var getRecords = function(app, tmpRecords) {
        var limit = 500;
        var tmpRecords = tmpRecords || [];
        return kintone.api(kintone.api.url('/k/v1/records', true), 'GET', {
          app: app,
          query: kintone.app.getQueryCondition() +'limit ' + limit +' offset ' + tmpRecords.length
        }).then(function(response){
          tmpRecords = tmpRecords.concat(response.records);
          return response.records.length === limit ? getRecords(app, tmpRecords) : tmpRecords;
        });
      }

      //レコード詳細画面表示後、レコード編集画面表示後、レコード印刷画面表示後
      var events = [
        'app.record.detail.show',
        'app.record.edit.show',
        'app.record.print.show'
    ];
          
    kintone.events.on(events, function(event) {
        // メニュ右側の空白部分にボタンを設置
        var myIndexButton = document.createElement('button');
        myIndexButton.id = 'my_index_button';
        myIndexButton.innerText = '原価更新';
        myIndexButton.onclick = function() {
            window.alert('更新しますか?');
        
    
          var appId = 71; //アプリC
          var query = '注文番号 >= 210001 and 注文番号 <= 210999 order by 注文番号 asc';
          var outputFields = ['注文番号','原価番号','合計'];
            var appUrl = kintone.api.url('/k/v1/records');

            var params = {
            'app': appId,
            'query': query,
            'fields': outputFields
        };
        
        
        kintone.api(appUrl, 'GET', params, function(resp) {
            var subTotals = {};
            for (var i = 0; i < resp.records.length; i++) {
              var constNumber = resp.records[i]['注文番号'].value;
                if (!subTotals[constNumber]) {
                    subTotals[constNumber] = 0;
                }

                for (var j = 0; j < resp.records[i].length; j++) {
                    debugger;
                  var category = resp.records[i][j]['原価番号'].value;                  
                    if (!subTotals[category]) {
                        subTotals[category] = 0;
                    }
                    subTotals[category] += parseFloat(resp.records[i][j]['合計'].value);
                }
            }

            for (var category in subTotals) {
                console.log(category + ': ' + subTotals[category][j] + '円');
            }
               
            //材料費計算結果と、数値フィールド材料費の値が同じだったら更新しない
          if (Number(event.record.原価1.value) === Number(amount)) {
                return event;
            }

            //更新用リクエストパラメータ
            var body = {
                app: kintone.app.getId(),
                id: kintone.app.record.getId(),
                record: {
                  原価1: {
                    value: amount,
                    },
                },
            };

            //レコード更新(数値フィールドの更新)
            kintone.api(
                kintone.api.url("/k/v1/record", true),"PUT",body,(resp) => {
                }
            );

            return event;
        }, function(error) {
        // error
        console.log(error);
        });
        }
        kintone.app.record.getHeaderMenuSpaceElement().appendChild(myIndexButton);

    });
    
})();

こんにちは。

プログラマーではないので、コードの修正箇所は分かりませんが気が付いた点だけ。

アプリCのGETのところで、工番は取得できましたが、金額は"undefined"です。

工番(注文番号?)が取得できて金額が取得できないとのことなので、

var constNumber = resp.records[i][‘注文番号’].value;
・・・
var category = resp.records[i][j][‘原価番号’].value; 
・・・
resp.records[i][j][‘合計’].value

上記のあたりが気になるところです。
https://developer.cybozu.io/hc/ja/articles/202331474#step2

        kintone.api(appUrl, ‘GET’, params, function(resp) {
            var subTotals = {};
            for (var i = 0; i < resp.records.length; i++) {
                var constNumber = resp.records[i][‘注文番号’].value;

最初のforの後で、resp.recordsの中身をデバッグしてはどうでしょうか。

後、ご存知かと思いますが kintone.api()は非同期で実行されるため、今回のケースでは
アプリC→アプリBの流れにはPromiseを使って同期処理をする必要がありそうです。

https://developer.cybozu.io/hc/ja/articles/360023047852

また、集計に関する記事や投稿はいくつかあります。
https://developer.cybozu.io/hc/ja/articles/202640870-%E4%BA%88%E7%AE%97%E3%82%A2%E3%83%97%E3%83%AA%E3%81%A8%E5%AE%9F%E7%B8%BE%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E9%9B%86%E8%A8%88%E8%A1%A8%E3%82%92%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA%E3%83%93%E3%83%A5%E3%83%BC%E3%81%AB%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B

https://developer.cybozu.io/hc/ja/community/posts/360057795931-%E4%BB%96%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E9%9B%86%E8%A8%88%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6

他にもあるかもしれません。

おそらくreduceなどが使えそうなのか

使ったことがないですが、reduceは下記が参考になるでしょうか。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce

5MP2様

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

アドバイスを参考にトライしてみます。

丁寧なご回答ありがとうございました。