お世話になっております。
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,
}
}
};
})
});
});
})();
とりあえずは上記内容で動いているようですので、一旦解決したとさせていただきたいと思います。
アドバイスをいただき感謝しております。ご対応ありがとうございました。