If you have a limited set of fields to check you can make use of the old record. Rough idea below:
function afterSubmit(context) {
const oldRec = context.oldRecord;
const newRec = context.newRecord;
const updateSpec = getBodyChanges(newRec, oldRec);
updateSpec.lines = [];
// similar idea for lines but you also have to make sure lines (checking lineuniqekey) have not been removed.
getLineChanges(updateSpec, newRec, oldRec);
if(!updateSpec.anyChanged){
// no fields of interest were changed
return;
}
// proceed with SalesForce update
}
function getBodyChanges(newRec, oldRec){
const updateSpec = {
anyChanged: false,
fields : {}
};
const bodyValueFields = ['tranid', 'memo', ...];
const bodyTextFields = ['location', 'department'...];
const cmpVals = (fld)=>{
if(!oldRec) return true;
return oldRec.getValue({fieldId:fld}) === newRec.getValue({fieldId:fld});
};
bodyValueFields.forEach(f=>{
if(!cmpVals(f)) return;
updateSpec.anyChanged = true;
updateSpec.fields[f] = newRec.getValue({fieldId:f});
});
bodyTextFields.forEach(f=>{
if(!cmpVals(f)) return; // don't need to compare texts to detect a change
updateSpec.anyChanged = true;
updateSpec.fields[f] = newRec.getText({fieldId:f});
});
}