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

SuiteScript 2.x定时脚本上传报错:需实现脚本类型函数求助

解决NetSuite定时脚本上传报错:SuiteScript 2.x entry point scripts must implement one script type function

问题描述

上传NetSuite定时脚本(Scheduled Script)时收到报错:

SuiteScript 2.x entry point scripts must implement one script type function

脚本已按要求实现execute入口函数,但无法完成上传测试。

错误分析及修复方案

以下是脚本中导致报错的关键问题及修复方式:

  • 缺失N/email模块依赖:catch块中调用了email.send(),但define的依赖数组未包含N/email,导致脚本加载异常,NetSuite无法识别入口函数。需在依赖数组中添加'N/email'。
  • 字符串未闭合:catch块中var body = 'There has been an error in ; 末尾单引号缺失,属于语法错误,导致脚本解析失败。需补全单引号,并建议添加错误详情。
  • record.save()调用错误:markAsSoldOut和inactivateItems函数中,调用record.save()时未传入加载的itemRecord对象,正确写法应为itemRecord.save()。
  • 履约状态判断逻辑错误:orderInfo.itemFulfillStatus是通过getText('shiprecvstatusline')获取的文本值,判断== 'true'不符合实际返回值,需改为匹配实际状态文本(如'Shipped'),或改用getValue获取内部状态编码。
  • 多余尾逗号:返回对象return { execute: execute, };中的尾逗号可能引发解析问题,建议移除。

修复后的完整脚本

/**
 * This script looks for originals sold, and marks the parent, child, 
 * and kit as sold out when the sales order is approved, 
 * and inactivates the parent, child, and kit when fulfilled.
 * 
 * @NApiVersion 2.x
 * @NScriptType ScheduledScript 
 * @NModuleScope SameAccount 
 */

define(['N/search', 'N/record', 'N/log', 'N/email'], function (search, record, log, email) {

  function createSoldOriginalSearch() {
    return search.create({
      type: "salesorder",
      filters: [
        ["type", "anyof", "SalesOrd"],
        "AND",
        ["item.custitemitemoriginal", "is", "T"],
        "AND",
        ["item.isinactive", "is", "F"],
        "AND",
        ["datecreated", "within", "lastmonth"]
      ],
      columns: [
        "statusref",
        "shiprecvstatusline",
        search.createColumn({
          name: "type",
          join: "item"
        }),
        search.createColumn({
          name: "formulatext",
          formula: "CASE WHEN {item.type}='Kit/Package' THEN SUBSTR({item.memberitem}, 0, 6) ELSE SUBSTR({item}, 0, 6) END"
        }),
        "internalid"
      ]
    });
  }

  function getAllResults(searchObj) {
    var start = 0;
    var allResults = [];
    var results = [];
    var resultSet = searchObj.run();

    results = resultSet.getRange({
      start: start,
      end: start + 1000
    });
    allResults = allResults.concat(results);

    while (results.length) {
      start += 1000;
      results = resultSet.getRange({
        start: start,
        end: start + 1000
      });
      allResults = allResults.concat(results);
    }

    return allResults;
  }

  function getOrderInfo(results, index) {
    var orderInfo = {};

    orderInfo.id = results[index].id;
    orderInfo.SOInternalId = results[index].getValue('internalid');
    orderInfo.masterItemNum = results[index].getValue('formulatext');
    orderInfo.SOStatus = results[index].getText('statusref');
    orderInfo.itemFulfillStatus = results[index].getText('shiprecvstatusline');

    return orderInfo;
  }

  function getItemIds(orderInfo) {
    var searchFilter = search.createFilter({
      name: 'itemid',
      operator: search.Operator.CONTAINS,
      values: orderInfo.masterItemNum
    });

    var inventorySearch = search.create({
      type: search.Type.ITEM,
      filters: [searchFilter],
      columns: ['internalid']
    });

    var itemSearchResults = inventorySearch.run().getRange({
      start: 0,
      end: 1000 // Change this value to retrieve more or fewer results.
    });

    return itemSearchResults;
  }

  function markAsSoldOut(orderInfo, itemId) {
    var itemRecord = record.load({
      type: record.Type.SERIALIZED_INVENTORY_ITEM, 
      id: itemId
    });

    if (orderInfo.SOStatus !== 'Pending Approval' && orderInfo.SOStatus !== 'Closed' && orderInfo.SOStatus !== 'Cancelled') {
      itemRecord.setValue({
        fieldId: 'custitemsold_out',
        value: true
      });
    }
    var saveSoldOut = itemRecord.save();
    return saveSoldOut;
  }

  function inactivateItems(orderInfo, itemId) {
    var itemRecord = record.load({
      type: record.Type.SERIALIZED_INVENTORY_ITEM, // Assuming you want to inactivate the item record
      id: itemId
    });

    // 替换为实际的已履约状态文本,比如'Shipped',根据你的NetSuite配置调整
    if (orderInfo.itemFulfillStatus === 'Shipped') {
      itemRecord.setValue({
        fieldId: 'isinactive',
        value: true
      });
    }

    var saveInactivate = itemRecord.save();
    return saveInactivate;
  }

  function execute(context) {
    try {
      var soldOriginalSearch = createSoldOriginalSearch();
      var results = getAllResults(soldOriginalSearch);
      log.debug('initial results', results);

      for (var i = 0; i < results.length; i++) {
        var orderInfo = getOrderInfo(results, i);
        log.debug('orderinfo', orderInfo);

        var itemResults = getItemIds(orderInfo);

        if (itemResults && itemResults.length > 0) {
          for (var j = 0; j < itemResults.length; j++) {
            var itemId = itemResults[j].getValue('internalid');

            var saveSoldOut = markAsSoldOut(orderInfo, itemId);
            var saveInactivate = inactivateItems(orderInfo, itemId);
          }
        }
      }
    } catch (e) {
        var subject = 'General Error in Scheduled Script';
        var body = 'There has been an error in the scheduled script: ' + e.message;
        var recipients = ['example@example'];

        email.send({
            author: 349571,
            recipients: recipients,
            subject: subject,
            body: body
        });
        log.error('Scheduled Script Error', e.message);
    }
  }
  
  return {
    execute: execute
  };
});

内容的提问来源于stack exchange,提问作者Kim Newman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 04:03:12