SuiteScript 2 email.send提示attachments类型错误?已传file.File数组
Troubleshooting "Wrong parameter type: options.attachments is expected as file.File[]" in NetSuite Email Send
我之前在NetSuite开发时也踩过这个一模一样的坑!明明调试器显示数组里的元素是file.File类型,系统却还是抛出类型错误,大概率是以下几个原因导致的,给你逐一分析解决方案:
1. Rendered对象只是结构匹配,并非真正的file.File实例
NetSuite的render.transaction()有时候会返回一个结构和file.File一致但原型链不匹配的对象——简单说就是“长得像File,但不是真正的File类实例”。NetSuite的类型检查是基于原型链的,所以即使属性都对,也过不了校验。
解决方法:转成真正的file.File实例
两种方式任选其一:
- 如果渲染后的文件已经有系统ID(看你的调试输出里
id是null,那这个方法可能不适用,跳过看第二个):var renderedFile = renderModule.transaction({ entityId: 479772, printMode: 'pdf', formId: 111 }); // 通过load获取真正的File实例 var actualFile = file.load({ id: renderedFile.id }); - 如果文件ID是null(临时生成未保存),用
file.create()重新构建:var renderedFile = renderModule.transaction({ entityId: 479772, printMode: 'pdf', formId: 111 }); // 获取文件内容并创建真正的File实例 var actualFile = file.create({ name: renderedFile.name, fileType: file.Type.PDF, contents: renderedFile.getContents() }); // 可选:如果需要永久保存到系统,可执行save // actualFile.folder = -1; // 指定文件夹ID,-1是根目录 // var savedFileId = actualFile.save();
2. 确认数组未被意外修改
虽然你的测试代码看起来没问题,但可以在调用email.send()前加一行调试代码,确认元素的构造函数:
console.log(options.attachments[0].constructor.name);
如果输出不是File,那说明确实是类型不匹配,回到上面的转换方法即可。
3. 检查SuiteScript版本兼容性
不同SuiteScript版本(比如2.0 vs 2.1)的render.transaction()返回值可能有差异。确认你的脚本版本对应的API文档,确保返回值是file.File类型。如果是SuiteScript 2.1,注意是否需要用异步写法,但你的代码看起来是同步的,这个可能性相对小一些。
修改后的完整测试代码示例
var renderedFile = renderModule.transaction({ entityId: 479772, //internal id of the transaction printMode: 'pdf', formId: 111 }); // 转换为真正的file.File实例 var actualFile = file.create({ name: renderedFile.name, fileType: file.Type.PDF, contents: renderedFile.getContents() }); var options = {}; options.author = 13136; options.recipients = 'jk@zognet.com'; options.replyTo = 'ar@cbcbev.com'; options.subject = 'test subject'; options.body = "test"; options.relatedRecords = {transaction:479772}; options.attachments = [ actualFile ]; emailModule.send(options);
内容的提问来源于stack exchange,提问作者jk121960
相关产品推荐
相关产品推荐

