応答ありがとうございます。
しかしながら、例示されたコードは、kintone.api rest-APIのPUTの非同期実行結果であるresp2を握りつぶしているだけで、「$revisionが最新ではない」という内部エラーの発生を回避できるものではありませんでした。 エラー扱いとなるので、当然、DB内容も更新できませんでした。
処理を複雑化していると指摘されたif文は、下記の場合分け目的のものでしたが、イベントハンドラ毎にreturn時に有効なプロパティが異なる(event.recordが参照されなかったり、event.urlに遷移したり)ので、別々のイベントハンドラに分割せざるをえないと考えて、一つ前のコメント以降で 分割版にしています。
・‘app.record.detail.show’:「一覧表示画面から詳細表示画面に入った場合は、フォーム表示内容のみを更新して、表示を期待]
・‘app.record.edit.submit.success’:「詳細表示画面の中で、保存ボタンが押された場合は、DB内容が更新されているので、自前のカスタムコードで値を変更したフィールドの値をDBに追いつき書き込みする」
ここで、「$revisionが最新ではない」というエラーの対処としては、公式ドキュメントに記載の無い内部的な挙動である「submit.successイベント発火時は、$revision.valueがインクリメントされた状態となる)」という事から、下記のように「$revision.value +1」という値を用いるコードを変更したら、保存後の表示状態も、DB格納内容も、期待通りの値に更新されました。
しかしながら、アンドキュメントな挙動にそった このコードを改善できるようなAPIの使い方は無いものでしょうか?
また、保存ボタンを押す前の「一覧画面から詳細画面に入った時のフィールドの値を 自動変更できる」というAPIの使い方は、無いものでしょうか?
kintone.events.on(['app.record.detail.show'],
function (event) {
var record = event['record'];
console.log("at 顧客管理 event=", event)
var customerRecordNo2 = record["レコード番号"].value;
// recordレコード番号
var body1 = {
"app": kintone.app.getRelatedRecordsTargetAppId("incomingCallInfo1"),
"fields": ["customerRecordNo1", "stateOfIncomingCall1", "dateOfIncomingCall1", "nextDateOfCall1", "numberOfInCharges1"],
'query': 'customerRecordNo1 = ' + customerRecordNo2 +
' and stateOfIncomingCall1 not in ("成約", "失注", "入電不可") order by dateOfIncomingCall1 asc',
"size": 500
}
// console.log(body1)
return kintone.api(kintone.api.url('/k/v1/records', true), 'GET', body1)
.then(resp1 =\> {
// success
// console.log(resp1);
var lastIncomingCall2Value = resp1.records.reduce(function (accVals, curVal) {
// console.log("at 顧客管理 reduce curVal=", curVal)
return {
dateOfIncomingCall1: curVal.dateOfIncomingCall1.value && (curVal.dateOfIncomingCall1.value.length \> 0) && (accVals.dateOfIncomingCall1 \< curVal.dateOfIncomingCall1.value) ? curVal.dateOfIncomingCall1.value : accVals.dateOfIncomingCall1,
nextDateOfCall1: curVal.nextDateOfCall1.value && (curVal.nextDateOfCall1.value.length \> 0) && (accVals.nextDateOfCall1 \> curVal.nextDateOfCall1.value) ? curVal.nextDateOfCall1.value : accVals.nextDateOfCall1,
numberOfInCharges1: accVals.numberOfInCharges1 + Number(curVal.numberOfInCharges1.value)
};
}, { dateOfIncomingCall1: "0000/01/01", nextDateOfCall1: "9999/12/31", numberOfInCharges1: 0 })
record.dateOfIncomingCall1.value = lastIncomingCall2Value.dateOfIncomingCall1 === "0000/01/01" ? "" : lastIncomingCall2Value.dateOfIncomingCall1;
record.nextDateOfCall1.value = lastIncomingCall2Value.nextDateOfCall1 === "9999/12/31" ? "" : lastIncomingCall2Value.nextDateOfCall1;
record.numberOfInCharges1.value = lastIncomingCall2Value.numberOfInCharges1;
console.log("at 顧客管理 同期更新後 event=", event);
return event;
}).catch(error1 =\> {
console.error(error1);
event.error = JSON.stringify(error1)
return event;
});
});
kintone.events.on([/\*'app.record.edit.submit',\*/ 'app.record.edit.submit.success'],
function (event) {
var record = event['record'];
console.log("at 顧客管理 edit event=", event)
var customerRecordNo2 = record["レコード番号"].value;
// recordレコード番号
var body1 = {
"app": kintone.app.getRelatedRecordsTargetAppId("incomingCallInfo1"),
"fields": ["customerRecordNo1", "stateOfIncomingCall1", "dateOfIncomingCall1", "nextDateOfCall1", "numberOfInCharges1"],
'query': 'customerRecordNo1 = ' + customerRecordNo2 +
' and stateOfIncomingCall1 not in ("成約", "失注", "入電不可") order by dateOfIncomingCall1 asc',
"size": 500
}
// console.log(body1)
try {
return kintone.api(kintone.api.url('/k/v1/records', true), 'GET', body1)
.then(resp1 =\> {
// success
// console.log("at 顧客管理 更新前 resp1=", resp1);
var lastIncomingCall2Value = resp1.records.reduce(function (accVals, curVal) {
return {
dateOfIncomingCall1: curVal.dateOfIncomingCall1.value && (curVal.dateOfIncomingCall1.value.length \> 0) && (accVals.dateOfIncomingCall1 \< curVal.dateOfIncomingCall1.value) ? curVal.dateOfIncomingCall1.value : accVals.dateOfIncomingCall1,
nextDateOfCall1: curVal.nextDateOfCall1.value && (curVal.nextDateOfCall1.value.length \> 0) && (accVals.nextDateOfCall1 \> curVal.nextDateOfCall1.value) ? curVal.nextDateOfCall1.value : accVals.nextDateOfCall1,
numberOfInCharges1: accVals.numberOfInCharges1 + Number(curVal.numberOfInCharges1.value)
};
}, { dateOfIncomingCall1: "0000/01/01", nextDateOfCall1: "9999/12/31", numberOfInCharges1: 0 })
// console.log(lastIncomingCall2Value)
record.dateOfIncomingCall1.value = lastIncomingCall2Value.dateOfIncomingCall1 === "0000/01/01" ? "" : lastIncomingCall2Value.dateOfIncomingCall1;
record.nextDateOfCall1.value = lastIncomingCall2Value.nextDateOfCall1 === "9999/12/31" ? "" : lastIncomingCall2Value.nextDateOfCall1;
record.numberOfInCharges1.value = lastIncomingCall2Value.numberOfInCharges1;
var body2 = {
'app': kintone.app.getId(),
'id': record["$id"].value,
'record': (Object.entries(record)
.map(function (key1Val) {
return (
key1Val[1]["type"] === "CREATED\_TIME" ||
key1Val[1]["type"] === "CREATOR" ||
key1Val[1]["type"] === "MODIFIER" ||
key1Val[1]["type"] === "RECORD\_NUMBER" ||
key1Val[1]["type"] === "STATUS" ||
key1Val[1]["type"] === "STATUS\_ASSIGNEE" ||
key1Val[1]["type"] === "UPDATED\_TIME" ||
key1Val[1]["type"][0] === "\_" ? null :
key1Val[1]["type"] === "SUBTABLE" ? ( // "(テーブルのフィールドコード)": {value: 値}
[
key1Val[0],
{
value: key1Val[1].value.map(function (rec2) {
return (Object.entries(rec2).map(function (key3Val3) {
return ([key3Val3[0], { value: key3Val3[1]["value"] }]);
})
.reduce(function (h3, kv3) {
h3[kv3[0]] = kv3[1];
return h3;
}, {})
)
;
})
}
]
) : [key1Val[0], { value: key1Val[1]["value"] }]
);
})
.filter(function (key1Val) { return key1Val; })
.reduce(function (h2, kv2) {
h2[kv2[0]] = kv2[1];
return h2;
}, {})
),
'revision': {type: "\_\_REVISION\_\_", value: record['$revision'].value + 1}
};
console.log("at 顧客管理 非同期更新 before put body2=", body2);
return kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', body2);
}).then(resp2 =\> {
// success
console.log("at 顧客管理 非同期更新後 responce=", resp2, event)
return event;
}).catch(error1 =\> {
// error
console.error(error1);
event.error = JSON.stringify(error1)
return event;
});
} catch (error2) {
console.error(error2);
event.error = JSON.stringify(error2)
return event;
}
});
★一覧画面から詳細画面に入った時は、event.recordを更新したにも関わらず、表示内容が変更されなかった。
★submit.sucessイベントハンドラでは、所望の更新が出来たが、ここまでの操作ソノモノが煩わしい。