如何在Netsuite Saved Search中分组同值行并通过SuiteScript 2.0实现?
NetSuite Saved Search同值行聚合+SuiteScript 2.0 Suitelet实现方案
方案1:通过Saved Search原生配置实现同值行连续排列
无需脚本即可直接实现需求:
- 进入Saved Search编辑页面,切换到「Results」标签
- 在「Sort By」下拉框选择要聚合的字段(比如示例中的
Name字段),可选升序/降序,所有同字段值的行就会自动相邻排列 - 如果需要同聚合字段下再加次级排序规则,可在「Then By」下拉框添加其他字段(比如示例中的
Age字段)
配置后输出效果如下:
Name Age XYZ 21 XYZ 16 PQR 18 PQR 12 RST 28
方案2:SuiteScript 2.0 Suitelet中手动实现分组逻辑
如果需要通过脚本灵活控制分组规则,可按以下步骤实现:
步骤1:调用Saved Search获取原始结果
用N/search模块拉取Saved Search的全部结果,适配超过1000条数据的场景:
/** * @NApiVersion 2.x * @NScriptType Suitelet */ define(['N/search', 'N/ui/serverWidget'], function(search, serverWidget) { function onRequest(context) { if (context.request.method === 'GET') { // 替换为实际的Saved Search ID const targetSearch = search.load({ id: 'customsearch_your_search_id' }); const resultSet = targetSearch.run(); const allResults = []; // 分批拉取全部结果 let start = 0; do { const slice = resultSet.getRange({ start: start, end: start + 1000 }); allResults.push(...slice); start += 1000; } while (slice.length === 1000);
步骤2:按目标字段分组排序
手动对结果数组按指定字段做聚合排序,保证同值行连续:
// 按指定字段分组,示例为Name字段,可替换为实际需要聚合的字段ID const groupedMap = {}; allResults.forEach(res => { const groupKey = res.getValue({ name: 'name' }); if (!groupedMap[groupKey]) groupedMap[groupKey] = []; groupedMap[groupKey].push(res); }); // 把分组后的数据展开为连续数组,同值行相邻排列 const sortedResults = []; // 可自定义分组的排序规则,示例为按分组字段字典序排列 Object.keys(groupedMap).sort().forEach(key => { sortedResults.push(...groupedMap[key]); });
步骤3:将排序后的数据渲染到Suitelet页面
把处理好的结果绑定到Suitelet子列表展示即可:
// 创建页面和子列表 const form = serverWidget.createForm({ title: '分组数据列表' }); const dataSublist = form.addSublist({ id: 'custpage_data_list', type: serverWidget.SublistType.LIST, label: '数据列表' }); // 添加子列表展示字段 dataSublist.addField({ id: 'custpage_name', type: serverWidget.FieldType.TEXT, label: 'Name' }); dataSublist.addField({ id: 'custpage_age', type: serverWidget.FieldType.INTEGER, label: 'Age' }); // 填充排序后的数据 sortedResults.forEach((res, index) => { dataSublist.setSublistValue({ id: 'custpage_name', line: index, value: res.getValue({ name: 'name' }) }); dataSublist.setSublistValue({ id: 'custpage_age', line: index, value: res.getValue({ name: 'age' }) }); }); context.response.writePage(form); } } return { onRequest: onRequest }; });
如果需要支持用户动态选择分组字段,可在Suitelet页面添加下拉选择组件,用户选择后重新触发排序逻辑即可
内容的提问来源于stack exchange,提问作者Sayeesh
相关产品推荐
相关产品推荐

