NetSuite/Suitescript/Workflow: как открыть URL из поля после нажатия кнопки?
У меня есть рабочий процесс, который добавляет кнопку "Открыть ссылку" и поле записи "URL", которое содержит гиперссылку на вложение в NetSuite. Я хочу добавить сценарий действия рабочего процесса, который открывает этот URL на другой странице. Я добавил сценарий и действие рабочего процесса в рабочий процесс. Мой сценарий:
function openURL() {
var url = nlapiGetFieldValue('custbody_url');
window.open(url);
}
Я получаю эту ошибку сценария после нажатия кнопки: "Ошибка типа: Не удается найти функцию, открытую в объекте [объект Object].
Как я могу изменить свой скрипт, чтобы он открывал URL в поле?
(Эта функция работает, когда я пытаюсь в консоли)
Спасибо!
2 ответа
Вы хотите, чтобы это работало, когда запись просматривается или редактируется? У них немного разные сценарии. Я предполагаю, что вы хотите, чтобы кнопка работала при просмотре записи, но я напишу ее так, чтобы она работала даже при редактировании документа.
Сложность в том, как 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);
}
Добавьте его в качестве клиентского сценария, но не выполняйте никаких развертываний (сценарий пользовательских событий прикрепит его к форме). Убедитесь, что этот сценарий имеет идентификатор customscript_my_client_script (или любой другой идентификатор сценария, который вы использовали в сценарии пользовательских событий в form.setScript()), иначе это не будет работать.
Следует также помнить, что к каждой записи может быть добавлен только один сценарий, используя form.setScript() (я думаю?), Поэтому вы можете присвоить заголовку сценария пользовательских событий и клиентского сценария что-то, связанное с развертываемой формой. это на. Использование form.setScript эквивалентно установке значения сценария, когда вы находитесь в меню "Настройка формы".
Если вы можете заставить работать ответ @ michoel, это может оказаться лучше, потому что вы сохраняете логику в одном скрипте, который (с моей точки зрения) облегчает управление вашими скриптами.
Проблема, с которой вы сталкиваетесь, заключается в том, что сценарии действий рабочего процесса выполняются на стороне сервера, поэтому вы не можете выполнять такие действия на стороне клиента, как открытие новой вкладки. Я бы предложил использовать скрипт пользовательских событий, который может "внедрить" клиентский код в функцию нажатия кнопки.
function beforeLoad(type, form) {
var script = "window.open(nlapiGetFieldValue('custbody_url'))";
form.addButton('custpage_custom_button', 'Open URL', script);
}