レコードの値を他のアプリのテーブルに追加したい

サービス書アプリ
顧客ID(文字列一行)、お客様名lookup(ルックアップ)
部品コード(テーブル名です)にある、
在庫管理No(文字列一行)※複数行異なる在庫管理Noが入ります

在庫管理アプリ
管理No(文字一列)が
サービス書アプリの部品コードテーブル内の在庫管理Noと
一致するとき
入出庫履歴(テーブル名です)にある
顧客ID(文字列一行)、顧客名(文字列一行)
にサービス書アプリの
顧客ID、お客様名lookup
の値を入れたいと考えています。

jsを作成してみましたが
保存できない状況です。
在庫管理にもなにも走っていません。
ミスしているところがわかれば
お教えいただけますと大変ありがたいのですが
何卒、宜しくお願い致します。

(function() {
‘use strict’;

// レコード追加時に発生するイベント
kintone.events.on('app.record.create.submit', async function(event) {
    await processCustomerInfo(event);
    return event;
});

// レコード保存時に発生するイベント
kintone.events.on('app.record.edit.submit', async function(event) {
    await processCustomerInfo(event);
    return event;
});

// 顧客情報を処理する共通関数
async function processCustomerInfo(event) {
    const record = event.record;
    
    // サービス書アプリから必要な情報を取得
    const customerId = record['顧客ID'].value;
    const customerName = record['お客様名'].value;
    const partsCodeTable = record['部品コード'].value; // ここがテーブルです

    // 部品コードテーブル内の「在庫管理No」を配列で取得
    const stockNumbers = partsCodeTable.map(item => item['在庫管理No'].value);

    // 在庫管理アプリの管理Noと一致するレコードを検索
    const inventoryAppId = 53;
    const inventoryApi = await kintone.api('/k/v1/records', 'GET', {
        app: inventoryAppId,
        query: '管理No in ("' + stockNumbers.join('","') + '")'
    });

    const inventoryRecords = inventoryApi.records;

    // 入出庫履歴テーブルにデータを追加
    const inOutHistoryTable = inventoryRecords.map(inventoryRecord => ({
        '顧客ID': {
            'value': customerId
        },
        '顧客名': {
            'value': customerName
        }
    }));

    // 入出庫履歴にレコードを追加するAPI呼び出し
    const updateEvent = {
        app: inventoryAppId,
        records: inOutHistoryTable
    };

    await kintone.api('/k/v1/records', 'POST', updateEvent);
}

})();

コンソールのエラーです。ご参考頂けますと幸いです。

3か所の修正を行ってみました。修正後のコードもまとめて張り付けておきますのでご確認ください。

1:下記のテーブルデータを取得する部分と
const stockNumbers = partsCodeTable.map(item => item[‘在庫管理No’].value);

2:下記のテーブルデータを保存する部分です。
const inOutHistoryTable = inventoryRecords.map(inventoryRecord => ({・・・・

3:データ更新時のメソッドを変更
await kintone.api(‘/k/v1/records’, ‘POST’, updateEvent);

なお、在庫管理アプリのテーブルの名前が「入出庫履歴」なので、データは累積させたいのでしょうか?その場合にはinOutHistoryTable に既存及び追加したい行の値を含める必要があります。
テーブルの更新については、下記を参考にしてください。
レコード更新におけるテーブル操作のテクニック - cybozu developer network

(function() {
    'use strict';
    
    // レコード追  加時に発生するイベント
    kintone.events.on('app.record.create.submit', async function(event) {
        await processCustomerInfo(event);
        return event;
    });
    
    // レコード保存時に発生するイベント
    kintone.events.on('app.record.edit.submit', async function(event) {
        await processCustomerInfo(event);
        return event;
    });
    
    // 顧客情報を処理する共通関数
    async function processCustomerInfo(event) {
        const record = event.record;
        
        // サービス書アプリから必要な情報を取得
        const customerId = record['顧客ID'].value;
        const customerName = record['お客様名'].value;
        const partsCodeTable = record['部品コード'].value; // ここがテーブルです
    
        // 部品コードテーブル内の「在庫管理No」を配列で取得
        //データー構造を修正
        const stockNumbers = partsCodeTable.map(item => item.value.在庫管理No.value);
    
        // 在庫管理アプリの管理Noと一致するレコードを検索
        const inventoryAppId = 53;
        const inventoryApi = await kintone.api('/k/v1/records', 'GET', {
            app: inventoryAppId,
            query: '管理No in ("' + stockNumbers.join('","') + '")'
        });
    
        const inventoryRecords = inventoryApi.records;
    
        // 入出庫履歴テーブルにデータを追加
        const inOutHistoryTable = inventoryRecords.map(inventoryRecord => ({
            id: inventoryRecord.$id.value,
            record: {
                '入出庫履歴': {    // ここにテーブルのフィールドコードを指定
                    value: [{      // テーブルの各行のデータは配列として指定
                        value: {   // 各セルのデータ
                            '顧客ID': {
                                value: customerId
                            },
                            '顧客名': {
                                value: customerName
                            }
                            // 他のテーブル列のデータ
                        }
                    }]
                }
            }
        }));
        
        const updateEvent = {
            app: inventoryAppId,
            records: inOutHistoryTable
        };
        
        await kintone.api(kintone.api.url('/k/v1/records'), 'PUT', updateEvent);
    }
    })();
1 Like

lemon_sour様

お忙しいところ、ご連絡頂きまして
誠にありがとうございます。
動作の確認が取れました。
顧客IDは在庫管理アプリに入っていて
顧客名 が入らないのですが
サービス書のお客様名がルックアップフィールドの為
でしょうか?
データは累積させていきたいのですが、
現状だといつも一行目が上書きされる認識でよいでしょうか?
どんどん次の行次の行という風に
足されていくようにしたいので行の指定が
必要になる認識であっていますでしょうか?
大変恐縮ですが、お教えいただけますと幸いです。
何卒、宜しくお願い致します。

こちら在庫管理の顧客名のフィールドコードが間違えていたので
解決できました!
また、テーブルは最後の行に追加する
という認識でよいでしょうか?
一応、下記jsで想定通りの動きにはなったかと思われます。

(function () {
‘use strict’;

// レコード追加時に発生するイベント
kintone.events.on('app.record.create.submit', async function (event) {
    await processCustomerInfo(event);
    return event;
});

// レコード保存時に発生するイベント
kintone.events.on('app.record.edit.submit', async function (event) {
    await processCustomerInfo(event);
    return event;
});

// 顧客情報を処理する共通関数
async function processCustomerInfo(event) {
    const record = event.record;

    // サービス書アプリから必要な情報を取得
    const customerId = record['顧客ID'].value;
    const customerName = record['お客様名lookup'].value;
    const visitDate = record['訪問日'].value; // 訪問日(日付フィールド)を取得
    const partsCodeTable = record['部品コード'].value; // 部品コードテーブル

    // 部品コードテーブル内の「在庫管理No」を配列で取得
    const stockNumbers = partsCodeTable.map(item => item.value.在庫管理No.value);

    // 在庫管理アプリの管理Noと一致するレコードを検索
    const inventoryAppId = 53;
    const inventoryApi = await kintone.api('/k/v1/records', 'GET', {
        app: inventoryAppId,
        query: '管理No in ("' + stockNumbers.join('","') + '")'
    });

    const inventoryRecords = inventoryApi.records;

    // 各在庫管理レコードに対して入出庫履歴テーブルを更新
    for (const inventoryRecord of inventoryRecords) {
        // 現在の入出庫履歴を取得
        const currentHistory = inventoryRecord['入出庫履歴'].value || [];

        // 新しい履歴データを作成
        const newHistoryRow = {
            value: {
                '顧客ID': { value: customerId },
                '顧客名0': { value: customerName },
                '出庫日': { value: visitDate } // 出庫日に訪問日を設定
                // 必要に応じて他の列も追加
            }
        };

        // 新しい行を履歴に追加(累積)
        const updatedHistory = [...currentHistory, newHistoryRow];

        // 更新データを構築
        const updateEvent = {
            app: inventoryAppId,
            id: inventoryRecord['$id'].value,
            record: {
                '入出庫履歴': {
                    value: updatedHistory
                }
            }
        };

        // レコードを更新
        await kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', updateEvent);
    }
}

})();

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