在使用 SuiteScript 2.0 创建发票时如何传递要转换的日期

How can I pass a Date to trandate while creating an Invoice with SuiteScript 2.0

我创建了 RESTlet,它可以更轻松地通过具有多个输入和下拉菜单的简单网页创建新发票。我发送日期作为 D-M-YYYY 字符串使用 json 调用 invoiceInfo,日期字符串是 trandate 的值。
在我连接的脚本 (Suitescript 2.0) 上,我拆分了 trandate,然后创建了一个 Date 对象 (我使用 new Number 不是因为我的愚蠢,它只是工作只有这样)。然后我使用 format.format 将日期格式化为 Netsuite 所需的格式。之后,我使用格式化日期设置了 trandate 的值。

var splitedDate = invoiceInfo.trandate.split("-");
var dateObj = new Date(new Number(splitedDate[0]).valueOf(), (new Number(splitedDate[1]).valueOf()) - 1, new Number(splitedDate[2]).valueOf(), 0, 0, 0, 0);

var ffDate = format.format({
    value: dateObj,
    type: format.Type.DATE
});

invoiceRecord.setValue({
    fieldId: "trandate",
    value: ffDate,
    ignoreFieldChange: true
});

提交发票时(动态模式设置为真)我在第第83行收到错误,也就是这一行

invoiceRecord.setValue({ fieldId: "trandate", value: ffDate, ignoreFieldChange: true });

并得到这样的错误:

{
    "type": "error.SuiteScriptError",
    "name": "INVALID_FLD_VALUE",
    "message": "Invalid date value (must be D/M/YYYY)",
    "stack": ["anonymous(N/serverRecordService)", "<anonymous>(/SuiteScripts/Filip/_wystawianie_faktury_api.js:83)
    [...]

当我用 log.debug 检查它时,我得到这个:

"invoiceInfo.trandate" is (for example) "2019-03-15"

"dateObj" is "2019-03-15T07:00:00.000Z"

"ffDate" is "15/3/2019"

我尝试了很多选择,例如: -传递硬编码日期字符串“15/3/2019”我得到同样的错误; -我尝试了 setText 而不是 setValue 并得到了另一个错误; -我尝试在@HomeIcon -> Set Preferences 中更改日期格式,然后对所需格式进行硬编码,但它仍然无效;

感谢帮助

PS 我不太擅长在堆栈上写问题。我尽力了!

Invalid date value (must be D/M/YYYY)

这意味着 ffDate 不是日期对象。

首先要注意的几点

  1. record.setValue 要求值为 dateTime 对象。
  2. 如果您将无效的 dateTime 值传递给 format.format,它 returns option.value 不是 dateTime 对象。
  3. 如果你有一个日期对象,在使用之前不需要格式化它 record.setValue
  4. setText 要求字符串以用户格式正确格式化,因此最好使用 setValue,因为它会处理所有转换等。

所以我的建议是,您将 ISO 字符串中的日期传递给 RESTlet,它可以很容易地转换为 NetSuite 中的日期对象(使用 new Date()),然后将该对象直接传递给 record.setValue .

简单回答:

var splitedDate = invoiceInfo.trandate.split("-");
var dateObj = new Date(new Number(splitedDate[0]).valueOf(), (new Number(splitedDate[1]).valueOf()) - 1, new Number(splitedDate[2]).valueOf(), 0, 0, 0, 0);

invoiceRecord.setValue({
    fieldId: "trandate",
    value: dateObj,
    ignoreFieldChange: true
});

解释:日期字段的 setValue 接受 javascript DateObj,因此无需格式化。