From 34f1bdc2904417178da408b66d31042eb094058c Mon Sep 17 00:00:00 2001 From: vijaykumar7177 <68215714+vijaykumar7177@users.noreply.github.com> Date: Sat, 18 Oct 2025 16:44:57 +0530 Subject: [PATCH 1/6] Update currenct_Converstion_to_USD.js --- .../Currency conversion to USD/currenct_Converstion_to_USD.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server-Side Components/Business Rules/Currency conversion to USD/currenct_Converstion_to_USD.js b/Server-Side Components/Business Rules/Currency conversion to USD/currenct_Converstion_to_USD.js index 0504a6ab80..27fa909e3b 100644 --- a/Server-Side Components/Business Rules/Currency conversion to USD/currenct_Converstion_to_USD.js +++ b/Server-Side Components/Business Rules/Currency conversion to USD/currenct_Converstion_to_USD.js @@ -4,7 +4,7 @@ var currencyCode = current.budget_currency ? current.budget_currency.toString().substring(0, 3) : ''; // Convert the annual budget value to a float - var amount = parseFloat(current.annual_budget); + var amount = parseFloat(current.annual_budget);//annual_budget is filed where we can enter amount // Validate input: If currency code is missing or amount is not a valid number, clear the USD field and exit if (!currencyCode || isNaN(amount)) { From 8b78624d07ddbec09a5511bc09c5b2b105934159 Mon Sep 17 00:00:00 2001 From: vijaykumar7177 <68215714+vijaykumar7177@users.noreply.github.com> Date: Sat, 18 Oct 2025 16:45:15 +0530 Subject: [PATCH 2/6] Update readme.md --- .../Business Rules/Currency conversion to USD/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server-Side Components/Business Rules/Currency conversion to USD/readme.md b/Server-Side Components/Business Rules/Currency conversion to USD/readme.md index ffbcd618bb..e090403f7a 100644 --- a/Server-Side Components/Business Rules/Currency conversion to USD/readme.md +++ b/Server-Side Components/Business Rules/Currency conversion to USD/readme.md @@ -6,7 +6,7 @@ Validation: Ensures both the currency code and amount are valid before proceedin Currency Check: If the currency is already USD, it bypasses conversion. Exchange Rate Lookup: Retrieves the most recent exchange rates for both the source currency and USD. Conversion Logic: Applies the formula -USD Amount=(Original AmountSource Rate)×USD Rate\text{USD Amount} = \left(\frac{\text{Original Amount}}{\text{Source Rate}}\right) \times \text{USD Rate}USD Amount=(Source RateOriginal Amount​)×USD Rate +USD Amount=(Original AmountSource Rate)×USD Rate\text{USD Amount} = \left(\frac{\text{Original Amount}}{\text{Source Rate}}\right) \times \text{USD Rate}USD Amount=(Source RateOriginal Amount​)×USD Rate. Error Handling: Clears the USD field if any required data is missing or invalid. This script ensures accurate and up-to-date currency conversion for budgeting purposes and is well-commented for maintainability and clarity. From df3e2c036a87a41212505e2665e5fe55fe87947c Mon Sep 17 00:00:00 2001 From: vijaykumar7177 <68215714+vijaykumar7177@users.noreply.github.com> Date: Sat, 18 Oct 2025 16:53:49 +0530 Subject: [PATCH 3/6] Create readme.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Automatically classify the sentiment of an incident’s description (positive, negative, neutral) based on keyword analysis — no ML or API needed. --- .../readme.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 Client-Side Components/Catalog Client Script/Incident Sentiment Detector (Using Simple Word Matching, No AI)/readme.md diff --git a/Client-Side Components/Catalog Client Script/Incident Sentiment Detector (Using Simple Word Matching, No AI)/readme.md b/Client-Side Components/Catalog Client Script/Incident Sentiment Detector (Using Simple Word Matching, No AI)/readme.md new file mode 100644 index 0000000000..ca744a7bc8 --- /dev/null +++ b/Client-Side Components/Catalog Client Script/Incident Sentiment Detector (Using Simple Word Matching, No AI)/readme.md @@ -0,0 +1 @@ +Automatically classify the sentiment of an incident’s description (positive, negative, neutral) based on keyword analysis — no ML or API needed. From b702486bc77fb6583990dcc25594398bc1a92d0f Mon Sep 17 00:00:00 2001 From: vijaykumar7177 <68215714+vijaykumar7177@users.noreply.github.com> Date: Sat, 18 Oct 2025 16:54:57 +0530 Subject: [PATCH 4/6] Create SentimentAnalyzer.js --- .../SentimentAnalyzer.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 Client-Side Components/Catalog Client Script/Incident Sentiment Detector (Using Simple Word Matching, No AI)/SentimentAnalyzer.js diff --git a/Client-Side Components/Catalog Client Script/Incident Sentiment Detector (Using Simple Word Matching, No AI)/SentimentAnalyzer.js b/Client-Side Components/Catalog Client Script/Incident Sentiment Detector (Using Simple Word Matching, No AI)/SentimentAnalyzer.js new file mode 100644 index 0000000000..ba38447891 --- /dev/null +++ b/Client-Side Components/Catalog Client Script/Incident Sentiment Detector (Using Simple Word Matching, No AI)/SentimentAnalyzer.js @@ -0,0 +1,16 @@ +var SentimentAnalyzer = Class.create(); +SentimentAnalyzer.prototype = Object.extendsObject(AbstractAjaxProcessor, { + getSentiment: function() { + var text = (this.getParameter('sysparm_text') || '').toLowerCase(); + var positive = ['thanks', 'great', 'resolved', 'appreciate']; + var negative = ['issue', 'error', 'not working', 'fail', 'problem']; + + var score = 0; + positive.forEach(function(word) { if (text.includes(word)) score++; }); + negative.forEach(function(word) { if (text.includes(word)) score--; }); + + if (score > 0) return 'Positive'; + if (score < 0) return 'Negative'; + return 'Neutral'; + } +}); From 37b5bf2b58b794ed6b5b784cda73f5827d1433ae Mon Sep 17 00:00:00 2001 From: vijaykumar7177 <68215714+vijaykumar7177@users.noreply.github.com> Date: Sat, 18 Oct 2025 16:56:27 +0530 Subject: [PATCH 5/6] Create onChangeClientscript.js --- .../onChangeClientscript.js | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 Client-Side Components/Catalog Client Script/Incident Sentiment Detector (Using Simple Word Matching, No AI)/onChangeClientscript.js diff --git a/Client-Side Components/Catalog Client Script/Incident Sentiment Detector (Using Simple Word Matching, No AI)/onChangeClientscript.js b/Client-Side Components/Catalog Client Script/Incident Sentiment Detector (Using Simple Word Matching, No AI)/onChangeClientscript.js new file mode 100644 index 0000000000..214a08b28b --- /dev/null +++ b/Client-Side Components/Catalog Client Script/Incident Sentiment Detector (Using Simple Word Matching, No AI)/onChangeClientscript.js @@ -0,0 +1,11 @@ +function onChange(control, oldValue, newValue, isLoading) { + if (isLoading || !newValue) return; + + var ga = new GlideAjax('SentimentAnalyzer'); + ga.addParam('sysparm_name', 'getSentiment'); + ga.addParam('sysparm_text', newValue); + ga.getXMLAnswer(function(sentiment) { + g_form.addInfoMessage('Sentiment: ' + sentiment); + g_form.setValue('u_sentiment', sentiment); + }); +} From d5d35dfecd866b33146e9e2af14eaa8437087991 Mon Sep 17 00:00:00 2001 From: vijaykumar7177 <68215714+vijaykumar7177@users.noreply.github.com> Date: Sat, 18 Oct 2025 16:57:40 +0530 Subject: [PATCH 6/6] Update readme.md --- .../readme.md | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/Client-Side Components/Catalog Client Script/Incident Sentiment Detector (Using Simple Word Matching, No AI)/readme.md b/Client-Side Components/Catalog Client Script/Incident Sentiment Detector (Using Simple Word Matching, No AI)/readme.md index ca744a7bc8..54dad22923 100644 --- a/Client-Side Components/Catalog Client Script/Incident Sentiment Detector (Using Simple Word Matching, No AI)/readme.md +++ b/Client-Side Components/Catalog Client Script/Incident Sentiment Detector (Using Simple Word Matching, No AI)/readme.md @@ -1 +1,31 @@ -Automatically classify the sentiment of an incident’s description (positive, negative, neutral) based on keyword analysis — no ML or API needed. +Incident Sentiment Detector (No AI, Pure JavaScript) + +A lightweight ServiceNow utility that detects sentiment (Positive / Negative / Neutral) of an Incident’s short description or comments using simple keyword matching — no AI APIs or external libraries required. + +Useful for support teams to auto-tag sentiment and analyze user frustration or satisfaction trends without expensive integrations. + +🚀 Features + +✅ Detects sentiment directly inside ServiceNow +✅ Works without external APIs or ML models +✅ Instant classification on form update +✅ Adds detected sentiment to a custom field (u_sentiment) +✅ Simple to extend — just add more positive/negative keywords + +🧩 Architecture Overview + +The solution consists of two main scripts: + +Component Type Purpose +SentimentAnalyzer Script Include Processes text and returns sentiment +Client Script (onChange) Client Script Calls SentimentAnalyzer via GlideAjax on short description change +🧱 Setup Instructions +1️⃣ Create Custom Field + +Create a new field on the Incident table: + +Name: u_sentiment + +Type: Choice + +Choices: Positive, Neutral, Negative