我使用 saveRecord 函数编写了一个简单的客户端脚本,将一些信息从标题值复制到对应的行项目字段。在 Firefox 上测试时,我得到了每个行项目字段的预期结果,其中填充了标题中的相应字段,但是,当我在 google chrome 上测试时,没有抛出错误,但脚本停止工作,导致值似乎被复制,但行却没有t 提交,因此数据消失。有时它根本不会保存并卡在搜索框(其中一个字段是选择字段)上,其中包含正确的数据,但末尾神秘地添加了斜线(/)。有谁知道解决方法吗
function saveRecord(scriptContext) {
try{
var context = scriptContext.currentRecord
var ran = false;
var classValue = context.getText({
fieldId: 'class'
})
var jobNumber = context.getText({
fieldId: 'custbody_job_number'
})
var count = context.getLineCount({
sublistId: 'item'
})
if(context.getText({fieldId: 'custbody_job_number'}) != '' && context.getText({fieldId: 'class'}) != '' ){
console.info('All fields have data prepare for transfer')
for(var i = 0; i <= count; i++){
context.selectLine({
sublistId: 'item',
line: i
})
if(context.getCurrentSublistText({sublistId: 'item', fieldId: 'item'}) != ''){
context.setCurrentSublistText({
sublistId: 'item',
fieldId: 'class',
text: classValue
})
context.setCurrentSublistValue({
sublistId: 'item',
fieldId: 'customer',
value: jobNumber
})
context.commitLine({
sublistId: 'item',
})
}
}
ran = true
}```
如果
setCurrentSublistValue
返回SS 2.1的Promise,那就太好了
您的代码的一个问题是您过度索引子列表:
for(var i = 0; i < count; i++){ //for 0 based indexes the last index is count - 1
然而,发生的情况是您在
customer
字段完成采购之前提交了该行。
你至少想做的是:
context.setCurrentSublistValue({
sublistId: 'item',
fieldId: 'customer',
value: jobNumber,
forceSyncSourcing: true // so don't start to commit until sourcing is complete
})
有时这还不够,我不得不采取一些措施,例如将子列表索引放入数组中,例如:
var itemLines = Array.from({length:count}, (_, i)=>i); // modern browsers
function runLines(){
if(!itemLines.length) return;
var nxt = itemLines.shift(); // or .pop()
// do things
context.commitLine({
sublistId: 'item',
});
setTimeout(runLines, 300); // delay by experimentation. add some for daily variability
}
runLines();