【Kintone】Aアプリのテーブル更新結果をBアプリのレコードに反映させたい

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

 

Aアプリのテーブルに入力したデータを

Bアプリのレコードに登録するといった処理は行えたのですが、

Aアプリのテーブル内のデータを更新した際に

その結果をBアプリのレコードに反映させるといったことができずに躓いております。

 

Aアプリのテーブル内にBアプリの重複禁止のデータを持っているため

updateKeyを使えばよいのかと思うのですが、指定の仕方がわからないでいます。

コードを記載いたしますので、添削していただけますと幸いです。

 

(function () {
"use strict";

//テーブルを更新した際の処理
kintone.events.on([
'app.record.edit.submit.success',
], function (event) {
var postApp = 62; //部品販売明細テーブルのID
var subTable = 'テーブル'; //サブテーブルのフィールドコード

var headers = [ //コピーするサブテーブル外のフィールドのフィールドコード
'BH_NO',
];

kintone.api(kintone.api.url('/k/v1/records', true), 'PUT', {
app: postApp,

//updateKeyの記入箇所、指定方法について教えていただけますでしょうか。
updateKey: event.record.PK_T_BUHIN_M.value,

records: event.record[subTable].value.map(function (row) {
headers.forEach(function (header) {
row.value[header] = event.record[header];
});

return {
record: row.value
};

})
});

});

})();

 

yamanaka さん

https://developer.cybozu.io/hc/ja/articles/201941784#step2 の「リクエストボディの構造(重複禁止のフィールドコードと値を指定する)」が参考になります。

updateKey の中身は、レコードを特定できるよう、「重複禁止のフィールドコード」と「そのフィールドに入っている値」をそれぞれ値にもつオブジェクトにします。

なので、こんな感じでしょうか。

// updateKey の記入箇所、指定方法について教えていただけますでしょうか。
updateKey: {
 "field": "Bアプリの重複禁止のフィールドコード",
"value": event.record.PK_T_BUHIN_M.value,
},

また別件で、kintone.api は非同期処理なので、Bアプリのレコード更新が完了する前に app.record.edit.submit.success イベントが終わってしまう可能性があります。

kintone.api を return して、Promise を返却するようにしたほうがよさそうです。
参考:https://developer.cybozu.io/hc/ja/articles/204564604

return kintone.api(kintone.api.url('/k/v1/records',true),'PUT', {

ひよこさん

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

「リクエストボディの構造(重複禁止のフィールドコードと値を指定する)」を参考に

updateKeyの記述を変えてみましたが、

'value': event.record.PK_T_BUHIN_M.value,

の箇所で「Uncaught TypeError: Cannot read property ‘value’ of undefined」とエラーが出力し

保存が行えない状況です。

 

お手数をおかけし申し訳ございませんが、

何か考えられる原因等ありますでしょうか。

ご教示いただけますと幸いです。

yamanaka さん

「Uncaught TypeError: Cannot read property ‘value’ of undefined」というエラーは
「(event.record.PK_T_BUHIN_M)にvalue というプロパティがない」というエラーです。

よくあるパターンとしては、フィールドコードが正しく設定されてないケースです。

なので、
Bアプリと突合させたい値が入っているAアプリのフィールドに、「PK_T_BUHIN_M」というフィールドコードが設定されているか、
確認してほしいです。

ひよこさん

返信が遅くなり申し訳ありません。

うまくいかなかった原因は、以下の処理の中にupdateKeyフィールドの値が入っており

それを更新しようとしていたため、失敗していたことがわかりました。

return{
 record: row.value
};

 

最終的には、以下のようにupdateKeyを指定し

レコードの情報は更新させたいフィールドのみ指定(updateKeyの値が入っているフィールドは除いて)することで

うまくいくようになりました。※必要ない部分が残されておりますが。

 

kintone.events.on('app.record.edit.submit.success', function (event) {
var postApp = 62;      //部品販売明細テーブルのID
var subTable = 'テーブル'; //サブテーブルのフィールドコード

var headers = [ //コピーするサブテーブル外のフィールドのフィールドコード
'BH_NO',
];

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 {
//重複禁止フィールドを指定。
updateKey: {
'field': 'PK_T_BUHIN_M',
'value': row.value.PK_T_BUHIN_M.value,
},
//更新するフィールドを指定して対処する。
record:{
'BH_CD' :{
'value': row.value.BH_CD.value,
},
'BH_SBT1' :{
'value': row.value.BH_SBT1.value,
},
'BH_SBT2' :{
'value': row.value.BH_SBT2.value,
},
'BH_SUU' :{
'value': row.value.BH_SUU.value,
},
'BUHIN_KIN' :{
'value': row.value.BUHIN_KIN.value,
},
'BUHIN_KIN_KEI' :{
'value': row.value.BUHIN_KIN_KEI.value,
}
}
};
})
});
});
})();

 

とりあえずは上記内容で動いているようですので、一旦解決したとさせていただきたいと思います。

アドバイスをいただき感謝しております。ご対応ありがとうございました。