【kintone REST API で全レコード更新後の同期処理】

販売店アプリの一覧「はがき出力用」で印刷対象年月を入力した際に、販売店アプリの全レコードに対し、特定のフィールドを入力した値で更新するようにしているのですが、フィールド更新後に画面リロードという同期処理が実現できません。

既に async await を使用して大量に同期処理を定義しているため、うまくいっていないのかもしれないのですが、有識者の方でどなたか上記について実現方法を教えていただけないでしょうか。

(function($) {
    ‘use strict’;

    const appID = kintone.app.getId();
    const relateID = kintone.app.getRelatedRecordsTargetAppId(‘計量器データ’);

    //----------------------------------------------------------------
    //はがき作成一覧表示時の処理
    //----------------------------------------------------------------
    kintone.events.on
    (   ‘app.record.index.show’, event => {
            if(event.viewName == ‘はがき出力用’) {
                
                //ヘッダー作成
                createHeader();

                const elementYM = document.getElementById(‘inputMonth’);

                //対象年月入力
                elementYM.addEventListener(‘change’, () => {

                    //計量器有効期限_開始・終了の算定
                    const array = calcSelectYMD();

                    const BeginYMD = array[0];
                    const EndYMD = array[1];
                        
                    //全レコードの計量器有効期限_開始・終了,対象計量器数を更新
                    allUpdate(event, BeginYMD, EndYMD);

                }, false);

            }

        return event;
        }
    );

    //----------------------------------------------------------------
    //ヘッダーに印刷対象年月の入力フィールドを作成
    //----------------------------------------------------------------
    const createHeader = () => {

        const headElement = kintone.app.getHeaderMenuSpaceElement();
     
        headElement.innerHTML = ‘<label>印刷対象年月:<input type=“month” id=“inputMonth”></label>’;

    }

    //----------------------------------------------------------------
    // 全レコードの下記項目更新
    //  ・「計量器有効期限_開始」
    //  ・「計量器有効期限_終了」
    //  ・「対象計量器数」
    //----------------------------------------------------------------
    const allUpdate = async (event, value1, value2) => {

        let offset = 0;
        let limit = 500;

        //全レコード取得
        const allRecords = await getAllRecords(offset, limit);

        //100件毎にレコード分割
        const sliceAllRecords = await sliceByNumber(allRecords, 100);

        //更新用レコード作成
        const putBodyAarry = await createBody(sliceAllRecords, value1, value2);

        //レコード更新
        await putAnswer(putBodyAarry);

        return event;
    }

    //----------------------------------------------------------------
    //更新用レコード作成
    //----------------------------------------------------------------
    const createBody = async (sliceAllRecords, value1, value2) => {

        let putBodyAarry = [];

        await Promise.all(sliceAllRecords.map(async (sliceRecords) => {

            // 取得した値をもとに更新するためのbodyを用意
            const putBody = {
                “app”: appID,
                “records”: []
            };

            await Promise.all(sliceRecords.map(async (record) => {

                //関連レコード件数取得
                let value3 = await getRelateLen(record, value1, value2);

                const respBody = {
                    “id”: record.$id.value,
                    “record”: {
                            “計量器有効期限_開始”: {
                                “value”: value1,
                            },
                            “計量器有効期限_終了”: {
                                “value”: value2,
                            },
                            “対象計量器数”: {
                                “value”: value3,
                            }
                    }
                };
                
                putBody.records.push(respBody);
            }));

            putBodyAarry.push(putBody);

        }));

        return putBodyAarry;
    }

    //----------------------------------------------------------------
    //関連レコード件数取得用クエリ作成
    //----------------------------------------------------------------
    const getRelateLen = async (record, value1, value2) => {

        let registCode = record[‘登録コード’].value;
        let opt_field = ${['登録コード']}="${registCode}";
        let opt_field2 = ${['有効期間満了年月']}\>="${value1}";
        let opt_field3 = ${['有効期間満了年月']}\<="${value2}";
                    
        let offset = 0;
        let limit = 500;
    
        let relateLen = await getRelateRecords(offset, limit, opt_field, opt_field2, opt_field3, 0);

        return relateLen;
    }

    //----------------------------------------------------------------
    //関連レコード件数取得用の関数
    //----------------------------------------------------------------
    const getRelateRecords = async (offset, limit, opt_field, opt_field2, opt_field3, value) => {
        
        let params = {
            “app”: relateID, 
            “query”: ${opt_field} and (${opt_field2} and ${opt_field3}) order by 計量器ID asc limit ${limit} offset ${offset}
        };
        
        return kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘GET’, params).then((resp) => {

            let relateLen = resp.records.length + value;

            // 取得件数が最大値と同じ場合、再帰呼び出し
            if (resp.records.length === limit) {
                return getRelateRecords(offset + limit, limit, opt_field, opt_field2, opt_field3, offset + limit);
            }
            
            return relateLen;
        });
    }

    //----------------------------------------------------------------
    //レコード全件取得用の関数
    //----------------------------------------------------------------
    const getAllRecords = async (offset, limit, opt_records) => {
        
        let allRecords = opt_records || [];

        let params = {
            “app”: appID,
            “query”: order by レコード番号 asc limit ${limit} offset ${offset}
        }
        
        return kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘GET’, params).then((resp) => {

            allRecords = allRecords.concat(resp.records);

            // 取得件数が最大値と同じ場合、再帰呼び出し
            if (resp.records.length === limit) {
                return getAllRecords(offset + limit, limit, allRecords);
            }

            return allRecords;
        });
    }

    //----------------------------------------------------------------
    //計量器有効期限_開始・終了の算定
    //----------------------------------------------------------------
    const calcSelectYMD = () => {

        let inputYM = document.getElementById(‘inputMonth’).value;
        let inputYearNum = Number(inputYM.substr(0,4));
        let inputMonthNum = Number(inputYM.substr(5,2));

        //選択された年月の最終日を計算
        let lastDayNum = new Date(inputYearNum, inputMonthNum, 0).getDate();

        //計量器有効期限_開始・終了の値作成
        let selectBeginYMD = new Date(inputYearNum, inputMonthNum - 1, 1);
        let selectEndYMD = new Date(inputYearNum, inputMonthNum - 1, lastDayNum);

        const beginYear = (selectBeginYMD.getFullYear()).toString();
        const beginMonth = (selectBeginYMD.getMonth() + 1).toString();
        const beginDay = (selectBeginYMD.getDate()).toString();

        const endYear = (selectEndYMD.getFullYear()).toString();
        const endMonth = (selectEndYMD.getMonth() + 1).toString();
        const endDay = (selectEndYMD.getDate()).toString();

        const strBeginYMD = beginYear + ‘-’ + beginMonth + ‘-’ + beginDay;
        const strEndYMD = endYear + ‘-’ + endMonth + ‘-’ + endDay;

        return [strBeginYMD, strEndYMD];
    }

    //----------------------------------------------------------------
    // 引数で受け取った配列(array)を引数(number)の数で分割
    // ex…200個の配列を[[100個],[100個]]に分割
    //----------------------------------------------------------------
    const sliceByNumber = async (array, number) => {
        const length = Math.ceil(array.length / number);
        return new Array(length)
            .fill()
            .map((_, i) => array.slice(i * number, (i + 1) * number)
            );
    }

    //----------------------------------------------------------------
    // レコード更新
    // ※putBodyAarryは多重配列[[],[],[]]にすること
    //----------------------------------------------------------------
    const putAnswer = async (putBodyAarry) => {
        
        await Promise.all(putBodyAarry.map(async (putBody) => {

            return kintone.api
            (kintone.api.url(‘/k/v1/records’, true), ‘PUT’, putBody, (resp) => {
                //更新成功時
                console.log(resp);
            }, (error) => {
                //更新失敗時
                console.log(error);
            });
        }));

        //画面リロード
        await reload();
    }

    //----------------------------------------------------------------
    //画面リロード
    //----------------------------------------------------------------
    const reload = async () => {

        window.location.reload(true);
    }

})();

コードのボリュームが多くパット見これだ、というのはみれてませんが、
一度デバッグしてエラーが有るか見てみていいと思います。(例えば実行時のエラーが発生してそこまで到達できてない、など)

主に実行時エラーと、ネットワークのエラーがありますのでみてみてください。

アドバイスありがとうございます

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