开发者问题收集

SuiteScript TypeError:无法从未定义读取属性“firstname”

2022-08-16
790

我遇到了一个对我来说毫无意义的问题。我创建了一个自定义搜索,并使用该搜索的结果将 SelectOptions 添加到我添加的选择字段中。

但是,当我尝试简单地访问嵌套对象中的值时,我收到错误消息:TypeError:无法从未定义中读取属性“firstname”。

代码如下:

var sfPlayersSearch = search
      .create({
        id: 'customsearch_pm_sf_players_search',
        title: 'SF Players Search',
        type: search.Type.EMPLOYEE,
        columns: [
          'entityid',
          'firstname',
          'lastname',
          'custentity_pm_ws_sf_player',
        ],
        filters: ['custentity_pm_ws_sf_player', 'is', 'true'],
      })
      .run()
      .getRange(0, 100);


    log.debug({ title: 'SF Players', details: sfPlayersSearch });

    var player1ProxyField = form.addField({
      id: 'custpage_pm_ws_sf_player_1_proxy',
      label: 'Player 1 Proxy',
      type: ui.FieldType.SELECT,
    });

    var player2ProxyField = form.addField({
      id: 'custpage_pm_ws_sf_player_2_proxy',
      label: 'Player 2 Proxy',
      type: ui.FieldType.SELECT,
    });

    for (var i = 0; i < sfPlayersSearch.length; i++) {
      log.debug({title: 'Result', details: sfPlayersSearch[i].values.firstname});
      player1ProxyField.addSelectOption({ value: sfPlayersSearch[i], text: sfPlayersSearch[i].id });
    }

JSON 对象:

[
  [
    {
      "recordType": "employee",
      "id": "8",
      "values": {
        "entityid": "Artur X",
        "firstname": "Artur",
        "lastname": "X",
        "custentity_pm_ws_sf_player": true
      }
    },
    {
      "recordType": "employee",
      "id": "50",
      "values": {
        "entityid": "Darryl X",
        "firstname": "Darryl",
        "lastname": "X",
        "custentity_pm_ws_sf_player": true
      }
    },
    {
      "recordType": "employee",
      "id": "1983",
      "values": {
        "entityid": "Douglas X",
        "firstname": "Douglas",
        "lastname": "X",
        "custentity_pm_ws_sf_player": true
      }
    },
    {
      "recordType": "employee",
      "id": "86477",
      "values": {
        "entityid": "Paul X",
        "firstname": "Paul",
        "lastname": "X",
        "custentity_pm_ws_sf_player": true
      }
    }
  ]
]

非常感谢您的帮助。我尝试过执行 .values || {}.firstname,这没有返回任何错误,但也没有结果。

2个回答

Search.run().getRange() 返回 Result 对象数组。这些是您在 for 块中迭代的内容。 Result 对象不包含 values ,而是包含用于访问每个结果的值 ( getValue() ) 和文本 ( getText() ) 的方法。

log.debug({title: 'Result', details: sfPlayersSearch[i].values.firstname});.

更改为

log.debug({title: 'Result', details: sfPlayersSearch[i].getValue('firstname')});
Krypton
2022-08-16

虽然 @krypton 的答案对于您正在做的事情是正确的,但您可能会发现使用 Netsuite 的 JSONified 版本的搜索对象(如您在日志中看到的内容)很有用。

如果您将其编写为库文件,您可能希望在 Map/Reduce 中工作,则可以规范化搜索结果,如

.getRange(0, 100)
.map(function(sr){ 
    return JSON.parse(JSON.stringify(sr));
});

现在您的原始 values.firstname 代码就可以工作了。

有趣的事实。如果您使用的是 SS 2.1,则可以使用 let '、 const 和箭头函数:

const players = search.create()...
.getRange(0, 100)
.map(sr=>(JSON.parse(JSON.stringify(sr)));
bknights
2022-08-16