Hi Champions,
I want to write a script to replace last two letters of the first name, I have 5 conditions to solve here.
I am trying to decode it step by step and written below script to solve condition 1 (Replace as with ai)
#set( $Name = ${lead.FirstName} )
#set( $FormatName = $Name.trim().replaceAll("(.*)as", "ai") )
${FormatName}
The above script is replacing whole word instead of just "as", any help here is much appreciated.
Solved! Go to Solution.
try this
#set( $nameEnding = {
"as" : {
"updated":"ai"
},
"is" : {
"updated":"i"
},
"ys" : {
"updated":"y"
},
"us" : {
"updated":"au"
},
"ė" : {
"updated":"e"
}
}
)
#set( $swapChars="" )
#set( $checkChars=2 )
#if( ! $display.alt($lead.LastName,"").isEmpty() )
#set( $originalLastname = $lead.LastName )
#if ( $originalLastname.substring( $math.sub($originalLastname.length(),1) ).equals("ė"))
#set( $checkChars=1 )
#end
#set( $lastChars = $originalLastname.substring(
$math.sub($originalLastname.length(),$checkChars) ))
#if( $nameEnding.containsKey($lastChars) )
#set($outputName =
"${originalLastname.substring(0,$math.sub($originalLastname.length(),$checkChars))}${nameEnding[$lastChars].updated}")
#else
#set($outputName = $originalLastname)
#end
${outputName}
#end
I added in this line
#if( ! $display.alt($lead.LastName,"").isEmpty() )
to test to see if it has a real lead to work with. When you test an email, something can work in velocity, but when you approve the email, it'll fail as it has no lead data to actually work with.
Cheers
Jo
I
Hi,
I tried to solve it with below script and it worked.
#set( $Name = ${lead.FirstName} )
#set( $FormatName = $Name .trim().replaceAll("(?i),?(as\.?)${esc.d}", "ai") )
${FormatName }
Now, I am looking forward for your help to solve below conditions in one script.
@SanfordWhiteman Please help!
try this. There is probably a shorter more elegant version. However, the verbosity of this is in some ways useful
#set( $nameEnding = {
"as" : {
"updated":"ai"
},
"is" : {
"updated":"i"
},
"ys" : {
"updated":"y"
},
"us" : {
"updated":"au"
},
"ė" : {
"updated":"e"
}
}
)
#set( $swapChars="" )
#set( $checkChars=2 )
#set( $originalLastname = ${lead.LastName} )
#if ( $originalLastname.substring( $math.sub($originalLastname.length(),1) ).equals("ė"))
#set( $checkChars=1 )
#end
#set( $lastChars = $originalLastname.substring( $math.sub($originalLastname.length(),$checkChars) ))
#set( $swapChars = $nameEnding[$lastChars].updated )
#if(!$swapChars.length().equals(0))
#set($outputName = "$originalLastname.substring(0,$math.sub($originalLastname.length(),$checkChars))$swapChars")
#else
#set($outputName = $originalLastname)
#end
${outputName}
Here's how it all works:
The first section sets up a map that is readily searchable.
Then I set swapChars to be an empty (but defined) string, and the number of characters to look for at the end of the name to 2
I put the leads last name into a local variable, and test to see if it ends in ė. If it does, I reduce set CheckChars to 1
I get the correct length of ending into the lastChars variable, and then search the map to and put the output (if any) into swapChars
If there is anything in $swapChars I take all of the last name, minus the length of the swappable section, and add in the replacement chars
and then output it.
Cheers
Jo
@Jo_Pitts1 Thanks a ton! Script is working as intended, the you a way explained helps us to learn and improve our coding skills.
Cheers
Pramod
I don’t like how what would be a fatal error (were it not for Velocity coercing the error to falsy) is swallowed here.
Better:
#set( $nameEnding = {
"as" : {
"updated":"ai"
},
"is" : {
"updated":"i"
},
"ys" : {
"updated":"y"
},
"us" : {
"updated":"au"
},
"ė" : {
"updated":"e"
}
}
)
#set( $swapChars="" )
#set( $checkChars=2 )
#set( $originalLastname = $lead.LastName )
#if ( $originalLastname.substring( $math.sub($originalLastname.length(),1) ).equals("ė"))
#set( $checkChars=1 )
#end
#set( $lastChars = $originalLastname.substring( $math.sub($originalLastname.length(),$checkChars) ))
#if( $nameEnding.containsKey($lastChars) )
#set($outputName = "${originalLastname.substring(0,$math.sub($originalLastname.length(),$checkChars))}${nameEnding[$lastChars].updated}")
#else
#set($outputName = $originalLastname)
#end
${outputName}
now I'm curious:
Why is this
#if(!$swapChars.length().equals(0))
considered falsey? It has a boolean in it (the .equals() ), and I have (in my inimitable old school way) set $swapChars to be "" initially, so it has a 'length'.
Cheers
Jo
It’s not actually that line but more here, where you rely on Velocity skipping the error (and not assigning the variable) instead of throwing:
$nameEnding[$lastChars].updated
Ah. gotcha. So there is a risk of Velocity throwing an error when assigning if nothing is found in the map?
In this exact code there’s no chance that Velocity will throw a fatal error, but similar code like referencing a nonexistent array index will throw.
So it’s best to treat Velocity as if it’s Java because it’s impossible to know (without checking the Apache source code constantly) when you’ve accidentally created a non-swallowed error.
Gotcha.
Thanks for making my code a bit more robust :).
What are the performance impacts of checking the map twice (once with the contains, and then once to get the swap characters)?
Cheers
Jo