Utiliser un Script Include pour intégrer CoreView et ServiceNow : un exemple pratique

  • Last update on June 4th, 2025

Cet exemple illustre l’intégration entre ServiceNow et CoreView afin de traiter une demande d’utilisateur final pour la création d’une boîte aux lettres partagée

Dans ce scénario, l’utilisateur qui demande la création de la boîte aux lettres partagée accède à un formulaire de catalogue en libre-service dans ServiceNow. Il peut saisir le nom de la boîte aux lettres et indiquer les utilisateurs auxquels l’accès doit être accordé.


Partie 1 : création d’un flux de travail dans CoreView

La première étape consiste à créer un flux de travail dans CoreView. Si vous ne savez pas comment créer un flux de travail, vous pouvez consulter la documentation ou vous entraîner avec ce tutoriel

Le flux de travail permettant de créer une boîte aux lettres partagée comprend plusieurs étapes pouvant être omises ou personnalisées selon les processus métier de votre organisation. Dans cet exemple, les étapes d’approbation ont été omises pour simplifier le flux de travail.

 

Éléments du flux de travail

Dans CoreView, créez un flux de travail composé des entrées d’exécution et des actions suivantes :

Consulter les éléments du flux de travail

Entrées

Nom Type Description
SharedMailboxName String Le nom de la boîte aux lettres partagée à créer
GroupMembers String Le ou les membres à ajouter pour accéder à la boîte aux lettres partagée
ServiceNowID String Le sys_id de l’élément de demande ServiceNow utilisé pour mettre à jour la demande
ServiceNowRequestID String Le sys_id de la demande ServiceNow utilisé pour mettre à jour l’enregistrement
de la demande

Actions

Nom Description
CreateSharedMailbox Crée la boîte aux lettres partagée selon le nom transmis depuis
ServiceNow
AddMailboxPermissions Ajoute le ou les membres transmis par ServiceNow, avec les droits
FullAccess sur la SharedMailbox. Cet exemple utilise un appel de flux de travail imbriqué afin de simplifier.
UpdateTableRecord Met à jour et clôture l’élément de demande (RITM) dans ServiceNow
UpdateTableRecord Met à jour et clôture la demande dans ServiceNow
 
 

Le résultat attendu doit être le suivant :

Explication de l’action Update Table Record

Pour la communication vers ServiceNow, l’action Update Table Record dans CoreView effectue un appel API afin d’accéder à des tables spécifiques dans ServiceNow. Elle met alors à jour ou modifie les enregistrements qui correspondent au sys_id de la table concernée.

Le code de la règle métier dans ServiceNow inclut le sys_id de l’élément de demande et de la demande comme paramètres du flux de travail, avec d’autres paramètres nécessaires. Cela permet de cibler l’enregistrement spécifique à mettre à jour. 

Il est important de noter que la propriété personnalisée de l’action Update Table Record utilise le nom de la propriété, qui suit généralement la convention des minuscules dans ServiceNow. Il s’agit d’un champ distinct de l’étiquette ou du nom d’affichage, qui peut inclure une majuscule et des espaces.

Mettre à jour l’enregistrement de la table : sc_req_item

  • Nom de la table : sc_req_item
  • Sys_id : INPUT|ServiceNowID
  • Propriété personnalisée 1
    • Clé : state
    • Valeur : 3
  • Propriété personnalisée 2
    • Clé : close_code
    • Valeur : Solved (CoreView) _personnalisé_
  • Propriété personnalisée 3
    • Clé : close_notes
    • Valeur : Shared Mailbox (INPUT|SharedMailboxName) Created via CoreView
 
 

Mettre à jour l’enregistrement de la table : sc_request

  • Nom de la table : sc_request
  • Sys_id : INPUT|ServiceNowRequestID
  • Propriété personnalisée 1
    • Clé : request_state
    • Valeur : closed_complete
  • Propriété personnalisée 2
    • Clé : close_notes
    • Valeur : Shared Mailbox (INPUT|SharedMailboxName) Created by CoreView
 
 

Partie 2 : intégrer ServiceNow

Étape 1 : insérer le Script Include

Le Script Include sert de base à toutes les exécutions de flux de travail de ServiceNow vers CoreView. Il permet de gagner du temps de développement en évitant de devoir répéter et dépanner l’appel d’API dans de multiples formulaires de demande. 

Ce Script Include contient deux fonctions

  1. une pour les appels généraux 
  2. et une autre spécialement conçue pour les règles métier

Afficher le bloc de code du Script Include

//NOTE: the following details need amending in the script: authUrl, authToken, companyID, workflowUrl
var CoreViewWorkflowCall = Class.create();
CoreViewWorkflowCall.prototype = Object.extendsObject(AbstractAjaxProcessor, {
  CVWorkflowCall :function(){
    var CVWorkflowID = this.getParameter('sysparm_CVWorkflowID');
    var CVWorkflowParams = this.getParameter('sysparm_CVWorkflowParams');
    //Building the CoreView workflow call
    var authUrl = 'https://www.loginportal.online/api/auth'; //url to auth to CoreView
    var authToken = '**********m1K-PAFbI4lAaO'; //CoreView api auth token
    var companyId = '**********bdfe1a974a345ea3042d4b'; //internal CoreView ID for company tennat
    //Get an access token from CoreView
    var jwtRequest = new sn_ws.RESTMessageV2();
    jwtRequest.setEndpoint(authUrl);
    jwtRequest.setHttpMethod('post');
    jwtRequest.setRequestHeader("Accept","Application/json");
    jwtRequest.setRequestHeader("Content-type", "Application/json"); //needed for CoreView workflow v2
    jwtRequest.setRequestBody('{}');
    jwtRequest.setRequestHeader("Authorization", "Bearer " + authToken);
    var jwtResponse = jwtRequest.executeAsync();
    jwtResponse.waitForResponse(60);
    var jwtBody = jwtResponse.getBody();
    var jwtToken = JSON.parse(jwtBody);
    var jwt = jwtToken.bearerToken;
    // Workflow call Variables
    var workflowUrl = 'https://coreflowusapi.coreview.com';
    var workflowPath = '/api/executions/';
    var workflowId = CVWorkflowID; //workflow being called in CoreView passed from glideajax in client script
    //Execute the call back to the CoreView api to run the workflow
    var request = new sn_ws.RESTMessageV2();
    request.setEndpoint(workflowUrl + workflowPath + workflowId);
    request.setHttpMethod("post");
    request.setRequestHeader("Accept", "Application/json");
    request.setRequestHeader("Authorization", "Bearer " + jwt);
    request.setRequestHeader("x-scompany", companyId);
    request.setRequestHeader("Content-type", "Application/json"); //needed for CoreView workflow v2
    request.setRequestBody(CVWorkflowParams); //workflow params passed from glideajax in client script, JSON was stringified before the call
    var response = request.executeAsync();
    response.waitForResponse(60);
    var responseBody = response.getBody();
  },
  CVWorkflowCall_BR :function(CVWorkflowID, CVWorkflowParams){
    //Building the CoreView workflow call
    var authUrl = 'https://www.loginportal.online/api/auth'; //url to auth to CoreView
    var authToken = '**********m1K-PAFbI4lAaO'; //CoreView api auth token
    var companyId = '**********bdfe1a974a345ea3042d4b'; //internal CoreView ID for company tennat
    //Get an access token from CoreView
    var jwtRequest = new sn_ws.RESTMessageV2();
    jwtRequest.setEndpoint(authUrl);
    jwtRequest.setHttpMethod('post');
    jwtRequest.setRequestHeader("Accept","Application/json");
    jwtRequest.setRequestHeader("Content-type", "Application/json"); //needed for CoreView workflow v2
    jwtRequest.setRequestBody('{}');
    jwtRequest.setRequestHeader("Authorization", "Bearer " + authToken);
    var jwtResponse = jwtRequest.executeAsync();
    jwtResponse.waitForResponse(60);
    var jwtBody = jwtResponse.getBody();
    var jwtToken = JSON.parse(jwtBody);
    var jwt = jwtToken.bearerToken;
    // Workflow call Variables
    var workflowUrl = 'https://coreflowusapi.coreview.com';
    var workflowPath = '/api/executions/';
    var workflowId = CVWorkflowID; //workflow being called in CoreView passed from glideajax in client script
    //Execute the call back to the CoreView api to run the workflow
    var request = new sn_ws.RESTMessageV2();
    request.setEndpoint(workflowUrl + workflowPath + workflowId);
    request.setHttpMethod("post");
    request.setRequestHeader("Accept", "Application/json");
    request.setRequestHeader("Authorization", "Bearer " + jwt);
    request.setRequestHeader("x-scompany", companyId);
    request.setRequestHeader("Content-type", "Application/json"); //needed for CoreView workflow v2
    request.setRequestBody(CVWorkflowParams); //workflow params passed from glideajax in client script, JSON was stringified before the call
    var response = request.executeAsync();
    response.waitForResponse(60);
    var responseBody = response.getBody();
  },
  type: 'CoreViewWorkflowCall'
});
 
 

Étape 2 : configurer le formulaire de demande de l’élément du catalogue

Ce formulaire de demande simple utilise une zone de texte pour le nom de la boîte aux lettres partagée et un ensemble de variables multi-lignes pour la composition du groupe.

Une fois que l’utilisateur final a renseigné le formulaire et clique sur « Order Now/Submit », la règle métier effectue le traitement une fois l’élément créé dans la table [sc_req_item].

Étape 3 : configurer la règle métier

La règle métier traite la demande dès qu’un enregistrement est créé dans la table [sc_req_item]. 

Le code de la règle métier récupère les variables de la demande et les transmet à CoreView pour traitement. Le code de cette règle est spécifique à cet exemple de demande et sera donc différent pour chaque cas. La structure reste la même : recueillir les valeurs des champs, les convertir au format JSON puis appeler la fonction du Script Include pour exécuter l’appel API.

Afficher la configuration de la règle métier

  • Nom : Request M365 Shared Mailbox
  • Table : Request Item [sc_req_item]
  • Moment d’exécution
    • Quand : après
    • Insertion : coché
  • Conditions de filtrage
    • L’élément est ‘Request M365 Shared Mailbox’ _il s’agit du nom de l’élément du catalogue créé_
 
 

Afficher le code de la règle métier

(function executeRule(current, previous /*null when async*/) {
  // Add your code here
  var ritmGR = new GlideRecord('u_m365users'); //creating pointer to user table to get user properties
  var rowCount = current.variables.distributiongroupmembers.getRowCount();
  var groupMembers = []; //storing the upn here
  //build the array of upns for workflow input variables
  for(var i = 0; i < rowCount; i++) {
    ritmGR.get(current.variables.distributiongroupmembers[i].GroupMember); //goes to the record in the user table according to the sys_id of the GroupMember
    groupMembers[i] = ritmGR.getValue('u_userprinciplename'); //add upn to array for use later
  }
  var workflowParams = {
    SharedMailboxName: current.variables.DistributionGroupName.getValue(),
    GroupMembers: groupMembers,
    ServiceNowID: current.getUniqueValue(), //gets the sys_id of the catalog item
    ServiceNowRequestID: current.request.getValue() //get the sys_id of the parent request
  };
  var WorkflowID = "******725-a784-23d0c1ab8c50"; //ID of workflow to execute in CoreView
  var wfcall = new CoreViewWorkflowCall();
  wfcall.CVWorkflowCall_BR(WorkflowID, JSON.stringify(workflowParams));
})(current, previous);