创建NetSuite Restlet提取供应商账单Communications标签页文件遇阻
解决方案:通过反向搜索文件记录实现需求
因为Communications标签下的Files静态子列表确实无法通过脚本直接访问,替代方案是从文件记录反向关联供应商账单——NetSuite的文件记录会存储其附加的父记录信息,我们可以基于这一点来实现需求。
具体步骤:
- 搜索所有附加到供应商账单的文件记录
- 从搜索结果中提取关联的供应商账单ID并去重
- 根据需要加载账单详情,同时获取文件的下载信息
SuiteScript 2.x 代码示例(Restlet)
/** * @NApiVersion 2.x * @NScriptType Restlet * @NModuleScope SameAccount */ define(['N/search', 'N/file'], function(search, file) { function getVendorBillsWithFiles() { // 搜索附加到供应商账单的文件 const fileSearch = search.create({ type: search.Type.FILE, filters: [ ['attachtotype', 'is', 'vendorbill'], 'AND', ['attachto', 'isnotempty', ''] ], columns: [ search.createColumn({name: 'attachto', label: '关联账单ID'}), search.createColumn({name: 'name', label: '文件名'}), search.createColumn({name: 'internalid', label: '文件ID'}), search.createColumn({name: 'url', label: '文件URL'}) ] }); const results = []; const processedBillIds = new Set(); // 用于去重账单 fileSearch.run().each(function(result) { const billId = result.getValue('attachto'); const fileId = result.getValue('internalid'); const fileName = result.getValue('name'); const fileUrl = result.getValue('url'); // 去重处理,每个账单只记录一次(如果需要保留所有文件可去掉此判断) if (!processedBillIds.has(billId)) { processedBillIds.add(billId); results.push({ vendorBillId: billId, attachedFiles: [{ fileId: fileId, fileName: fileName, downloadUrl: fileUrl }] }); } else { // 追加当前账单的其他文件信息 const billEntry = results.find(item => item.vendorBillId === billId); if (billEntry) { billEntry.attachedFiles.push({ fileId: fileId, fileName: fileName, downloadUrl: fileUrl }); } } return true; }); // 如需获取账单详细字段,可批量加载账单记录合并到结果中 /* const billSearch = search.create({ type: search.Type.VENDOR_BILL, filters: [['internalid', 'anyof', Array.from(processedBillIds)]], columns: ['tranid', 'trandate'] }); */ return JSON.stringify(results); } function downloadFile(requestParams) { // 接收文件ID参数,返回文件内容 const fileId = requestParams.fileId; if (!fileId) { return JSON.stringify({error: '缺少fileId参数'}); } try { const fileObj = file.load({id: fileId}); return { fileName: fileObj.name, fileContent: fileObj.getContents(), fileType: fileObj.fileType }; } catch (e) { return JSON.stringify({error: e.message}); } } return { get: getVendorBillsWithFiles, post: downloadFile }; });
注意事项:
- 脚本需要配置文件和供应商账单的读取权限,同时确保脚本有权限访问目标文件(比如私有文件需要脚本所属角色有对应权限)
- 文件的
url字段生成的链接需要用户登录NetSuite后才能访问;如果需要无登录下载,可通过Restlet返回文件内容,由前端处理下载逻辑 - 若账单或文件数量较大,建议使用
search.runPaged()分页搜索,避免性能问题
内容的提问来源于stack exchange,提问作者SRHY15
相关产品推荐
相关产品推荐

