テーブルデータを別アプリのレコードに登録するだけでなく、更新(可能なら削除も)もできるようにしたい

下記のスレッドを参考にアプリ(アプリA)のテーブルデータを、別アプリ(アプリB)に登録することはできたのですが、アプリAのテーブルデータを更新するたびに、アプリBに新規でレコードが登録されてしまいます

実現したい内容として、アプリAのテーブル内容を更新した際はアプリBのレコードに新規登録ではなくすでに登録済みのレコードを更新、さらに可能であればテーブルの行削除の場合はレコードを削除するような仕様に変更することは可能でしょうか?

https://developer.cybozu.io/hc/ja/community/posts/900001022086/comments/900000297403

記載のコードは以下のとおりです※アプリIDのみ修正

元々のコードが新規登録の記述で、

  • 更新の際はテーブルの行(アプリBのレコード)ごとにIDを発行する
  • 更新はpostではなくputで行う

の2点が追加で必要な処理だと理解しているのですが、具体的にどのような記述を行えばいいのかわからず、、、

(function () {
  "use strict";
  kintone.events.on([
    'app.record.create.submit.success', 'app.record.edit.submit.success'
  ], function (event) {
    var postApp = 0000; //BアプリのID
    var subTable = 'quote'; //サブテーブルのフィールドコード
    var headers = [ //コピーするサブテーブル外のフィールドのフィールドコード
        `recordId`,
        'projectName',
        'quote_date1',
        'quote_date',
        'quote_conditions',
        'expiry',
    ];

    kintone.api(kintone.api.url('/k/v1/records', true), 'POST', {
      app: postApp,
      records: event.record[subTable].value.map(function (row) {
        headers.forEach(function (header) {
          row.value[header] = event.record[header];
        });
        return row.value;
      })
    });
  });
})();

実現方法や可能であれば正しい記述をご教授いただけると助かります

 

また、下記の別記事も参考にしてみたのですが、同じく保存で処理が止まり(再度保存を押すとエラー[レコードを再読み込みしてください。編集中に、ほかのユーザーがレコードを更新しました。])が出てしまいます

https://developer.cybozu.io/hc/ja/community/posts/900001022086/comments/900000297403

投稿主はこちらのレスにより解決した流れとなっておりますが、

https://developer.cybozu.io/hc/ja/community/posts/900001022086/comments/900000310923

具体的にどのような記述変更で解決したのかがわからず詰まっています、、、

なおこちらで試したjsのコードは下記のとおりとなります

(function() {
    "use strict";
    
    kintone.events.on("app.record.create.submit.success", function(event) {
        
      var postApp = 0000; // 別アプリのID
        var recId = event.recordId; // テーブルを登録したレコードを更新するためのID
        var subTable = 'quote'; //サブテーブルのフィールドコード
        var headers = [ //コピーするサブテーブル外のフィールドのフィールドコード
        `recordId`,
        'projectName',
        'quote_date1',
        'quote_date',
        'quote_conditions',
        'expiry',
        ];
        
        var record = event.record;
        
        // テーブルを更新するための値
        var table = event.record.Table.value;
        var array = [];

        
        
        return kintone.api(kintone.api.url('/k/v1/records', true), 'POST', {
            app: postApp,
            records: event.record[subTable].value.map(function (row) {
                headers.forEach(function (header) {
                    row.value[header] = event.record[header];
                });
            return row.value;
            })
        }).then(function(resp) {
            // ↓↓↓↓↓↓↓↓↓↓↓↓登録が成功したレコードID をテーブルに登録するための処理
            console.log(resp);
            for (var i = 0; i < table.length; i++) {
                array.push({
                    "id":table[i].id,
                    "value":{
                        "id": {
                            "value": resp.ids[i]
                        }
                    }
                });
            }
            
            var body = {
                "app": kintone.app.getId(),
                "id": recId,
                "record" :{
                    "Table":{
                        "value": array
                    }
                }
            }
            
            return kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', body).then(function(resp) {
                
                // success
                console.log(resp);

            }, function(error) {
                // error
                console.log(error);
            });
            
            
        });
        
    });
    
    // 更新時の処理
    kintone.events.on("app.record.edit.submit.success", function(event) {
        
        
      var postApp = 0000; // 別アプリのID
        var recId = event.recordId; // テーブルを登録したレコードを更新するためのID
        var subTable = 'quote'; //サブテーブルのフィールドコード
        var headers = [ //コピーするサブテーブル外のフィールドのフィールドコード
        `recordId`,
        'projectName',
        'quote_date1',
        'quote_date',
        'quote_conditions',
        'expiry',
        ];
        
        var record = event.record;
        

        console.log(event.record[subTable].value.map(function (row) {
                    headers.forEach(function (header) {
                        row.value[header] = event.record[header];
                    });
            return row.value;
        }))
        
        return kintone.api(kintone.api.url('/k/v1/records', true), 'PUT', {
            app: postApp,
            records: 
                event.record[subTable].value.map(function (row) {
                    headers.forEach(function (header) {
                        row.value[header] = event.record[header];
                    });
                return {
                    id: row.value.id.value,
                    record: row.value
                };
                
            })
        });
    });

})();

長文につきまとまりがない文で恐縮ですが何卒よろしくお願いいたします

createとeditはevent.typeでも判定できるので、一緒に記述して、そこから分岐させるのもいいかもしれません。

(function () {
    kintone.events.on([
        'app.record.create.submit.success', 'app.record.edit.submit.success'
    ], function (event) {
        const record = event.record

        // 設定-----------------------------------------------------------
        // 対象アプリ
        const targetApp = 0000
        // サブテーブルのフィールド名
        const table = "テーブル"
        // テーブル以外のフィールド名を記述
        const fields = ['文字']
        // 更新の場合、対象のレコードID。ここは必要に応じて取得や変更してください。
        const targetRecordId = 1
        // -----------------------------------------------------------

        // 各フィールドのデータ生成
        let data = {}
        fields.forEach(field => {
            data = {
                ...data,
                [field]: {
                    value: record[field].value
                }
            }
        })

        // テーブルのでデータ生成
        let tableData = {
            [table]: {
                value: record[table].value
            }
        }

        // 生成データをrecordの中で展開して内容を設定
        let body = {
            'app': targetApp,
            'record': {
                ...data,
                ...tableData,
            }
        };

        switch (event.type) {
            // レコードの追加の場合
            case 'app.record.create.submit.success':
                kintone.api(kintone.api.url('/k/v1/record.json', true), 'POST', body, (resp) => {
                    console.log(resp);
                }, (error) => { console.log(error); })
                break;
            // レコードの編集の場合
            case 'app.record.edit.submit.success':
                // 編集の場合、更新対象のレコードIDが必要なのでこのタイミングで追加
                body = {
                    ...body,
                    id: targetRecordId
                }
                kintone.api(kintone.api.url('/k/v1/record.json', true), 'PUT', body, (resp) => {
                    console.log(resp);
                }, (error) => { console.log(error); })
                break;
            default:
                break;
        };
    });
})();

nabe 様

詳細なアドバイス、コードのご提示誠にありがとうございます

確認が遅くなってしましたが本日早速試させていただきました

が、私のスキルが未熟なためかどうもうまくいきませんでした。。。

おそらく下記部分の対応がわかっていないためだと思うのですが、私自身kintoneはもちろん、jsについてもまだまだ未熟なため本当に恐縮ですが、お手すきの際でも構いませんのでアドバイス頂戴できるとありがたいです

// 更新の場合、対象のレコードID。ここは必要に応じて取得や変更してください。
consttargetRecordId = []

改めてエラーやアップロードしたjsを共有させていただきます

何卒よろしくお願いいたします

 

(function () {
    kintone.events.on([
        'app.record.create.submit.success', 'app.record.edit.submit.success'
    ], function (event) {
        const record = event.record
​
        // 設定-----------------------------------------------------------
        // 対象アプリ
      const targetApp = 0000;
        // サブテーブルのフィールド名
        const table = 'quote';
        // テーブル以外のフィールド名を記述
        const fields = [
            `recordId`,
            'projectName',
            'quote_date1',
            'quote_date',
            'quote_conditions',
            'expiry',
        ];
        // 更新の場合、対象のレコードID。ここは必要に応じて取得や変更してください。
        const targetRecordId = []
        // -----------------------------------------------------------
​
        // 各フィールドのデータ生成
        let data = {}
        fields.forEach(field => {
            data = {
                ...data,
                [field]: {
                    value: record[field].value
                }
            }
        })
​
        // テーブルのでデータ生成
        let tableData = {
            [table]: {
                value: record[table].value
            }
        }
​
        // 生成データをrecordの中で展開して内容を設定
        let body = {
            'app': targetApp,
            'record': {
                ...data,
                ...tableData,
            }
        };
​
        switch (event.type) {
            // レコードの追加の場合
            case 'app.record.create.submit.success':
                kintone.api(kintone.api.url('/k/v1/record.json', true), 'POST', body, (resp) => {
                    console.log(resp);
                }, (error) => { console.log(error); })
                break;
            // レコードの編集の場合
            case 'app.record.edit.submit.success':
                // 編集の場合、更新対象のレコードIDが必要なのでこのタイミングで追加
                body = {
                    ...body,
                    id: targetRecordId
                }
                kintone.api(kintone.api.url('/k/v1/record.json', true), 'PUT', body, (resp) => {
                    console.log(resp);
                }, (error) => { console.log(error); })
                break;
            default:
                break;
        };
    });
})();

あぁ、、アプリAのテーブルをアプリBでは分けて、というところを見落としてました。すみません。

今回のサンプルだとtargetRecordId(更新の場合のID)は配列でなく1つを指定してやってみてください。これで追加と更新で分けて更新するながれはできると思います。これでシンプルな追加と更新の仕組みはわかると思うので、それをテーブル行数分処理かけるかたちにしてあげれば大丈夫だと思います。

また、アプリBの各レコードを更新するためにもアプリAからアプリBのデータを取得しに行くことになるとは思いますが、サブテーブルの各行にあらかじめキーとなる値を振っておいてあげた方が更新処理しやすいと思います。(行に一意の値があれば不要です)

 

 

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