如何在NetSuite Suitelet子列表中添加编辑/查看操作列?
解决方案:NetSuite Suitelet子列表添加编辑/查看操作列
一、核心思路梳理
你的需求是在Suitelet子列表中为每行添加编辑和查看按钮,当前方向有可取之处,但存在几个关键问题需要调整:
- 尝试用URL字段实现VIEW,但未正确生成跳转链接;
- Client Script的字段变更逻辑有语法错误,页面跳转逻辑不严谨;
- Suitelet中
Response.writePage(form)的执行顺序错误,导致部分表单设置和数据填充不生效; - 自定义记录创建时存在字段赋值重复错误。
二、分步修改方案
1. Suitelet脚本调整
主要修改点:
- 调整表单构建顺序,将
Response.writePage(form)移到所有字段、子列表、数据填充完成后执行; - 为子列表添加VIEW和EDIT两个URL字段,用
url.resolveRecord生成原生记录的查看/编辑链接; - 修复自定义记录创建时的字段赋值错误(两次设置
custrecord_advs_first_name,需改为custrecord_advs_last_name); - 在define数组中添加
N/url模块,用于生成跳转链接。
修改后的Suitelet关键代码片段:
/** *@NApiVersion 2.x *@NScriptType Suitelet */ // 添加N/url模块 define(['N/record','N/ui/serverWidget','N/redirect','N/runtime','N/search','N/url'],function(record,serverWidget,redirect,runtime,search,url){ function onRequest(context){ var Request = context.request; var Response = context.response; if(Request.method == 'GET') { var form=serverWidget.createForm({title:"Customer entry Suitelet"}); var primaryinfo=form.addFieldGroup({ label:'Primary Information', id:'custpage_advs_primary_info', }); // ... 保留原有字段创建逻辑 ... var mysublist = form.addSublist({ id: 'custpage_advs_sublistid', type: serverWidget.SublistType.LIST, label:'My Sublist' }); // ... 保留原有子列表字段创建逻辑 ... // 添加VIEW和EDIT操作列 mysublist.addField({ id: 'custpage_advs_sublist_view', type: serverWidget.FieldType.URL, label: 'VIEW' }); mysublist.addField({ id: 'custpage_advs_sublist_edit', type: serverWidget.FieldType.URL, label: 'EDIT' }); var submit=form.addSubmitButton({ id : 'custpage_advs_submit_record', label : 'Submit' }); // 设置客户端脚本 form.clientScriptFileId = 91370; var fnameValue = Request.parameters.custparam_first_name; var lnameValue = Request.parameters.custparam_last_name; var emailValue = Request.parameters.custparam_email; var phoneValue = Request.parameters.custparam_phone; log.debug("param from clientScript "+fnameValue); if(fnameValue){ firstname.defaultValue =fnameValue; var fnamecustomerSearch = search.create({ type:'customrecord_advs_customer_entry_form', filters:['custrecord_advs_first_name',"startswith",fnameValue], columns:[ search.createColumn({name: "name"}), search.createColumn({name: "custrecord_advs_first_name"}), search.createColumn({name: "custrecord_advs_last_name"}), search.createColumn({name: "custrecord_advs_email"}), search.createColumn({name: "custrecord_advs_phone"}), search.createColumn({name: "internalid"}), search.createColumn({name: "id"}) ] }); var counter = 0; fnamecustomerSearch.run().each(function(result) { var oldfullname = result.getValue('name'); var InternalidVal = result.getValue('internalid'); var firstname=result.getValue('custrecord_advs_first_name'); var lastname=result.getValue('custrecord_advs_last_name'); var email=result.getValue('custrecord_advs_email'); var phone=result.getValue('custrecord_advs_phone'); // 生成VIEW和EDIT的跳转链接 var viewUrl = url.resolveRecord({ recordType: 'customrecord_advs_customer_entry_form', recordId: InternalidVal, isEditMode: false }); var editUrl = url.resolveRecord({ recordType: 'customrecord_advs_customer_entry_form', recordId: InternalidVal, isEditMode: true }); // 设置子列表基础字段值 mysublist.setSublistValue({id: 'custpage_advs_sublist_internalid', line: counter, value: InternalidVal}); mysublist.setSublistValue({id: 'custpage_advs_sublist_fullname', line: counter, value:oldfullname}); mysublist.setSublistValue({id: 'custpage_advs_sublist_fname', line: counter, value: firstname}); mysublist.setSublistValue({id: 'custpage_advs_sublist_lname', line: counter, value: lastname}); mysublist.setSublistValue({id: 'custpage_advs_sublist_email', line: counter, value: email}); mysublist.setSublistValue({id: 'custpage_advs_sublist_phone', line: counter, value:phone}); // 设置VIEW和EDIT链接,同时设置显示文本 mysublist.setSublistValue({id: 'custpage_advs_sublist_view', line: counter, value: viewUrl, text: 'VIEW'}); mysublist.setSublistValue({id: 'custpage_advs_sublist_edit', line: counter, value: editUrl, text: 'EDIT'}); counter++; return true; }); } // 最后写入页面,确保所有设置生效 Response.writePage(form); } else { var Fname= Request.parameters.custpage_advs_first_name; var Lname=Request.parameters.custpage_advs_last_name; var Email=Request.parameters.custpage_advs_email; var Phone=Request.parameters.custpage_advs_phone; var Fullname=Fname+' '+Lname; var customRecord=record.create({ type:'customrecord_advs_customer_entry_form', isDynamic:true, }); customRecord.setValue({ fieldId:'name', value:Fullname }); customRecord.setValue({ fieldId:'custrecord_advs_first_name', value:Fname }); // 修复字段赋值错误 customRecord.setValue({ fieldId:'custrecord_advs_last_name', value:Lname }); customRecord.setValue({ fieldId:'custrecord_advs_email', value:Email }); customRecord.setValue({ fieldId:'custrecord_advs_phone', value:Phone }); var recordId=customRecord.save({ enableSourcing: false, ignoreMandatoryFields: false }); redirect.toSuitelet({ scriptId: 'customscript_advs_ss_customersuitelet', deploymentId: 'customdeploy_advs_ss_customersuitelet', }); } } return{ onRequest:onRequest } });
2. Client Script优化
主要修改点:
- 修复语法错误(函数内代码块闭合错误);
- 移除不必要的alert提示;
- 确保跳转URL变量在有效场景下才生成,避免报错;
- 调整跳转的脚本ID为当前Suitelet的ID,避免跳错页面。
修改后的Client Script:
/** * @NApiVersion 2.0 * @NScriptType ClientScript */ define(['N/currentRecord','N/url'],function(currentRecord,url){ function fieldChanged(context) { var recordObj = context.currentRecord; var fieldId = context.fieldId; if (fieldId === 'custpage_advs_first_name'){ var fnameValue = recordObj.getValue({fieldId:'custpage_advs_first_name'}); if(fnameValue){ var suiteUrl = url.resolveScript({ scriptId: 'customscript_advs_ss_customersuitelet', deploymentId: 'customdeploy_advs_ss_customersuitelet', returnExternalUrl: false, params : { custparam_first_name : fnameValue } }); setWindowChanged(window, false); window.location = suiteUrl; } } } return { fieldChanged: fieldChanged }; });
三、关键注意事项
- 确保用户拥有自定义记录
customrecord_advs_customer_entry_form的查看和编辑权限,否则链接会报错; - 如果需要在Suitelet内直接处理编辑逻辑(不跳转到原生记录页面),可以在Suitelet中添加
custparam_edit_id参数,通过GET请求传递要编辑的记录ID,然后预填表单字段; - 测试时要验证子列表的VIEW/EDIT链接是否正确跳转,以及搜索过滤逻辑是否正常生效。
内容的提问来源于stack exchange,提问作者Abdul bazith
相关产品推荐
相关产品推荐

