You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用SuiteScript 2.0在发票记录沟通标签页附加定制高级PDF并触发邮件

SuiteScript 2.0 实现发票PDF附加与创建时邮件推送

核心思路

使用User Event脚本在发票记录创建完成后(afterSubmit触发),完成两个核心操作:

  1. 调用定制的高级PDF模板生成发票PDF
  2. 将PDF附加到发票的「沟通」标签页,并同步发送给客户

关键模块依赖

需要引入NetSuite的核心模块:

  • N/render:生成定制PDF
  • N/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 19:32:55