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

**URL:** <https://community.cybozu.dev/t/topic/9729>\
**Category:** kintone 開発相談\
**Created:** [2024 年 11 月 15 日午前 9:28 UTC](https://community.cybozu.dev/t/topic/9729 "2024-11-15T09:28:46Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![riogrande](https://avatars.discourse-cdn.com/v4/letter/r/ec9cab/32.png) [@riogrande](https://community.cybozu.dev/u/riogrande)\
**Post date:** [2024 年 11 月 15 日午前 9:28 UTC](https://community.cybozu.dev/t/topic/9729/1 "2024-11-15T09:28:46Z")

</div>

サービス書アプリ  
顧客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);
}

```

})();

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

 ![キャプチャ](https://us1.discourse-cdn.com/flex015/uploads/cybozu/original/2X/1/178f10482b08fb9f9dd2bac1fac167939f1c66d0.png)

---

<div class="post-metadata">

**Author:** ![lemon\_sour](https://sea1.discourse-cdn.com/flex015/user_avatar/community.cybozu.dev/lemon_sour/32/1469_2.png) [@lemon\_sour](https://community.cybozu.dev/u/lemon_sour)\
**Post date:** [2024 年 11 月 17 日午前 12:06 UTC](https://community.cybozu.dev/t/topic/9729/2 "2024-11-17T00:06:17Z")

</div>

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

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

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

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

なお、在庫管理アプリのテーブルの名前が「入出庫履歴」なので、データは累積させたいのでしょうか？その場合にはinOutHistoryTable に既存及び追加したい行の値を含める必要があります。  
テーブルの更新については、下記を参考にしてください。  
[レコード更新におけるテーブル操作のテクニック - cybozu developer network](https://cybozu.dev/ja/kintone/tips/development/customize/table/table-operations-techniques-on-record-update/)

```javascript
(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);
    }
    })();

```

---

<div class="post-metadata">

**Author:** ![riogrande](https://avatars.discourse-cdn.com/v4/letter/r/ec9cab/32.png) [@riogrande](https://community.cybozu.dev/u/riogrande)\
**Post date:** [2024 年 11 月 18 日午前 1:32 UTC](https://community.cybozu.dev/t/topic/9729/3 "2024-11-18T01:32:21Z")

</div>

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);
    }
}

```

})();

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/flex015/uploads/cybozu/original/1X/d5c841c3c5a6cb66eed514001c1b45147c9e1f4f.png) [@system](https://community.cybozu.dev/u/system)\
**Post date:** [2024 年 11 月 21 日午前 1:32 UTC](https://community.cybozu.dev/t/topic/9729/4 "2024-11-21T01:32:25Z")

</div>

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