通过SuiteScript实现NetSuite数据集/工作簿自动导出为CSV
解决方案:已保存搜索与NetSuite数据集/工作簿版本衔接实现
核心逻辑
要实现已保存搜索(含SuiteQL查询)与数据集/工作簿的版本衔接,核心是建立版本映射关系、自动化同步机制和可追溯的文件管理规范,确保每次生成的CSV文件能对应到源查询版本,同时方便团队识别使用。
具体实现步骤
1. 制定版本标识与映射规则
- 给每个已保存搜索/SuiteQL查询分配唯一基础ID,比如
SRCH-1304(对应原脚本SEARCH_ID=1304)、SQL-ITEM(对应示例Item查询) - 版本命名规范:
[基础ID]-v[版本号]-[日期].csv,例:SRCH-1304-v1.2-20240520.csv - 创建NetSuite自定义记录(如
自定义记录:查询版本映射),存储关联信息:源查询ID、版本号、文件柜文件ID、生成时间、更新说明
2. 优化脚本实现版本化生成与关联
已保存搜索脚本(新增版本管理)
/** * @NApiVersion 2.x * @NScriptType ScheduledScript * @NModuleScope SameAccount */ define(['N/task', 'N/record'], function(task, record) { // 基础配置 var SEARCH_ID = 1304; var FOLDER_ID = 123; // 替换为目标文件柜文件夹ID var BASE_ID = 'SRCH-1304'; var CURRENT_VERSION = '1.2'; // 可从自定义记录读取或手动维护 function execute(scriptContext) { // 生成带版本标识的文件名 var dateStr = new Date().toISOString().slice(0,10).replace(/-/g,''); var fileName = `${BASE_ID}-v${CURRENT_VERSION}-${dateStr}.csv`; // 创建搜索任务 var searchTask = task.create({ taskType: task.TaskType.SEARCH }); searchTask.savedSearchId = SEARCH_ID; searchTask.fileName = fileName; searchTask.folderId = FOLDER_ID; var searchTaskId = searchTask.submit(); // 创建版本映射记录(实际场景可先检查任务完成状态,此处简化) var mappingRec = record.create({ type: 'customrecord_query_version_map', // 替换为你的自定义记录ID isDynamic: true }); mappingRec.setValue({fieldId: 'custrecord_source_id', value: SEARCH_ID}); mappingRec.setValue({fieldId: 'custrecord_base_id', value: BASE_ID}); mappingRec.setValue({fieldId: 'custrecord_version', value: CURRENT_VERSION}); mappingRec.setValue({fieldId: 'custrecord_create_date', value: new Date()}); // 任务完成后可通过task.Status获取实际文件ID并更新此字段 mappingRec.setValue({fieldId: 'custrecord_file_id', value: searchTask.fileId}); mappingRec.save(); } return { execute: execute }; });
SuiteQL脚本(新增版本管理)
/** * @NApiVersion 2.x * @NScriptType ScheduledScript * @NModuleScope SameAccount */ define(['N/task', 'N/record'], function(task, record) { // 基础配置 var BASE_ID = 'SQL-ITEM'; var CURRENT_VERSION = '2.0'; var FOLDER_ID = 123; // 替换为目标文件柜文件夹ID var SUITEQL_QUERY = 'SELECT * from item'; function execute(scriptContext) { // 生成带版本标识的文件名 var dateStr = new Date().toISOString().slice(0,10).replace(/-/g,''); var fileName = `${BASE_ID}-v${CURRENT_VERSION}-${dateStr}.csv`; // 创建SuiteQL任务 var mySuiteQLTask = task.create({ taskType: task.TaskType.SUITE_QL }); mySuiteQLTask.query = SUITEQL_QUERY; mySuiteQLTask.fileName = fileName; mySuiteQLTask.folderId = FOLDER_ID; var mySuiteQLTaskId = mySuiteQLTask.submit(); // 创建版本映射记录 var mappingRec = record.create({ type: 'customrecord_query_version_map', // 替换为你的自定义记录ID isDynamic: true }); mappingRec.setValue({fieldId: 'custrecord_source_type', value: 'SuiteQL'}); mappingRec.setValue({fieldId: 'custrecord_base_id', value: BASE_ID}); mappingRec.setValue({fieldId: 'custrecord_version', value: CURRENT_VERSION}); mappingRec.setValue({fieldId: 'custrecord_create_date', value: new Date()}); mappingRec.setValue({fieldId: 'custrecord_query_text', value: SUITEQL_QUERY}); // 任务完成后更新实际文件ID mappingRec.setValue({fieldId: 'custrecord_file_id', value: mySuiteQLTask.fileId}); mappingRec.save(); } return { execute: execute }; });
3. 数据集/工作簿的版本关联
- 数据集(Dataset):在数据集描述或自定义字段中填写对应
基础ID+版本号(如关联查询:SRCH-1304-v1.2),数据源直接引用文件柜中对应版本的CSV文件 - 工作簿(Workbook):在工作簿属性或工作表备注中注明关联的查询版本,确保团队打开时能明确数据源版本
4. 团队访问与版本追溯
- 给团队分配文件柜目标文件夹的读取权限,允许访问所有版本CSV文件
- 基于自定义记录创建已保存搜索,生成版本查询列表,展示所有查询版本、对应文件、生成时间,方便团队快速定位所需版本
内容的提问来源于stack exchange,提问作者Keith Fletcher
相关产品推荐
相关产品推荐

