如何使用SuiteScript 2.0在发票记录沟通标签页附加定制高级PDF并触发邮件
SuiteScript 2.0 实现发票PDF附加与创建时邮件推送
核心思路
使用User Event脚本在发票记录创建完成后(afterSubmit触发),完成两个核心操作:
- 调用定制的高级PDF模板生成发票PDF
- 将PDF附加到发票的「沟通」标签页,并同步发送给客户
关键模块依赖
需要引入NetSuite的核心模块:
N/render:生成定制PDFN/record:操作发票记录N/file:处理PDF文件对象N/email:发送客户邮件N/runtime:获取当前脚本/用户上下文
完整代码示例
/** * @NApiVersion 2.x * @NScriptType UserEventScript * @NModuleScope SameAccount */ define(['N/render', 'N/record', 'N/file', 'N/email', 'N/runtime'], function(render, record, file, email, runtime) { function afterSubmit(context) { // 仅在发票创建时触发,跳过编辑/复制等操作 if (context.type !== context.UserEventType.CREATE) return; var invoiceId = context.newRecord.id; var customTemplateId = 123; // 替换为你的定制高级PDF模板ID try { // 1. 生成定制高级PDF var pdfFile = render.transaction({ entityId: invoiceId, printMode: render.PrintMode.PDF, templateId: customTemplateId }); // 设置PDF文件属性,便于在沟通标签识别 pdfFile.name = `Invoice_${invoiceId}_${new Date().toISOString().slice(0,10)}.pdf`; pdfFile.folder = -4; // -4是NetSuite默认的「文件柜」根目录,可自行替换为指定文件夹ID pdfFile.isOnline = true; var savedFileId = pdfFile.save(); // 2. 将PDF附加到发票的沟通标签页 file.attach({ id: savedFileId, to: { type: record.Type.INVOICE, id: invoiceId }, ignorePermission: false }); // 3. 发送邮件给客户 var invoiceRecord = record.load({ type: record.Type.INVOICE, id: invoiceId, isDynamic: false }); var customerEmail = invoiceRecord.getValue({fieldId: 'email'}); var invoiceNumber = invoiceRecord.getValue({fieldId: 'tranid'}); var senderId = runtime.currentUser.id; // 用当前用户作为发件人,可替换为指定员工ID if (customerEmail) { email.send({ author: senderId, recipients: customerEmail, subject: `Your Invoice ${invoiceNumber} is Ready`, body: `Dear Customer,\n\nAttached is your latest invoice ${invoiceNumber}.\n\nBest regards,\nYour Team`, attachments: [savedFileId] // 附加生成的PDF }); } else { log.error('No Customer Email', `Invoice ${invoiceId} has no associated customer email`); } log.debug('Success', `PDF attached and email sent for Invoice ${invoiceId}`); } catch (e) { log.error('Error Processing Invoice', e.message + '\n' + e.stack); } } return { afterSubmit: afterSubmit }; });
关键注意事项
- 模板ID获取:进入定制的高级PDF模板页面,查看URL中的
id=XXX,替换代码中的customTemplateId - 权限配置:脚本需分配以下权限:
- 交易记录:发票(读写)
- 文件:文件柜(读写)
- 通信:发送邮件
- 文件夹ID:若需将PDF存入指定文件夹,可在文件柜中查看文件夹的内部ID替换
pdfFile.folder的值 - 邮件发件人:确保发件人用户在NetSuite中拥有「发送邮件」权限,且邮箱已验证
- 异常处理:代码中加入了异常捕获,可通过NetSuite的脚本日志排查问题
内容的提问来源于stack exchange,提问作者Maira S
相关产品推荐
相关产品推荐

