You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 19:46:21