SuiteScript 2.x客户端脚本Firefox正常Chrome失效,求解决方案
问题解决:SuiteScript 2.x客户端脚本在Chrome中失效的问题
问题描述
我编写了一个使用saveRecord函数的SuiteScript 2.x客户端脚本,用于将表头字段信息复制到对应的行项目字段中。在Firefox中测试时,每行项目字段都能正确填充表头的对应值;但在Google Chrome中测试时,脚本无报错却失效,看似值已复制但行未提交导致数据丢失,有时甚至无法保存,停留在搜索框(其中一个字段为选择字段),框内数据正确但末尾莫名添加了斜杠(/)。
原代码
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 } } catch(e) { console.error(e); } }
问题分析与修复方案
1. 循环索引越界问题
原代码循环条件为i <= count,但getLineCount返回的是行项目总数,行索引从0开始,有效范围是0到count-1。访问i = count的行属于越界操作,Chrome对这类错误的处理更严格,会直接导致行提交失败。
修复:将循环条件改为i < count
2. saveRecord函数未返回布尔值
客户端脚本的saveRecord函数必须返回true或false,否则默认会阻止表单保存。原代码仅设置ran = true但未返回,Chrome会因此拦截保存操作。
修复:在函数末尾添加返回逻辑,确保返回true允许正常保存
3. 选择字段赋值类型错误
行项目的customer是选择类型字段,应该使用内部ID(通过getValue获取)而非文本值(getText获取)。原代码用文本值直接赋值,会导致字段值格式异常(比如末尾出现斜杠),且无法正确匹配选项。
修复:将jobNumber改为用getValue获取,确保传递的是字段对应的内部ID
4. 冗余的字段重复判断
原代码在if条件中重复调用getText获取字段值,可直接复用已定义的变量,提升代码效率。
修复后的代码
function saveRecord(scriptContext) { try{ var context = scriptContext.currentRecord; var classText = context.getText({ fieldId: 'class' }); var jobId = context.getValue({ fieldId: 'custbody_job_number' }); var lineCount = context.getLineCount({ sublistId: 'item' }); if (jobId && classText) { console.info('所有字段已有数据,准备复制'); for(var i = 0; i < lineCount; i++){ context.selectLine({ sublistId: 'item', line: i }); // 仅处理已填写商品的行 if (context.getCurrentSublistValue({ sublistId: 'item', fieldId: 'item' })) { context.setCurrentSublistText({ sublistId: 'item', fieldId: 'class', text: classText }); context.setCurrentSublistValue({ sublistId: 'item', fieldId: 'customer', value: jobId }); context.commitLine({ sublistId: 'item' }); } } } // 必须返回true允许保存 return true; } catch(e) { console.error('脚本执行错误:', e); // 出错时返回false阻止保存,避免数据异常 return false; } }
额外建议
- 测试时打开Chrome开发者工具的Console面板,查看是否有隐藏的报错信息
- 对于选择字段,优先使用
getValue/setCurrentSublistValue操作内部ID,避免文本匹配的兼容性问题 - 提交行后可尝试调用
context.refreshSublist({ sublistId: 'item' })确保行项目刷新(部分场景下需要)
内容的提问来源于stack exchange,提问作者user27490221
相关产品推荐
相关产品推荐

