テーブルデータを別アプリへ登録後、削除・更新したい

下記URLを参考にテーブルデータ(アプリA)を別アプリ(アプリB)へ登録することはできたのですが、
そこからさらにアプリAのテーブルデータの内容が更新、削除された場合アプリBのレコードにその内容を反映したいと考えています。

初心者ながらに更新方法をいろいろ試しているのですがうまくいきません。

もしサンプルとなる記述などございましたらご教示いただけないでしょうか。

よろしくお願い致します。

 

参考にした記事
https://developer.cybozu.io/hc/ja/community/posts/360047876532-%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E5%88%A5%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AB%E7%99%BB%E9%8C%B2%E3%81%97%E3%81%9F%E3%81%84-

MTYM さん

テーブルを登録 ⇒ 各行の値を別アプリへ 1つのレコードとして登録
テーブルの更新 ⇒ 別アプリの対応したレコードの更新
テーブルの削除 ⇒ 別アプリの対応したレコードを削除する

という認識なのですが、あってます?

あと、参考ページのようにテーブル以外にも登録する情報はありますでしょうか?

しぶい様

ご確認いただきありがとうございます。

テーブルを登録 ⇒ 各行の値を別アプリへ 1つのレコードとして登録
テーブルの更新 ⇒ 別アプリの対応したレコードの更新
テーブルの削除 ⇒ 別アプリの対応したレコードを削除する

↑の認識で間違いございません。

他には

・ドロップダウンの「納品」フィールド(空欄or納品済み)
・文字フィール度「注文者」
・日付フィールド「納品日」、「受注日」

がございます。
よろしくお願い致します。

MTYM さん

他にフィールドがあるなら処理は参考ページとほぼ同様と思って大丈夫ですね。

更新は、テーブルの各行へ別アプリのレコードid を登録しておくことで可能になりそうですね。
id を登録する用のフィールドをテーブルへ新たに配置する必要がありますが、別アプリへの登録時のレスポンスに各レコードの id が返ってくるので、レスポンスを利用してテーブルに id を登録することが可能だと思います。

登録した id を 更新後のイベント edit.submit.success 時に別アプリの対応するレコードの更新用の id として使用します。
更新する場合のリクエストボディは、ちょっと試せてないですが、参考ページとほぼ同じ作り方で可能だと思います。

削除はちょっと難しいかもですね…テーブルの行削除時に動くイベントはあるのですが、削除した行の値はとれなくなるので、削除のための id が取れなくなっていしまいます。

実装することができれば、便利そうなので少し考えてみます。

しぶい様

ご確認いただきありがとうございます!

削除の方は運用でカバーしようと思います。

現在javascriptを勉強中なのですが、コードをかけるレベルではないのでとても助かります。

よろしくお願い致します。

MTYM さん

スミマセン。更新はやってみたのですが、削除は心が折れてしまいました…

フィールドコードなど、自分のアプリに寄せていますし、参考にしたコードや自分の環境にある処理をツギハギしたりで同じようなコードもあるので絶対もう少し簡易化できるのですが、よろしければ、参考にしてみてください。

※ テーブルに id というフィールドコードを追加してます。

(function() {
"use strict";

kintone.events.on("app.record.create.submit.success", function(event) {

var postApp = ; // 別アプリのID
var recId = event.recordId; // テーブルを登録したレコードを更新するためのID
var subTable = 'Table'; //サブテーブルのフィールドコード
var headers = [ //コピーするサブテーブル外のフィールドのフィールドコード
'str2',
];

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 = ; // 別アプリのID
var recId = event.recordId; // テーブルを登録したレコードを更新するためのID
var subTable = 'Table'; //サブテーブルのフィールドコード
var headers = [ //コピーするサブテーブル外のフィールドのフィールドコード
'str2',
];

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

})
});
});

})();

しぶい様

サンプルコードありがとうございます!

いただいたものを参考に実装してみたのですが、
保存ボタンのところで止まってしまいました。。。。

もし可能であれば実際にコードを見ていただきたいのですが、
どのようにコードを貼ればいいでしょうか?

恐縮ですがよろしくお願いします。

連投してしまい申し訳ありません。

保存ボタンで止まっている画像とコードを添付致します。

またコードは以下のように入力しました。
※フィールドコード、サブテーブルのフィールドコードは自分のkintoneに合わせています。

おかしい点などご指摘いただければと思います。

よろしくお願い致します。

(function() {
"use strict";

kintone.events.on("app.record.create.submit.success", function(event) {

var postApp = 252; // 別アプリのID
var recId = event.recordId; // テーブルを登録したレコードを更新するためのID
var subTable = 'tabel1'; //サブテーブルのフィールドコード
var headers = [ //コピーするサブテーブル外のフィールドのフィールドコード
'name',
'shop_name',
'shop_adressno',
'shop_adress',
'sheet1',
'shime',
'shop_orderno',
'sheet1root',
'numeron',
'salesname',
' deliverydate',
'cartype',
'ohtercode',
'deliverytimestart',
'deliverytimeend',
'other',
'order_check',
];

var record = event.record;

// テーブルを更新するための値
var table = event.record.tabel1.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 = 252; // 別アプリのID
var recId = event.recordId; // テーブルを登録したレコードを更新するためのID
var subTable = 'tabel1'; //サブテーブルのフィールドコード
var headers = [ //コピーするサブテーブル外のフィールドのフィールドコード
'name',
'shop_name',
'shop_adressno',
'shop_adress',
'sheet1',
'shime',
'shop_orderno',
'sheet1root',
'numeron',
'salesname',
' deliverydate',
'cartype',
'ohtercode',
'deliverytimestart',
'deliverytimeend',
'other',
'order_check',
];

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

})
});
});

})();

MTYM さん

スミマセン、動かないとのコードで自分の環境に合わせて動かすとエラーなく動きました。
動作的にエラーが出てると思うので、このページの方法でエラーが見れると思うので修正してみてください。

しぶい様

ご返信ありがとうございます。
実は昨日試したのですが、
その際に画像のエラーが出ておりました。

アプリB(個別のレコード登録する側)のID(レコード番号)を取得→アプリAのサブテーブルのレコードIDフィールドへ登録という認識なのですが、
このエラーはアプリAのレコード番号へ書き込みをする動作をおこなってしまっているのでしょうか。

基本的な質問で申し訳ございません。

MTYM さん

処理の流れの認識はあっています。

そのエラー自体は POST時に発生しているエラーのようですね。発生理由自体は、レコード番号に値を登録しようとして発生しているのですが、登録 の API なので、アプリB へのレコード番号に登録を行うことで発生している状態だと思います。(スミマセン、自分から登録と言い出したことですが、アプリA へのレコードID は登録 API ではなく、更新 API を実行しているのです…)

しぶい様
登録・更新することができました!

ありがとうございます!

お世話になっております。
私もまったく同じエラーで止まっております。

しぶい様の回答から詳細な解決方法を教えていただけませんでしょうか。

コードを提示していただけるとなおありがたいです。

よろしくお願いします。