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

使用Client Script 2.X无法修改并提交子列表项的问题求助

NetSuite贷项通知单Client Script无法修改子列表值

我在NetSuite贷项通知单上部署了Client Script,意图修改每行item子列表的字段值并提交,但运行时子列表值无变化且无法提交。但将相同逻辑放到浏览器控制台执行时却每次成功。

问题代码(Client Script)

/**
 *@NApiVersion 2.0
 *@NScriptType ClientScript
 */

define(['N/currentRecord','N/log'], function(currentRecord,log) {
  function pageInit(context) {
    var newRec = context.currentRecord;
    var isConverted = newRec.getValue({
      fieldId: 'custbody15'
    });

    if (isConverted === true) {
      var numLines = newRec.getLineCount({
        sublistId: 'item'
      })

      var totalLines = (numLines - 1);


      for (var i = 0; i <= totalLines; i++) {
        var currLine = newRec.selectLine({
          sublistId: 'item',
          line: i
        });
        log.debug({title: 'Line Selected', details: currLine })

        currLine.setCurrentSublistValue({
          sublistId: 'item',
          fieldId: 'item',
          value: 836,
          ignoreFieldChange: true,
          forceSyncSourcing: false
        });

        currLine.commitLine({
          sublistId: 'item'
        });
        log.debug({title: 'is committed?', details: 'Yes' })
      }
    }

  }
  return {
    pageInit: pageInit
  };
});

控制台成功执行的脚本

require(['N/currentRecord'], function(currentRecord){
  var currRecObj = currentRecord.get();
  var lineObj = currRecObj.getLineCount({
    sublistId: 'item'
  });
  var actLines = lineObj - 1;
  for (i = 0; i <= actLines; i++) {
    var curLineObj = currRecObj.selectLine({
      sublistId: 'item',
      line: i
    });
    curLineObj.setCurrentSublistValue({
      sublistId: 'item',
      fieldId: 'item',
      value: 836,
      ignoreFieldChange: true,
      forceSyncSourcing: false
    });
    curLineObj.commitLine({
      sublistId: 'item'
    });
  }
});

问题原因与解决方案

核心原因

pageInit事件触发时,页面(包括子列表)可能还未完全初始化完成,直接执行子列表操作会因DOM未就绪导致修改不生效。而控制台执行时页面已完全加载,所以操作正常。

修正后的代码

/**
 *@NApiVersion 2.0
 *@NScriptType ClientScript
 */

define(['N/currentRecord','N/log'], function(currentRecord,log) {
  function pageInit(context) {
    var newRec = context.currentRecord;
    var isConverted = newRec.getValue({
      fieldId: 'custbody15'
    });

    if (isConverted === true) {
      // 延迟执行,确保子列表完全初始化
      setTimeout(function() {
        var numLines = newRec.getLineCount({
          sublistId: 'item'
        });

        for (var i = 0; i < numLines; i++) {
          newRec.selectLine({
            sublistId: 'item',
            line: i
          });
          log.debug({title: 'Line Selected', details: i });

          newRec.setCurrentSublistValue({
            sublistId: 'item',
            fieldId: 'item',
            value: 836,
            ignoreFieldChange: false,
            forceSyncSourcing: true
          });

          newRec.commitLine({
            sublistId: 'item'
          });
          log.debug({title: 'Line Committed', details: i });
        }
        // 如需自动提交记录,可取消注释以下代码
        // newRec.save();
      }, 500); // 延迟时间可根据实际情况调整
    }
  }
  return {
    pageInit: pageInit
  };
});

关键修改点

  1. 添加延迟执行:用setTimeout将子列表操作延迟,确保页面完全加载后再执行
  2. 简化循环逻辑:直接使用i < numLines替代冗余的totalLines计算,减少出错概率
  3. 调整字段同步参数:
    • 将ignoreFieldChange改为false,触发字段变更的相关业务逻辑
    • 将forceSyncSourcing改为true,强制同步字段值到界面与后台
  4. 简化操作对象:直接使用newRec调用子列表方法,无需额外赋值(selectLine返回的就是当前currentRecord实例)

补充说明

  • 若500毫秒延迟不够,可适当延长时间(如1000毫秒)
  • 若业务需要自动提交记录,可在循环结束后调用newRec.save(),但需确保用户有相应权限且符合业务流程

内容的提问来源于stack exchange,提问作者F M FM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 13:17:16