NetSuite/Suitescript/Workflow:如何在单击按钮后从字段中打开 URL?

NetSuite/Suitescript/Workflow: How do I open a URL from a field after clicking button?

我有一个工作流,它在记录上添加一个按钮 "Open Link" 和一个名为 "URL" 的字段,其中包含指向 NetSuite 中附件的超链接。我想添加一个工作流操作脚本,用于在不同的页面中打开此 url。我已将脚本和工作流操作添加到工作流中。我的脚本:

function openURL() {  

var url = nlapiGetFieldValue('custbody_url');

window.open(url);    

} 

单击按钮后出现此脚本错误:“TypeError:找不到在对象 [object Object] 中打开的函数。

如何更改我的脚本以在字段中打开 URL?

(当我在控制台中尝试时,此功能有效)

谢谢!

您 运行 遇到的问题是工作流操作脚本在服务器端执行,因此您无法执行客户端操作,例如打开新选项卡。我建议使用用户事件脚本,它可以 "inject" 客户端代码进入按钮的 onclick 函数。

function beforeLoad(type, form) {
  var script = "window.open(nlapiGetFieldValue('custbody_url'))";
  form.addButton('custpage_custom_button', 'Open URL', script);
}

您希望它在查看或编辑记录时起作用吗?他们的脚本略有不同。我假设您希望按钮在查看记录时起作用,但我会编写它,即使在编辑文档时它也能起作用。

Netsuite 设置方式的难点在于它需要两个脚本,一个用户事件脚本和一个客户端脚本。 @michoel 建议的方式也可能有效......不过,我之前从未亲自通过文本插入过脚本。 也许我会在今天的某个时候尝试一下。

这是一个您可以使用的用户事件(虽然我自己还没有测试过,所以您应该 运行 在将它部署给每个人之前通过测试)。

function userEvent_beforeLoad(type, form, request)
{
    /*
    Add the specified client script to the document that is being shown
    It looks it up by id, so you'll want to make sure the id is correct
    */
    form.setScript("customscript_my_client_script");

    /*
    Add a button to the page which calls the openURL() method from a client script
    */
    form.addButton("custpage_open_url", "Open URL", "openURL()");    
}

将其用作用户事件脚本的 Suitescript 文件。将脚本页面中的加载前函数设置为userEvent_beforeLoad。确保将其部署到您希望其 运行 上的记录。

这是与之配套的客户端脚本。

function openURL()
{
    /*
    nlapiGetFieldValue() gets the url client side in a changeable field, which nlapiLookupField (which looks it up server side) can't do
    if your url is hidden/unchanging or you only care about view mode, you can just get rid of the below and use nlapiLookupField() instead
    */
    var url = nlapiGetFieldValue('custbody_url');

    /*
    nlapiGetFieldValue() doesn't work in view mode (it returns null), so we need to use nlapiLookupField() instead
    if you only care about edit mode, you don't need to use nlapiLookupField so you can ignore this
    */
    if(url == null)
    {
        var myType = nlapiGetRecordType();
        var myId = nlapiGetRecordId();
        url = nlapiLookupField(myType, myId,'custbody_url');
    }

    //opening up the url
    window.open(url);    
}

将其添加为客户端脚本,但不进行任何部署(用户事件脚本会为您将其附加到表单)。确保此脚本具有 ID customscript_my_client_script(或您在 form.setScript() 中的用户事件脚本中使用的任何脚本 ID),否则这将不起作用.

要记住的另一件事是,每条记录只能使用 form.setScript()(我认为?)附加一个脚本,因此您可能想为用户事件脚本和客户端脚本命名与您部署它的形式相关。使用 form.setScript 等同于在“自定义表单”菜单中设置脚本值。

如果你能让@michoel 的答案起作用,那最终可能会更好,因为你将所有逻辑都放在一个脚本中,这(从我的角度来看)可以更轻松地管理你的 Suitescripts。