保存実行後イベントにてテーブル内のデータを書き換える処理について

kintone初心者です。初歩的なことかもしれませんが、何卒よろしくお願いいたします。

 

■背景・実現したいこと

【対象画面】レコード追加画面保存ボタン保存実行後

アプリAにて作成したテーブル内のデータを一行づつアプリBへレコードを登録。

そして アプリBへ登録したレコードのアプリコード付きレコード番号を、

アプリAのテーブルにある該当のテーブルレコードのフィールドへ追加し登録する。

この太字にあたる部分がうまく反映されません。

 

エラー情報 (開発者ツールのコンソール)

 エラー表示なし。

 

利用したソースコード

kintone.events.on('app.record.create.submit',event => {
    writingNewRecods(event);
    return event;
});

async function writingNewRecods(event) {
    const record = event.record;
    const tableRecords = record.読込データテーブル.value;
    
    for(let i = 0; tableRecords.length > i; i++) {
        // 条件対象フィールド値
        const rsDate = record.入出荷日.value;
        const orderNumber = record.指示番号.value;
        const equipmentCode = tableRecords[i].value.確認用_機材コード.value;
        const shippingLabel = tableRecords[i].value.確認用_送り状番号.value;
        const equipmentName = tableRecords[i].value.確認用_機材名.value;

        //取得レコード条件式
        const query = `入出荷日 = "${rsDate}" and 指示番号 = "${orderNumber}" and 機材コード = "${equipmentCode}" and 送り状番号 = "${shippingLabel}"`;
        const body = {
            'app': barcodeReadingDataAppId,
            'query': query,
        }

        //追加レコードパラメ
        const postParams = {
            'app': barcodeReadingDataAppId,
            'record': {
                'シリアルコード': {'value': tableRecords[i].value.確認用_シリアルコード.value},
                'データ区分': {'value': record.データ区分.value},
                'メモ': {'value': tableRecords[i].value.確認用_メモ.value},
                '入出荷日':  {'value': record.入出荷日.value},
                '店舗コード_ルックアップ用': {'value': record.店舗コード_ルックアップ用.value},
                '指示番号': {'value': record.指示番号.value},
                '数量': {'value': tableRecords[i].value.確認用_数量.value},
                '検査フラグ_0': {'value': tableRecords[i].value.確認用_検査フラグ.value},
                '機材コード': {'value': tableRecords[i].value.確認用_機材コード.value},
              '状態': {'value': tableRecords[i].value.確認用_状態.value},
                '送り状番号': {'value': tableRecords[i].value.確認用_送り状番号.value}, 
            }
        }

        try {
            //「バーコード読込データ」アプリ内レコード重複チェック
            await kintone.api(kintone.api.url('/k/v1/records', true), 'GET', body, async resp => {
                alert('check');
                if(resp.records.length === 0) {
                        try {
                            //「バーコード読込データ」アプリへレコードを追加
                            await kintone.api(kintone.api.url('/k/v1/record', true), 'POST', postParams, async resp => {
                                alert(`【${equipmentName}】をバーコード読込データアプリにレコードを追加しました。`);
                            });
                            
                            //「バーコード読込データ」へ追加したレコードのアプリ付きレコード番号を取得
                            await kintone.api(kintone.api.url('/k/v1/records', true), 'GET', body, getResp => {
                                //該当するテーブル行内のFieldの値を書き換え
                                tableRecords[i].value.バーコード読込データのレコード番号.value = getResp.records[i].value;
                            });

                            return event;
                            
                        } catch (error) {
                            alert('error');
                            return event;
                        }
                } else {
                    alert(`【${equipmentName}】同内容のレコードが既に登録されているため、このレコードは登録されません。`);
                    event.error = '同内容のレコードが既にバーコード読込データアプリに登録されています';
                    return event;
                }
            });
            
        } catch (error) {
            
        }
    }
}

検証等しておりませんが、気になった部分として レコードの登録(POST) は成功時のレスポンスに登録したアプリのレコード番号が含まれているので、そちらを使えば良いかと思います。

                            //「バーコード読込データ」アプリへレコードを追加
                            await kintone.api(kintone.api.url('/k/v1/record', true), 'POST', postParams, async resp => {
                                alert(`【${equipmentName}】をバーコード読込データアプリにレコードを追加しました。`);
                                tableRecords[i].value['バーコード読込データのレコード番号'].value = 'アプリコード-' + resp.id;
                            });

また、forループ中にreturn eventがいくつかありますが、ループ1回目で処理が終わってしまうので、ループが終わってからreturn eventをする必要があります。

mls-hashimoto 様

お世話になっております。

この度はアドバイスをいただき本当にありがとうございます。

 

いただきましたアドバイスに基づき、for文の最後のみにreturn eventを入れ実行してみましたが、

思った結果にはならず、エラー情報もありませんでした。

 

アラートを使い、POSTのレスポンスから取得したレコード番号は正常に取得は出来ているようでしたので、

tableRecords[i].value[‘バーコード読込データのレコード番号’].value = ‘OK’;

といった文字列に変えてみても、テーブル内の「バーコード読込データのレコード番号」の値は空でした。

何度も申し訳ございませんが、打開策等ございましたら教えていただけますと幸いです。

山田麻未 さま

申し訳ありません。最初の部分を見落としておりました。

kintone.events.on('app.record.create.submit', async event => {

と、kintone.events.onの関数をasyncにして、この中でwritingNewRecods関数の処理内容を直接記載するか、writingNewRecods関数そのものもPromiseを返す関数にしてawaitで実行する必要があります。

mls-hashimoto 様

早速のご回答ありがとうございます。

管理の都合上2番目の方法で修正してみましたが、

やっぱり反映されずでした・・・。

 await kintone.api(kintone.api.url('/k/v1/record', true), 'POST', postParams, resp => {
                            // alert(`【${equipmentName}】をバーコード読込データアプリにレコードを追加しました。`);
                        
                            tableRecords[i].value.バーコード読込データのレコード番号.value = appCode + resp.id;

                            alert(tableRecords[i].value.バーコード読込データのレコード番号.value);
                          
                        });

こちらのブロック内ではバーコード読込データのレコード番号のフィールドには、確かにアプリコードの値が格納されていましたが、event return をした際に反映されてないのでしょうか?

念のため、現在のコードも見ていただけますと幸いです。

お手数をお掛けして申し訳ございませんが、よろしくお願いいたします。

  kintone.events.on('app.record.create.submit',async event => {

    await writingNewRecods(event);

    return event;

});

async function writingNewRecods(event) {

   

    const record = event.record;

    const tableRecords = record.読込データテーブル.value;

   

    for(let i = 0; tableRecords.length > i; i++) {

        // 条件対象フィールド値

        const rsDate = record.入出荷日.value;

        const orderNumber = record.指示番号.value;

        const equipmentCode = tableRecords[i].value.確認用_機材コード.value;

        const shippingLabel = tableRecords[i].value.確認用_送り状番号.value;

        const equipmentName = tableRecords[i].value.確認用_機材名.value;

        //取得レコード条件式

        const query = `入出荷日 = "${rsDate}" and 指示番号 = "${orderNumber}" and 機材コード = "${equipmentCode}" and 送り状番号 = "${shippingLabel}"`;

        const body = {

            'app': barcodeReadingDataAppId,

            'query': query,

        }

        //追加レコードパラメ

        const postParams = {

            'app': barcodeReadingDataAppId,

            'record': {

                'シリアルコード': {'value': tableRecords[i].value.確認用_シリアルコード.value},

                'データ区分': {'value': record.データ区分.value},

                'メモ': {'value': tableRecords[i].value.確認用_メモ.value},

                '入出荷日':  {'value': record.入出荷日.value},

                '店舗コード_ルックアップ用': {'value': record.店舗コード_ルックアップ用.value},

                '指示番号': {'value': record.指示番号.value},

                '数量': {'value': tableRecords[i].value.確認用_数量.value},

                '検査フラグ_0': {'value': tableRecords[i].value.確認用_検査フラグ.value},

                '機材コード': {'value': tableRecords[i].value.確認用_機材コード.value},

                '状態': {'value': tableRecords[i].value.確認用_状態.value},

                // '目的': {'value': },

                '送り状番号': {'value': tableRecords[i].value.確認用_送り状番号.value},

            }

        }

        try {

            //「バーコード読込データ」アプリ内レコード重複チェック

            await kintone.api(kintone.api.url('/k/v1/records', true), 'GET', body, async resp => {

               

                if(resp.records.length === 0) {

                    try {

                        //「バーコード読込データ」アプリへレコードを追加

                        await kintone.api(kintone.api.url('/k/v1/record', true), 'POST', postParams, resp => {

                            // alert(`【${equipmentName}】をバーコード読込データアプリにレコードを追加しました。`);

                       

                            tableRecords[i].value.バーコード読込データのレコード番号.value = appCode + resp.id;

                         

                        });

               

                    } catch (error) {

                        alert('error');

                    }

                } else {

                    alert(`【${equipmentName}】同内容のレコードが既に登録されているため、このレコードは登録されません。`);

                    event.error = '同内容のレコードが既にバーコード読込データアプリに登録されています';  

                }

            });

           

        } catch (error) {

            alert(error);

        }

    }

    return event;

}

山田麻未 さま

またしても勘違いしておりました。申し訳ありません。

awaitを使ってAPIを実行する場合、成功時のコールバック関数に続きの処理を記載するのではなく、同期的に記載する必要があります(コールバックに続きの処理を書かなくていいように作られたものがasync/awaitです)。

                await kintone.api(kintone.api.url('/k/v1/records', true), 'GET', body, async resp => {
                    if(resp.records.length === 0) {
                        try {
                            //「バーコード読込データ」アプリへレコードを追加
                            await kintone.api(kintone.api.url('/k/v1/record', true), 'POST', postParams, resp => {
                                // alert(`【${equipmentName}】をバーコード読込データアプリにレコードを追加しました。`);
                                tableRecords[i].value.バーコード読込データのレコード番号.value = appCode + resp.id;
                            });
                        } catch (error) {
                            alert('error');
                        }
                    } else {
                        alert(`【${equipmentName}】同内容のレコードが既に登録されているため、このレコードは登録されません。`);
                        event.error = '同内容のレコードが既にバーコード読込データアプリに登録されています';  
                    }
                });

                let get = await kintone.api(kintone.api.url('/k/v1/records', true), 'GET', body);

                if (get.records.length === 0) {
                    let add = await kintone.api(kintone.api.url('/k/v1/record', true), 'POST', postParam);

                    tableRecords[i].value.バーコード読込データのレコード番号.value = appCode + add.id;
                } else {
                    alert(`【${equipmentName}】同内容のレコードが既に登録されているため、このレコードは登録されません。`);
                    event.error = '同内容のレコードが既にバーコード読込データアプリに登録されています';
                    // tableRecords[i].value.バーコード読込データのレコード番号.error = 'エラー内容' の方が分かりやすいかもしれません。
                }

mls-hashimoto 様

この度はご教授いただき本当にありがとうございます。

mls-hashimoto様に教えていただいた通りに修正いたしましたところ、

期待通りの結果になりました。

また理解しきれていなかったasync/awaitの使い方も、以前よりかなり理解することが出来ました。

本当に、本当にありがとうございます。

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