ServiceNow - 開發
ServiceNow 提供了許多內建功能和應用程式,我們可以輕鬆地使用它們在任何組織中實施 ITSM。同時,也存在設定不同流程和功能的業務需求。ServiceNow 高度可定製,開發人員可以使用 Javascript 原理輕鬆建立基於客戶需求的應用程式和模組。
Javascript 是 ServiceNow 指令碼編寫的必備語言。在本節中,我們將為您概述 ServiceNow 開發。
應用程式建立概述
ServiceNow 提供了一個名為“Studio”的應用程式,您可以在其中建立新的應用程式、提供原始碼、為您的應用程式建立新表等。“Studio”提供了一個引導式且易於使用的介面來建立新的應用程式。讓我們為 BookWorm 有限公司以下案例建立一個新的應用程式。
前端 IT 團隊需要一個 ServiceNow 應用程式,管理員可以在其中釋出輪班排班表(輪班輪換)。每個員工都有 6 小時的輪班,團隊必須提供 24x7 的支援。
從導航器轉到 Studio,將開啟一個新視窗。單擊“建立應用程式”。系統將提示您輸入應用程式名稱和描述。最後,單擊“建立”。
您將在下面找到應用程式頁面。現在,是時候為我們的應用程式建立表格了。轉到“建立應用程式檔案”。
在“資料模型”下單擊“表格”,然後單擊“建立”。系統將提示您輸入新表格的詳細資訊。輸入表格的名稱,並將其餘詳細資訊保留為預設值。
現在向下滾動並開始定義這些表格的列。我們有以下列定義,需要注意的重要一點是,我們在“成員”列中選擇了 sys_user 的引用。
現在,單擊“輪班”列,然後選擇“建立選擇列表”,因為在這裡,我們將建立輪班的選擇,例如 6:00-12:00、12:00-18:00、18:00-24:00 和 24:00-6:00。
因此,現在我們已經建立了應用程式中的表格,它在 Studio 中看起來像這樣。
Studio 已自動為我們建立了表單、列表、模組和應用程式選單。我們可以從“建立應用程式檔案”選項建立其他模組、表格、UI 等,就像我們為建立 ROTA 表格所做的那樣。
現在讓我們看看我們的應用程式在 ServiceNow 中的樣子。在導航欄中搜索 Frontend_IT_ROTA,然後轉到我們的新模組。
讓我們繼續在我們的應用程式中新增一些新的 ROTA 記錄。單擊“新建”按鈕。
UI 策略和操作
ServiceNow 將 UI 策略定義為一種工具,透過它我們可以動態地更改表單上資訊的顯示行為,並控制任務的自定義流程。另一方面,UI 操作用於使 UI 更加互動式、定製化以及特定於使用者活動。讓我們透過一個例子來理解這一點。
假設,我們必須以這樣一種方式配置“事件”表單:如果任何事件被分配給“前端 IT 團隊”分配組,則“服務”欄位應變為不可見,“配置項”應被停用。此處的 UI 策略是:“如果選擇的分配組是前端 IT 團隊”,而此處的 UI 操作是:“服務”欄位應變為不可見,“配置項”欄位應被停用”。
UI 操作可以透過易於使用的介面實現,也可以透過客戶端指令碼實現。編寫客戶端指令碼將幫助我們在欄位中執行高階操作。我們還將在本節後面演示客戶端指令碼。
這裡需要注意的重要一點是,UI 操作更快,並且首先執行,然後是客戶端指令碼。讓我們為我們的用例建立一個 UI 策略和操作。從導航欄開啟“系統 UI”應用程式下的“UI 策略”模組,然後單擊“新建”按鈕。
輸入表格的名稱,在本例中為“事件”。將應用程式保留為“全域性”。如果您找不到“全域性”選項,請導航到右上角的齒輪,然後從“開發人員”選項卡中選擇應用程式為“全域性”。
現在,開始在下一部分中輸入條件。在本例中,它將是“分配組是前端 IT 團隊”。接下來,有一些複選框,如下所示:
全域性 - 如果您希望全域性實施 UI 策略,則選中此項。
載入時 - 如果您希望每次頁面重新整理時都執行 UI 策略,則選中此項。
如果為假則反轉 - 如果您希望在更改條件時反轉我們建立的所有操作,則選中此項。
繼承 - 如果您希望擴充套件指定表格的表格繼承此 UI 策略,則選中此項。
填寫所有必需的詳細資訊,然後按提交。
現在,再次開啟 UI 策略,您將找到輸入 UI 操作的選項。讓我們根據我們的用例提供 UI 操作。單擊 UI 操作部分中的“新建”按鈕。
我們將為“服務”和“配置項”欄位選擇以下操作。
單擊“提交”以確認您的 UI 操作,最後單擊“更新”以儲存 UI 策略中的更改。您現在可以轉到事件表單並驗證您的 UI 策略和操作。
ServiceNow 指令碼編寫
ServiceNow 中有兩種型別的指令碼編寫,即客戶端和伺服器端。伺服器端指令碼編寫意味著處理在 Web 伺服器上進行,而客戶端指令碼編寫意味著處理在使用者的計算機上進行。每種型別的指令碼都可以完成特定的任務。讓我們討論這兩種指令碼的示例:
客戶端指令碼編寫
客戶端指令碼編寫可用於各種場景,例如填充表單欄位中的某些預設值、顯示某些警報訊息、根據使用者在表單中另一個欄位中的響應設定一個欄位中的值、更改選擇列表等。主要有三種類型的客戶端指令碼。
Onload() - 當表單載入時執行。
Onchange() - 當表單中特定欄位更改時執行。
Onsubmit() - 當表單提交時執行。
讓我們為兩個用例建立一個客戶端指令碼。在我們新的應用程式“前端 IT 團隊 ROTA”中,我們將實現一個警報“請每週使用一次此應用程式來設定輪班輪換”,一旦應用程式載入。然後,如果選擇的輪班時間為 24:00-6:00,我們將顯示一條警報“成員有權獲得輪班津貼”。
導航到 Studio 模組,開啟應用程式,然後單擊“建立應用程式”檔案。然後,在客戶端開發選項下選擇客戶端指令碼,並提供如下所示的必要詳細資訊:
向下滾動並提供指令碼。我們將提供如下所示的警報。
Function onLoad() {
alert (“Please use this application once a week to set the shift rotation”);
}
單擊“提交”並載入您的新應用程式以檢視結果。
現在,讓我們實現下一個用例。在這裡,我們將使用 onChange。onChange 函式由 ServiceNow 自動傳遞 5 個引數。
Control - 為其配置客戶端指令碼的欄位
OldValue - 載入表單時(更改之前)欄位的值。
newValue - 更改後欄位的值。
isLoading - 布林值,指示更改是否作為表單載入的一部分發生。如果更改是由於表單載入,則值為 true。當表單載入時,表單上的所有欄位值都會更改。
isTemplate - 布林值,指示發生的更改是否由於模板填充欄位而導致。如果更改是由於模板填充,則值為 true。
function onChange(control, oldValue, newValue, isLoading, isTemplate) {
if (isLoading || newValue === '12am-6pm') {
alert("The member is entitled for shift allowance");
return;
}
}
Glideform (g_form) 類
glideform 是用於控制表單和表單欄位的類。我們可以執行諸如隱藏欄位的值、根據其他欄位的響應設定欄位的值、向選擇列表新增欄位等任務。
glideform 類附帶許多方法。一些重要的方法包括 addOption()、clearOptions()、showFieldMsg()、clearMessages()、clearValue()、setValue() 等。
讓我們在事件表單中建立一個客戶端指令碼,如果選擇的分配組是前端 IT 團隊,則在描述欄位中填充一些訊息。轉到 UI 策略並建立一個新的策略。在“應用位置”部分中將條件設定為“分配組是前端 IT 團隊”。
提交 UI 策略,再次開啟它,然後單擊“高階檢視”。稍後,您將找到提供指令碼的選項。
指令碼將自動使用 onCondition() 函式填充。一旦滿足我們在 UI 策略中給出的條件,onCondition 函式將自動執行。另一個需要注意的是,有兩個指令碼,“如果為真則執行”和“如果為假則執行”。
“如果為真則執行”指令碼將在條件匹配時執行,如果我們更改欄位中的值,以至於我們提到的條件不再滿足,則“如果為假則執行”指令碼將執行。
讓我們為兩者編寫一個指令碼。在這裡,我們將使用 setValue 和 clearValue 方法。要獲取需要在指令碼中提到的欄位名稱,請開啟事件表單,右鍵單擊所需的欄位,您可以在“顯示 - <欄位名稱>”格式中找到欄位名稱。
如果為真指令碼
function onCondition() {
g_form.clearValue('description');
g_form.setValue(‘description’,'**Please mention server name, instance name and error code**');
}
如果為假指令碼
function onCondition() {
g_form.clearValue('description');
}
現在,開啟事件表單並檢查結果。
伺服器端指令碼編寫
伺服器端指令碼在 ServiceNow 伺服器或資料庫上執行。伺服器端指令碼編寫有兩個類別:
業務規則
指令碼包含
讓我們逐一檢視每個類別。
業務規則
業務規則模組可以在“系統定義”應用程式中找到。要建立業務規則,請單擊“新建”。我們可以使用具有簡單下拉介面的業務規則操作來建立簡單的業務規則。
您可以使用業務規則操作來設定欄位的值或在表單中新增訊息。我們可以選擇何時執行業務規則,如下所示:
之前 - 業務規則中的邏輯在資料庫操作之前執行
之後 - 業務規則中的邏輯在資料庫操作之後執行
非同步 (Async) − 非同步業務規則在資料庫操作發生後執行其邏輯,但排程程式會盡快將任務排入佇列,但不一定立即在資料庫操作後執行。
顯示 (Display) − 顯示業務規則在表單載入以及從資料庫載入記錄時執行其邏輯。
我們還可以選擇業務規則應該執行的資料庫操作。讓我們在上一節中建立的“前端IT團隊輪班安排”應用程式中建立一個業務規則操作。
如果輪班時間是凌晨12點到凌晨6點,我們必須將“備註”欄位的值設定為“監控XO887批處理作業”。 命名為 `frontend_it_rota` 表。在“何時執行”選項卡中,設定條件為輪班時間為凌晨12點到凌晨6點,並選中“插入”和“更新”複選框。
在“操作”選項卡中,為備註欄位設定您的條件。
我們還可以在此業務規則中新增自定義指令碼。要開始編寫自定義指令碼,請選中“高階”複選框,您將看到一個新的“高階”選項卡來編寫指令碼。
讓我們編寫一個指令碼,在未提供成員、時間或日期欄位時中止插入事務。我們將為此目的使用“當前”和“先前”物件。
(function executeRule(current, previous /*null when async*/)) {
if((current.member = ' ') || (current.date = ' ') || (current.shift = ' '){
current.setAbortAction(true);
}
}
指令碼包含 (Script Include)
使用指令碼包含,我們可以編寫自定義函式或類,然後根據需要在其他指令碼中多次使用它們。它們是一種可重用的指令碼;我們可以在其他客戶端或伺服器端指令碼中使用它們。但是,只有在其他指令碼顯式呼叫時,它們才會執行。要建立一個新的指令碼包含,我們有一個名為“指令碼包含”的模組,位於“系統定義”應用程式下。單擊“新建”以建立一個新的指令碼包含。
在指令碼包含表單中,提供指令碼包含的名稱。“API名稱”欄位是指令碼包含的內部名稱,當從其他應用程式呼叫此指令碼包含時使用。如果您想在客戶端指令碼中使用此指令碼包含,請選中“客戶端可呼叫”複選框。在“應用程式”中,指定此指令碼使用的應用程式。在“可訪問範圍”欄位中,指定應用程式範圍。
讓我們為“前端IT團隊輪班安排”應用程式中的以下案例編寫一個指令碼。首先,我們將編寫一個指令碼包含,它將檢查任何欄位中的無效字元。我們將定義一個函式,該函式將字串作為引數,並根據字串中的字元返回true或false。
我們將在業務規則指令碼中使用此函式來驗證在提交表單時,“前端IT團隊輪班安排”應用程式中的“成員(姓名)”欄位中給定的值是否沒有任何無效字元。
開啟指令碼包含模組,以下是我們將使用的指令碼。(此處應插入實際指令碼程式碼)
function validatefieldcharacters(fieldinput) {
var validcharacters = /^[a-zA-Z]+$/;
if(fieldinput.value.match(validcharacters)) {
return true;
} else {
return false;
}
}
現在,讓我們編寫業務規則指令碼以驗證“成員”欄位。開啟業務規則模組併為我們的應用程式“前端IT團隊輪班安排”建立一個新的業務規則。
var memberfieldstatus = validatefieldcharacters(current.member)
if(memberfieldstatus == false) {
gs.addErrorMessage(" Special characters not allowed in member field");
current.setAbortAction(true);
}
除錯
如果我們的指令碼未按預期執行,或者我們遇到某些錯誤,我們可以使用各種除錯技術。讓我們討論各種除錯客戶端和伺服器端指令碼的方法。
除錯客戶端指令碼
除錯客戶端指令碼的最佳方法是參考日誌。JavaScript 提供了 `jslog()` 方法來在 JavaScript 日誌中寫入訊息。`jslog()` 方法接受我們想要在日誌中顯示的訊息作為引數。以下是如何實現 `jslog()` 的示例。您可以在業務規則指令碼中使用以下指令碼。
function onLoad(){
jslog("This log is displayed from jslog().");
jslog("The value of Member field is = " + g_form.getValue('Member'));
}
這將在日誌中顯示“成員”欄位中給定的值。在本例中,我們使用了 `getvalue` 方法來檢索“成員”欄位的值。下一步是開啟日誌。轉到右上角的“設定”選項,然後單擊“開發者”選項卡。開啟“JavaScript日誌和欄位監視器”選項。
JavaScript 日誌將在 ServiceNow 瀏覽器視窗底部的新的部分中開啟。
除了 `jslog()` 之外,我們還可以使用通常在 JavaScript 中使用的 try/catch 語句來除錯指令碼。
除錯伺服器端指令碼
除錯伺服器端指令碼最常用的方法是使用“指令碼偵錯程式”模組。“指令碼偵錯程式”可用於設定斷點、逐步遍歷程式碼、檢視變數的值等。要訪問指令碼偵錯程式,請在導航欄中找到“指令碼偵錯程式”。它位於“系統診斷”應用程式中。
除此之外,我們還可以參考“系統日誌”應用程式中的“應用程式日誌”模組。