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

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

別アプリから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;

})();

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

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

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

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

 

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,

      });

    });

};

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

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

mls-hashimoto 様
お世話になっております。ご連絡ありがとうございます。

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

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

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