関連レコード一覧の複数の集計値フィールドを一括更新したい

初めて相談いたします。

下のような集計アプリがあります。

ここでは「データ」「データ2」のアプリから関連レコードで集計したい数字を表示しています。

「データ」からは"数値"と"金額"、「データ2」からは"数値"の合計値を表示すべく、jsカスタマイズしたフィールドを作成しました(“数値合計”・“金額合計”)。

ただ、関連元の「データ」「データ2」のアプリの数字を変えた場合、自動的には集計アプリに反映されず、1レコードずつ編集と保存を繰り返さなければなりません。

そこで、下図のさらに下のjsを作成し、一覧画面からボタンによって、関連レコード「データ」の"数値合計"のみは一括更新できるようになりました。しかしながら、いろいろ試しましたが、どうやっても"金額合計"や「データ2」の集計を同時に更新することができません。(ここで挫折を繰り返しております)

質問は2件です

■質問1
ひとつの関連レコードから吐き出した2種類の数値合計を一度のボタン操作で更新する方法(この場合「データ」の"数値合計"と"金額合計")

■質問2
二つの関連レコードから吐き出したそれぞれの数値合計を一度のボタン操作で更新する方法(「データ」「データ2」の合計フィールド)

質問を二つに分ける意味はないかなとも思いましたが、後学のため2件に分けてお聞きしました。

どうぞよろしくお願いいたします。


(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: 'limit ' + limit +' offset ' + tmpRecords.length
    }).then(function(response){
      tmpRecords = tmpRecords.concat(response.records);
      return response.records.length === limit ? getRecords(app, tmpRecords) : tmpRecords;
    });
  }
  var putRecords = function(app, records){
    var limit = 100;
    return Promise.all(
      records.reduce(function(recordsBlocks, record){
        if(recordsBlocks[recordsBlocks.length - 1].length === limit){
          recordsBlocks.push([record]);
        }else{
          recordsBlocks[recordsBlocks.length - 1].push(record);
        }
        return recordsBlocks;
      }, [[]]).map(function(recordsBlock){
        return kintone.api(kintone.api.url('/k/v1/records', true), 'PUT', {
          app: app,
          records: recordsBlock
        });
      })
    );
  }
  kintone.events.on('app.record.index.show', function(event){
    if(document.getElementById('updateButton') !== null) return;
    var button = document.createElement('button');
    button.innerHTML = '一括更新';
    button.id = 'updateButton';
    kintone.app.getHeaderMenuSpaceElement().appendChild(button);
    button.addEventListener('click', function(){
      Promise.all([
        getRecords(kintone.app.getId()),
        RelatedRecordsFieldManager.prototype.getFieldProperties()
      ]).then(function(responses){
        return Promise.all(responses[0].map(function(selfRecord){
          return (new RelatedRecordsFieldManager('データ')).getRecords(selfRecord).then(function(relatedRecords){
            return {
              id: selfRecord.レコード番号.value,
              record: {
                数値合計: {
                  value: relatedRecords.reduce(function(sum, relatedRecord){
                    return sum + Number(relatedRecord.数値.value);
                  }, 0)
                }
              }
            };
          });
        }));
      }).then(function(records){
        putRecords(kintone.app.getId(), records).then(function(){
          alert('更新しました。');
          location.reload();
        });
      });
    });
    return event;
  });
})();

初めまして。

RelatedRecordsFieldManager は別のJSで定義されているのでしょうか。
あまり細かくコードを読んでいないのでざっくりとだけ回答します。

■質問1
REST APIでレコード更新するときのオブジェクトに、今は数値合計しか入っていないようです。
このレコードオブジェクトに金額合計(金額)を追加したらできないでしょうか。

              record: {
                数値合計: {
                 value: relatedRecords.reduce(function(sum, relatedRecord){
                   returnsum +Number(relatedRecord.数値.value);
                  },0)
                }
              }

■質問2

関連レコードのデータを取得する処理を2回行い、取得したデータをまとめてPUTするという流れになりそうですね。
今は

  1. 関連レコード(データ)の値を取得
  2. レコードを更新

という流れになっているので、

  1. 関連レコード(データ)の値を取得
  2. 関連レコード(データ2)の値を取得
  3. レコードを更新

というように、間の処理を付け加えて、かつレコードオブジェクトにデータ2の合計値を含めればできると思います。

たまごさま。ありがとうございます。

全体の流れはわかるのですが、なかなかうまくいきません。

質問①に関して、下のようにしたところ、金額は合計してくれるのですが、数値は合計してくれません。
もう少し勉強とトライ&エラーをやってみます。

 

(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: ‘limit ’ + limit +’ offset ’ + tmpRecords.length

    }).then(function(response){

      tmpRecords = tmpRecords.concat(response.records);

      return response.records.length === limit ? getRecords(app, tmpRecords) : tmpRecords;

    });

  }

  var putRecords = function(app, records){

    var limit = 100;

    return Promise.all(

      records.reduce(function(recordsBlocks, record){

        if(recordsBlocks[recordsBlocks.length - 1].length === limit){

          recordsBlocks.push([record]);

        }else{

          recordsBlocks[recordsBlocks.length - 1].push(record);

        }

        return recordsBlocks;

      }, [[]]).map(function(recordsBlock){

        return kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘PUT’, {

          app: app,

          records: recordsBlock

        });

      })

    );

  }

  kintone.events.on(‘app.record.index.show’, function(event){

    if(document.getElementById(‘updateButton’) !== null) return;

    var button = document.createElement(‘button’);

    button.innerHTML = ‘一括更新’;

    button.id = ‘updateButton’;

    kintone.app.getHeaderMenuSpaceElement().appendChild(button);

    button.addEventListener(‘click’, function(){

      Promise.all([

        getRecords(kintone.app.getId()),

        RelatedRecordsFieldManager.prototype.getFieldProperties()

      ]).then(function(responses){

        return Promise.all(responses[0].map(function(selfRecord){

          return (new RelatedRecordsFieldManager(‘データ’)).getRecords(selfRecord).then(function(relatedRecords){

            return {

              id: selfRecord.レコード番号.value,

              record: {

                数値合計: {

                  value: relatedRecords.reduce(function(sum, relatedRecord){

                    return sum + Number(relatedRecord.数値.value);

                  }, 0)

                }

              }

,

              record: {

                金額合計: {

                  value: relatedRecords.reduce(function(sum, relatedRecord){

                    return sum + Number(relatedRecord.金額.value);

                  }, 0)

                }

              }

            };

          });

        }));

      }).then(function(records){

        putRecords(kintone.app.getId(), records).then(function(){

          alert(‘更新しました。’);

          location.reload();

        });

      });

    });

    return event;

  });

})();

お世話になっております。
下図のように、関連レコード一覧「データ」から、数値・金額・日数を集計し、「データ2」から数値を集計することとしました。

また、たまご様の助言を参考に、下の通りコードを書き換えたところ、無事すべてを一括で更新できるようになりました。
しかしながら、レコードが多くなると途中で止まってしまいます。
PUT上限100件に引っかかっているのでしょうか。

(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: 'limit ' + limit +' offset ' + tmpRecords.length
    }).then(function(response){
      tmpRecords = tmpRecords.concat(response.records);
      return response.records.length === limit ? getRecords(app, tmpRecords) : tmpRecords;
    });
  }
  var putRecords = function(app, records){
    var limit = 100;
    return Promise.all(
      records.reduce(function(recordsBlocks, record){
        if(recordsBlocks[recordsBlocks.length - 1].length === limit){
          recordsBlocks.push([record]);
        }else{
          recordsBlocks[recordsBlocks.length - 1].push(record);
        }
        return recordsBlocks;
      }, [[]]).map(function(recordsBlock){
        return kintone.api(kintone.api.url('/k/v1/records', true), 'PUT', {
          app: app,
          records: recordsBlock
        });
      })
    );
  }
  kintone.events.on('app.record.index.show', function(event){
    if(document.getElementById('updateButton') !== null) return;
    var rccbutton = document.createElement('button');
    rccbutton.innerHTML = '計算値更新';
    rccbutton.id = 'updateButton';
    kintone.app.getHeaderMenuSpaceElement().appendChild(rccbutton);
    rccbutton.addEventListener('click', function(){
      Promise.all([
        getRecords(kintone.app.getId()),
        RelatedRecordsFieldManager.prototype.getFieldProperties()
      ]).then(function(responses){
        return Promise.all(responses[0].map(function(selfRecord){
          return (new RelatedRecordsFieldManager('データ')).getRecords(selfRecord).then(function(relatedRecords){
            return {
              id: selfRecord.レコード番号.value,
              record: {
                数値合計: {
                  value: relatedRecords.reduce(function(sum, relatedRecord){
                    return sum + Number(relatedRecord.数値.value);
                  }, 0)
                }
              }
            };
          });
        }));
      }).then(function(records){
        putRecords(kintone.app.getId(), records).then(function(){
          alert('更新しました。');
          location.reload();
        });
      });
    });
    rccbutton.addEventListener('click', function(){
      Promise.all([
        getRecords(kintone.app.getId()),
        RelatedRecordsFieldManager.prototype.getFieldProperties()
      ]).then(function(responses){
        return Promise.all(responses[0].map(function(selfRecord){
          return (new RelatedRecordsFieldManager('データ')).getRecords(selfRecord).then(function(relatedRecords){
            return {
              id: selfRecord.レコード番号.value,
              record: {
                金額合計: {
                  value: relatedRecords.reduce(function(sum, relatedRecord){
                    return sum + Number(relatedRecord.金額.value);
                  }, 0)
                }
              }
            };
          });
        }));
      }).then(function(records){
        putRecords(kintone.app.getId(), records).then(function(){
///          alert('更新しました。');
          location.reload();
        });
      });
    });   
    rccbutton.addEventListener('click', function(){
      Promise.all([
        getRecords(kintone.app.getId()),
        RelatedRecordsFieldManager.prototype.getFieldProperties()
      ]).then(function(responses){
        return Promise.all(responses[0].map(function(selfRecord){
          return (new RelatedRecordsFieldManager('データ')).getRecords(selfRecord).then(function(relatedRecords){
            return {
              id: selfRecord.レコード番号.value,
              record: {
                日数合計: {
                  value: relatedRecords.reduce(function(sum, relatedRecord){
                    return sum + Number(relatedRecord.日数.value);
                  }, 0)
                }
              }
            };
          });
        }));
      }).then(function(records){
        putRecords(kintone.app.getId(), records).then(function(){
///          alert('更新しました。');
          location.reload();
        });
      });
    });     
    rccbutton.addEventListener('click', function(){
      Promise.all([
        getRecords(kintone.app.getId()),
        RelatedRecordsFieldManager.prototype.getFieldProperties()
      ]).then(function(responses){
        return Promise.all(responses[0].map(function(selfRecord){
          return (new RelatedRecordsFieldManager('データ2')).getRecords(selfRecord).then(function(relatedRecords){
            return {
              id: selfRecord.レコード番号.value,
              record: {
                数値合計2: {
                  value: relatedRecords.reduce(function(sum, relatedRecord){
                    return sum + Number(relatedRecord.数値.value);
                  }, 0)
                }
              }
            };
          });
        }));
      }).then(function(records){
        putRecords(kintone.app.getId(), records).then(function(){
///          alert('更新しました。');
          location.reload();
        });
      });
    });    
       return event;
  });
})();