netsuite - Suitescript 2.0 从 Suitelet 文件字段中获取文件内容并在预定脚本中使用数据
问题描述
我在工单记录上创建了一个按钮,该按钮打开一个带有 fieldType.FILE 的套件表单,以允许用户在本地选择一个文件。提交 Suitlet 后,我希望脚本获取文件、获取内容,然后将两个数组传递给预定脚本。到目前为止,我没有任何错误,并且我的 log.debugs 都没有出现在 Netsuite 中。
这是供参考的套件代码:
/**
* @NApiVersion 2.x
* @NScriptType Suitelet
*
* @author MF
*/
define(['N/ui/serverWidget', 'N/file', 'N/search', 'N/email','N/ui/dialog'], function (serverWidget, file, search, email, dialog) {
function onRequest(context) {
//getWoData(context);
buildPage(context);
};
function buildPage(context) {
var woForm = serverWidget.createForm({
title: "Mass Update Work Order Due Dates",
})
woForm.addField({
id: 'custpage_wo_export',
label: "Work Order Update File",
type: serverWidget.FieldType.FILE
});
woForm.addSubmitButton({
id: 'custpage_submitwo',
label: 'Submit',
functionName: 'SubmitWorkOrders'
});
woForm.clientScriptModulePath = "SuiteScripts/WoSubmitClient.js"
context.response.writePage(woForm);
}
return {
onRequest: onRequest
};
});
据我所知,问题始于客户。这是上面 Suitelet 的客户端脚本:
/**
* @NApiVersion 2.X
* @NScriptType ClientScript
* @NModuleScope SameAccount
* @author MF
*/
define(['N/url', 'N/https','N/currentRecord'], function (url, https, currentRecord) {
function pageInit(context) { };
function SubmitWorkOrders(context) {
var objRecord = currentRecord.get();
//Handle the save button
log.debug({
title: 'SubmitWorkOrders',
details: "This function was called"
})
var uploadedFile = objRecord.getValue({
fieldId: 'custpage_wo_export'
})
log.debug({
title: 'File',
details: uploadedFile.name
})
var taskCreate = url.resolveScript({
scriptId: 'customscript_scheduledscripttaskagent',
deploymentId: 'customdeploy_scheduledscripttaskagent',
returnExternalUrl: false,
params: {
input_file: uploadedFile
}
});
}
return {
pageInit: pageInit,
saveRecord: SubmitWorkOrders
};
});
然后,此客户端脚本调用另一个套件来创建和运行任务。
/**
* @NApiVersion 2.x
* @NScriptType Suitelet
*
* @author MF
*/
define([
'N/task',
'N/redirect',
'N/file'
], function (task, redirect, file) {
function scriptTask(context) {
//check file type
var input_file = context.request.params.input_file;
log.debug({
title: 'File Name',
details: input_file.name
})
var woUpdateScriptTask = task.create({
taskType: task.taskType.SCHEDULED_SCRIPT,
deploymentId: 'customscript_womassupdate',
params: { uploadedFile: uploadedFile },
scriptId: 715
}).submit();
}
return {
onRequest: scriptTask
};
});
任何建议都将不胜感激,我只在 Netsuite 领域呆了几个星期,而 javascript 通常只比这长一点。请注意,其中一些脚本中存在一些来自测试不同方法的残留模块。
目前整个过程看起来像这样 -> (1)Work Orders 上的UserEventScript -> (2)Work Orders 上的ClientScript -> (3)首先附加 Suitelet -> (4)ClientScript for Suitelet -> (5)Suitelet 创建运行预定脚本的任务 -> (6)ScheduledScript 更新工单。希望获得一些关于从第 3 步到第 5 步获取文件内容的建议,以便在将数据传递给预定脚本之前对其进行解析。
提前致谢
解决方案
我认为这是您如何将文件内容从您的第一个 Suitelet 获取到您的计划脚本的方法:
首先,您需要将您的第一个和第二个 Suitelet 组合成一个 Suitelet。这是获取选定文件所必需的。您可以在您的第一个 Suitelet > 函数 onRequest() 中简单地这样做:
function onRequest(context) {
if (request.method == 'GET') { //This block will execute when you open your Suitelet form
buildPage(context);
}else{ //This block will execute when Submit button is clicked
scriptTask(context); // add scriptTask() function body in your 1st Suitelet from 2nd Suitelet
}
};
其次,如果您的客户端脚本附加了 Suitelet,您可以在 Web 浏览器的控制台中使用console.log而不是log.debug查看它的日志(使用 Ctrl+Shift+i 打开)。但是在你的 CS 中获取 'custpage_wo_export' 的值只会返回一个像 'C:\fakepath\your_file_name.file_extension' 这样的字符串。您可能需要先将所选文件保存在 NetSuite 的文件柜中才能访问其内容。这可以在您的第一个 Suitelet 中的函数 scriptTask() 中完成。
在客户端脚本 > 函数 SubmitWorkOrders() 中,使用:
function SubmitWorkOrders(context) {
var objRecord = context.currentRecord;
var uploadedFile = objRecord.getValue({
fieldId: 'custpage_wo_export'
})
console.log('File', uploadedFile);
return true; //use return 'false' to view the log in console first
}
现在第三,在函数 scriptTask() 中,现在在第一个 Suitelet 中,使用:
function scriptTask(context) {
if (context.request.files.custpage_wo_export) {
var fileObj = context.request.files.custpage_wo_export; //save this fileObj and then access it's contents.
log.debug('fileObj', fileObj);
fileObj.folder = 1630; //speficy the id of folder in File Cabinet
var fileId = fileObj.save();
log.debug("fileId", fileId);
//Now, load newly saved file and access it's contents. You can also access file contents in your Scheduled script depending on what you prefer/require.
if (fileId) {
var fileObj = file.load({
id: fileId
});
fileContents = fileObj.getContents();
log.debug("fileContents", fileContents);
/*
Now, you have fileId and/or fileContents. You can execute your Scheduled script here using task.create() etc.
*/
}
}
}
注意:在文件柜中选择和上传/保存相同的文件只会覆盖现有文件,保持文件 ID 相同。
推荐阅读
- android - 在Android中通过字符串名称获取类以避免重复自己
- c++ - 从 'char' 到 'const char*' [-fpermissive] 错误的无效转换
- reporting-services - SSRS 报表生成器 - 显示一个表中的所有汇总行和关联的数据行
- javascript - 如何从按钮中提取名称(jQuery 导航)?
- node.js - 如何在特定模型下使用节点js在mongodb中上传图像
- java - java - 通过正则表达式过滤日志文件
- python - 列表循环中的函数没有在python中一一运行
- database - 为什么数据被两次添加到同一个表中?
- c# - 错误 CS0246:找不到类型或命名空间名称“节点”(您是否缺少 using 指令或程序集引用?)
- r - 为什么来自 shinycssloaders 的 R Shiny Loading Spinner 没有出现