Populate Email Addresses of users selected in List Collector variable to Multi Line Text Variable

Vinay52
Tera Expert

Hello, Requesters would be selecting the users using List Collector and requirement is to copy the email addresses of selected users with comma separated (Right Side of List collector) to another variable (Multi Line Text Variable). Text Variable to make it read only and visible to Fulfillers. 

I have tried creating script by looking some past examples but seems its not working. Any suggestions on what seems to be wrong please

Variable Details: find_real_file.png

Client Script 

Type - onChange, Variable Name - select_users  //list collector variable 

function onChange(control, oldValue, newValue, isLoading) {
   if (isLoading || newValue == '') {
      return;
   }

  if(newValue === '') {
		g_form.clearValue('copied_from_list');
	}

	var gaPhone = new GlideAjax('getEmailAddress');
	gaPhone.addParam('sysparm_name', 'get_email');
	gaPhone.addParam('sysparm_users', newValue);
	gaPhone.getXMLAnswer(_handleResponse);

	function _handleResponse(response) {
		var answer = response;
		
		g_form.setValue('copied_from_list', answer);
	}
  
}

Script Include - Client Callable: Checked

var getEmailAddress = Class.create();
getEmailAddress.prototype = Object.extendsObject(AbstractAjaxProcessor, {
	
	get_email : function() {
		var userArr = this.getParameter('sysparm_users').split(',');
		var emailArr = [];

		for(var i = 0; i < userArr.length; i++) {
			var grUser = new GlideRecord('sys_user');

			if(grUser.get(userArr[i])) {
				emailArr.push(grUser.getValue('email'));
			}
		}
		emailArr.join();
		
		return emailArr.toString();
	},
		
    type: 'getEmailAddress'
	
});

 

1 ACCEPTED SOLUTION

Hi Vinay,

then you can use Run Script in the workflow of catalog item

Updated: to remove current.update()

var userArr = current.variables.select_users.toString().split(',');
var emailArr = [];

for(var i = 0; i < userArr.length; i++) {
	var grUser = new GlideRecord('sys_user');

	if(grUser.get(userArr[i].toString())) {
		emailArr.push(grUser.getValue('email'));
	}
}

var values = emailArr.join();
current.variables.copied_from_list = values;

Regards
Ankur

Regards,
Ankur
Certified Technical Architect  ||  9x ServiceNow MVP  ||  ServiceNow Community Leader

View solution in original post

16 REPLIES 16

amaradiswamy
Kilo Sage

Try below

Client script:

function onChange(control, oldValue, newValue, isLoading) {
   if (isLoading || newValue == '') {
      return;
   }

  if(newValue === '') {
		g_form.clearValue('copied_from_list');
	}

	var gaPhone = new GlideAjax('getEmailAddress');
	gaPhone.addParam('sysparm_name', 'get_email');
	gaPhone.addParam('sysparm_users', newValue);
	gaPhone.getXMLAnswer(handleResponsefn);

	function handleResponsefn(response) {
		var answer = response.responseXML.documentElement.getAttribute('answer');
		
		g_form.setValue('copied_from_list', answer);
	}
  
}

 

Script include:

var getEmailAddress = Class.create();
getEmailAddress.prototype = Object.extendsObject(AbstractAjaxProcessor, {
	
	get_email : function() {
		var userArr = this.getParameter('sysparm_users');
                userArr = userArr.split(',');
		var emailArr = [];

		for(var i = 0; i < userArr.length; i++) {
			var grUser = new GlideRecord('sys_user');

			if(grUser.get(userArr[i])) {
				emailArr.push(grUser.getValue('email'));
			}
		}
		emailArr.join();
		
		return emailArr.toString();
	},
		
    type: 'getEmailAddress'
	
});

Thanks for the reply, Still no luck

find_real_file.png

Place alert and see what response getting from the script include.

function onChange(control, oldValue, newValue, isLoading) {
   if (isLoading || newValue == '') {
      return;
   }

  if(newValue === '') {
		g_form.clearValue('copied_from_list');
	}

	var gaPhone = new GlideAjax('getEmailAddress');
	gaPhone.addParam('sysparm_name', 'get_email');
	gaPhone.addParam('sysparm_users', newValue);
	gaPhone.getXMLAnswer(handleResponsefn);

	function handleResponsefn(response) {
		var answer = response.responseXML.documentElement.getAttribute('answer');
		alert(answer);
		g_form.setValue('copied_from_list', answer);
	}
  
}

Sorry, I didn't realize that you are using synchronous method, try the below asynchronous type method

function onChange(control, oldValue, newValue, isLoading) {
   if (isLoading || newValue == '') {
      return;
   }

  if(newValue === '') {
		g_form.clearValue('copied_from_list');
	}

	var gaPhone = new GlideAjax('getEmailAddress');
	gaPhone.addParam('sysparm_name', 'get_email');
	gaPhone.addParam('sysparm_users', newValue);
	gaPhone.getXML(handleResponsefn);

	function handleResponsefn(response) {
		var answer = response.responseXML.documentElement.getAttribute('answer');
		
		g_form.setValue('copied_from_list', answer);
	}
  
}