# フィールドの値が書き換わりません...（8/8解決）

**URL:** <https://community.cybozu.dev/t/topic/5160>\
**Category:** kintone 開発相談\
**Created:** [2021 年 8 月 6 日午前 10:11 UTC](https://community.cybozu.dev/t/topic/5160 "2021-08-06T10:11:25Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![Legacy\_Account373](https://avatars.discourse-cdn.com/v4/letter/l/65b543/32.png) [@Legacy\_Account373](https://community.cybozu.dev/u/Legacy_Account373)\
**Post date:** [2021 年 8 月 6 日午前 10:11 UTC](https://community.cybozu.dev/t/topic/5160/1 "2021-08-06T10:11:25Z")

</div>

閲覧ありがとうございます。

別アプリからKintoneRecordManagerで取得したレコードを用いて、  
数値を計算、自アプリのフィールドを変更するといった処理を作成したく、以下のコードを記載したのですが、フィールド値が更新されません…  
・太字の箇所が処理されない。  
・Consoleにはエラーなし、各引数は希望の値を取得できている状況

当方JavaSciprt初心者のため、  
コードの記載に問題があるのか、フィールドの記載方法に問題があるのか、ご教示いただきたく存じます。  
※またコードの記述方法でアドバイス等があれば、合わせていただきたいです。

以上、よろしくお願いします。

```
//////////以下コード//////////
let cA=0;

let cW=0;

let cS=0;

let cADone=0;

let cWDone=0;

let cSDone=0;

(function() {

  'use strict';

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

    let events=event;

    

    //KintoneRecordManager(レコード取得クラス)のインスタンス化

    let manager = new KintoneRecordManager();

    manager.getRecords(function(records) {

        totalTask(records);

        event = getAchievement(events,records);

    });

    

    return event;

  });

})();

function totalTask(records){

  

  //レコードの集計

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

        let record = records[i];

        switch (record.区分.value) {

          case "A":

            cA += 1;

            if (record.完了.value == "完了") {

              cADone += 1;

            }

            break;

          case "W":

            cW += 1;

            if (record.完了.value == "完了") {

              cWDone += 1;

            }

            break;

          case "S":

            cS += 1;

            if (record.完了.value == "完了") {

              cSDone += 1;

            }

            break;

        }

  }

  console.log("cADone" +cADone);

  console.log("cA" +cA);

}

function getAchievement(event,records){

  //取得した値から達成度を計算

    let aLevel=cADone/cA;

    let wLevel=cWDone/cW;

    let sLevel=cSDone/cS;

    

    console.log("cADone"+cADone);

    console.log("cDone"+cDone);

    console.log("cSDone"+cSDone);

    

    console.log("c"+cA);

    console.log("cW"+cW);

    console.log("cS"+cS);

    

    console.log("aLevel"+aLevel);

    console.log("wLevel"+wLevel);

    console.log("sLevel"+sLevel);

    

    //値の格納

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

      let record=event.records[i];

      

      switch(record.項目.value){

        case "A":

          console.log("switch-A");

    **&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;record.達成度.value&nbsp;=&nbsp;aLevel;**

        break;

        

        case "W":

          console.log("switch-W");

**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;record.達成度.value=wLevel;**

        break;

        

        case "S":

          console.log("switch-S");

**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;record.達成度.value=sLevel;**

        break;

        

        default:

        break;

      }

    }

    return event;

}

/**

 * kintoneと通信を行うクラス

 */

var KintoneRecordManager = (function() {

    KintoneRecordManager.prototype.records = []; // 取得したレコード

    KintoneRecordManager.prototype.appId = null; // アプリID

    KintoneRecordManager.prototype.query = ''; // 検索クエリ

    KintoneRecordManager.prototype.limit = 100; // 一回あたりの最大取得件数

    KintoneRecordManager.prototype.offset = 0; // オフセット

    function KintoneRecordManager() {

        this.appId = "9";

        this.records = [];

    }

    // すべてのレコード取得する

    KintoneRecordManager.prototype.getRecords = function(callback) {

        kintone.api(

            kintone.api.url('/k/v1/records', true),

            'GET',

            {

                app: this.appId,

                query: this.query + (' limit ' + this.limit + ' offset ' + this.offset)

            },

            (function(_this) {

                return function(res) {

                    var len;

                    Array.prototype.push.apply(_this.records, res.records);

                    len = res.records.length;

                    _this.offset += len;

                    if (len < _this.limit) { // まだレコードがあるか？

                        _this.ready = true;

                        if (callback !== null) {

                            callback(_this.records); // レコード取得後のcallback

                        }

                    } else {

                        _this.getRecords(callback); // 自分自身をコール

                    }

                };

            })(this)

        );

    };

    return KintoneRecordManager;

})();

```

---

<div class="post-metadata">

**Author:** ![Legacy\_Account1018](https://avatars.discourse-cdn.com/v4/letter/l/e56c9b/32.png) [@Legacy\_Account1018](https://community.cybozu.dev/u/Legacy_Account1018)\
**Post date:** [2021 年 8 月 6 日午前 10:40 UTC](https://community.cybozu.dev/t/topic/5160/2 "2021-08-06T10:40:45Z")

</div>

kintone.apiは非同期なので、レコード取得を待ってあげたら上手くいくのではないでしょうか。  
実装方法詳細はこちらの記事をご覧ください↓  
[https://developer.cybozu.io/hc/ja/articles/360023047852-kintone%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8BPromise%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9%E3%81%AE%E5%9F%BA%E6%9C%AC](https://developer.cybozu.io/hc/ja/articles/360023047852-kintone%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8BPromise%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9%E3%81%AE%E5%9F%BA%E6%9C%AC)

---

<div class="post-metadata">

**Author:** ![Legacy\_Account373](https://avatars.discourse-cdn.com/v4/letter/l/65b543/32.png) [@Legacy\_Account373](https://community.cybozu.dev/u/Legacy_Account373)\
**Post date:** [2021 年 8 月 6 日午後 1:12 UTC](https://community.cybozu.dev/t/topic/5160/3 "2021-08-06T13:12:42Z")

</div>

度々申し訳ございません。

Promiseチェーンを使用し、コードを修正しました。  
ただし、結果は変わらずフィールドの値は格納できません…  
return前に、console.logでevent を出力すると、達成度.valueには正しい値が格納されているeventオブジェクトが出力されます。

returnの記述方法がおかしいのでしょうか？  
お手数をおかけしますが、アドバイスいただけますと幸いです。

&nbsp;

```
let cA = 0;

let cW = 0;

let cS = 0;

let cADone = 0;

let cWDone = 0;

let cSDone = 0;

(function () {

  "use strict";

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

    var params = {

      app: 9,

      filterCond: "",

      sortConds: "",

      // fields:"",

    };

    getRecords(params).then(function (resp) {

        console.log(resp);

        totalTask(resp.records);

        return getRecords(params);

      })

      .then(function (resp) {

        getAchievement(event, resp.records);

        return getRecords(params);

      });

    return event;

  });

})();

function totalTask(records) {

  //レコードの集計

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

    let record = records[i];

    switch (record.区分.value) {

      case "A":

        cA += 1;

        if (record.完了.value == "完了") {

          cADone += 1;

        }

        break;

      case "W":

        cW += 1;

        if (record.完了.value == "完了") {

          cWDone += 1;

        }

        break;

      case "S":

        cS += 1;

        if (record.完了.value == "完了") {

          cSDone += 1;

        }

        break;

    }

  }

  console.log("cADone" + cADone);

  console.log("cA" + cA);

}

function getAchievement(event, records) {

  //取得した値から達成度を計算

  let arlLevel = cADone / cA;

  let wcdLevel = cWDone / cW;

  let selcLevel = cSDone / cS;

  console.log("cADone" + cADone);

  console.log("cWDone" + cWDone);

  console.log("cSDone" + cSDone);

  console.log("cA" + cA);

  console.log("cW" + cW);

  console.log("cS" + cS);

  console.log("artLevel" + arlLevel);

  console.log("wcdLevel" + wcdLevel);

  console.log("selcLevel" + selcLevel);

  //値の格納

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

    let record = event.records[i];

    switch (record.項目.value) {

      case "A":

        console.log("switch-A");

        record["達成度"].value = arlLevel;

        record["達成度"].value = "a";

        break;

      case "W":

        console.log("switch-W");

        record.達成度.value = wcdLevel;

        break;

      case "S":

        console.log("switch-S");

        record.達成度.value = selcLevel;

        break;

      default:

        break;

    }

  }

  return event;

}

/*

 * get all records function by using offset sample program

 * Copyright (c) 2019 Cybozu

 *

 * Licensed under the MIT License

 */

/*

 * @param {Object} _params

 * - app {String}: アプリID（省略時は表示中アプリ）

 * - filterCond {String}: 絞り込み条件

 * - sortConds {Array}: ソート条件の配列

 * - fields {Array}: 取得対象フィールドの配列

 * - limit {Number}: レコードの取得件数（省略時は絞り込み条件に合うレコードを全件取得する）

 * @return {Object} response

 * - records {Array}: 取得レコードの配列

 */

var getRecords = function (_params) {

  var MAX_READ_LIMIT = 500;

  var params = _params || {};

  var app = params.app || kintone.app.getId();

  var filterCond = params.filterCond;

  var sortConds = params.sortConds;

  var limit = params.limit || -1;

  var offset = params.offset || 0;

  var fields = params.fields;

  var data = params.data;

  if (!data) {

    data = {

      records: [],

    };

  }

  var willBeDone = false;

  var thisLimit = MAX_READ_LIMIT;

  // getRecords 関数の呼び出し側で、レコードの取得件数を指定された場合は

  // 取得件数を満たせば終了するように willBeDone を true にする

  if (limit > 0) {

    if (thisLimit > limit) {

      thisLimit = limit;

      willBeDone = true;

    }

  }

  var conditions = [];

  if (filterCond) {

    conditions.push(filterCond);

  }

  var sortCondsAndLimit =

    (sortConds && sortConds.length > 0

      ? " order by " + sortConds.join(", ")

      : "") +

    " limit " +

    thisLimit;

  var query =

    conditions.join(" and ") + sortCondsAndLimit + " offset " + offset;

  var body = {

    app: app,

    query: query,

  };

  if (fields && fields.length > 0) {

    body.fields = fields;

  }

  return kintone

    .api(kintone.api.url("/k/v1/records", true), "GET", body)

    .then(function (resp) {

      data.records = data.records.concat(resp.records);

      var _offset = resp.records.length;

      if (limit > 0 && limit < _offset) {

        willBeDone = true;

      }

      // 取得すべきレコードを取得したら終了する

      if (_offset < thisLimit || willBeDone) {

        return data;

      }

      // 取得すべきレコードが残っている場合は、再帰呼び出しで残りのレコードを取得する

      return getRecords({

        app: app,

        filterCond: filterCond,

        sortConds: sortConds,

        limit: limit - _offset,

        offset: offset + _offset,

        fields: fields,

        data: data,

      });

    });

};

```

---

<div class="post-metadata">

**Author:** ![Legacy\_Account1177](https://avatars.discourse-cdn.com/v4/letter/l/77aa72/32.png) [@Legacy\_Account1177](https://community.cybozu.dev/u/Legacy_Account1177)\
**Post date:** [2021 年 8 月 7 日午前 5:40 UTC](https://community.cybozu.dev/t/topic/5160/4 "2021-08-07T05:40:39Z")

</div>

index.showイベントでレコードの値を書き換えるにはREST APIによる更新（PUT）が必要です。

[https://developer.cybozu.io/hc/ja/articles/201941784](https://developer.cybozu.io/hc/ja/articles/201941784)

---

<div class="post-metadata">

**Author:** ![Legacy\_Account373](https://avatars.discourse-cdn.com/v4/letter/l/65b543/32.png) [@Legacy\_Account373](https://community.cybozu.dev/u/Legacy_Account373)\
**Post date:** [2021 年 8 月 7 日午後 11:51 UTC](https://community.cybozu.dev/t/topic/5160/5 "2021-08-07T23:51:57Z")

</div>

[mls-hashimoto](https://community.cybozu.dev/hc/ja/profiles/385013133091-mls-hashimoto)&nbsp;様  
お世話になっております。ご連絡ありがとうございます。

REST API（PUT）の処理＆プロミスチェーンで非同期処理をつなげたところ、無事に処理の実装が完了いたしました。  
ありがとうございました！

まだJSを学習して2か月の新参者のため、  
わからない点が多く、ご迷惑をおかけしておりますが、  
一人前のプログラマーになれるよう、努力してまいります。

今後もわからない点があれば、こちらのコミュニテイーで質問させていただきますので、引き続きよろしくお願いします。  
（たねまき様もありがとうございました。）
