jace.proA site for my notes on ServiceNow2023-12-23T08:56:31Zhttps://jace.proJace Bensonhttps://linkedin.com/in/jacebensonAI, data ownership, privacy and ethics2023-12-23T08:56:31Zhttps://jace.pro/post/2023-12-23-ai-data-ownership-privacy-and-ethics/Jace Benson<h1>AI, Data Ownership, Privacy and Databases: A Heartland Perspective</h1>
<p>Artificial intelligence (AI) is here. It's reshaping things whether we like it or not. But today let's dive into a head-scratcher - who actually owns the data that fuels AI?</p>
<h2>Funneling Text Suggestions from An Unlikely Place</h2>
<p>You might've typed something on Google or LinkedIn and been grateful for those handy text suggestions. Ever wondered where they come from? They originated from the Enron Corpus. A database of old emails publicly available for scrutiny while investigating the Enron scandal.</p>
<p>Interesting right? Now how does this relate to AI and ethics? Let me explain.</p>
<h2>Who Owns The Data Anyway?</h2>
<p>When you're building an artificial language model, determining data ownership can be as clear as mud. You’d think whoever created the model owns it, right? That idea takes a knock when you start considering where that data came from—the ethical parameters around its sourcing—was it expressedly given up by users or simply scraped off websites by developers?</p>
<p>These are just some thoughts inspired by Luis Villa guest appearance on the <a href="https://changelog.com/podcast/458">ChangeLog</a>. He's a programmer made lawyer.</p>
<h2>Getting Our Feet Wet in Ethics</h2>
<h3>Case Study 1: Hollywood Meets AI with William Shatner & StoryFile</h3>
<p>Let’s chat about William Shatner jumping onto the recording hot-seat with <a href="https://storyfile.com/gallery/william-shatner/">StoryFile</a>. Users shoot questions at this video interface; meanwhile Shatner’s authentic responses hold down the fort—no fabricated information used here pal! This has to be in my opinion, the best way to be respectful to the individual's desires, and keeps the response true to it's context.</p>
<h3>Case Study 2: More than Meets The Eye with James Vlahos</h3>
<p>On flip side things get dicey when James Vlahos uses AI to chat with digital representation of his deceased father. Though Vlahos’s ‘dad’ seems pretty real, remember we’re dealing with a high-tech marionette here that mimics the source, rather than embodying it—just one of the many ethical puddles you might step into in this tech field!</p>
<p><a href="https://www.thedailybeast.com/chatbots-by-james-vlahos-and-hereafter-ai-are-letting-you-talk-to-the-dead">https://www.thedailybeast.com/chatbots-by-james-vlahos-and-hereafter-ai-are-letting-you-talk-to-the-dead</a></p>
<h2>Figuring Out AI: More Than 1's and 0's</h2>
<p>According to Gary V, new tech should be about cutting out drudgery and making more room for electrifying stuff—the sort of thrill-of-the-chase excitement that got us into this high-speed industry. And yes, I’m nodding right along! His quick burst <a href="https://www.linkedin.com/posts/garyvaynerchuk_chatgpt-ai-activity-7017203136528277504-w9Ol">video clip</a> nails it better than I ever could.</p>
<p>Folks fretted about job cuts even back in my ServiceNow days circa 2007 when John H voiced his concerns when I was automating some work. This feels like more of the same. This lets our brain focus on what really matters.</p>
<h2>Bottom Line</h2>
<p>Only use data you've made or have explicit permission to use when involving AI. With Scribe.monster I wrote every code example by hand it uses to suggest code. With the AI bot on my blog it is only using the content I've written.</p>
<p>Quick question though—you got any thoughts on this?</p>
Ready to Get Out of Your Comfort Zone? Here's How2023-01-04T01:27:01Zhttps://jace.pro/post/why-is-being-uncomfortable-great-when-learning-new-things/Jace Benson<p>Are you ready to learn a new skill and get out of your comfort zone? We all need to challenge ourselves and push our boundaries to grow, but it can be intimidating to take the plunge. That's why I'm here to encourage and motivate you to explore the unknown and discover the power of resilience and perseverance.</p>
<p><img src="https://jace.pro/static/img/reasons-.png" alt="A bike chain forming the number six next to the word "Reasons!". Credit padrinan on pixabay" title="A bike chain forming the number six next to the word "Reasons!". Credit padrinan on pixabay" /></p>
<p>Here's 6 Reasons You Should Step Out of Your Comfort Zone:</p>
<ol>
<li>You'll learn more about yourself and what you're comfortable with.</li>
<li>You'll become more resilient and adaptable.</li>
<li>You'll gain new skills and experiences.</li>
<li>You'll expand your network.</li>
<li>You'll become more open to new ideas.</li>
<li>You'll become more confident and motivated.</li>
</ol>
<p><img src="https://jace.pro/static/img/ways.png" alt="The number 7 next to the word "Ways". 7 has a mountain and tree in it." title="The number 7 next to the word "Ways"" /></p>
<p>Ready to take the leap? Here's 7 Ways to Get Out of Your Comfort Zone:</p>
<ol>
<li>Make a goal and work to achieve it.</li>
<li>Take a class in something you’re unfamiliar with.</li>
<li>Try a new sport or hobby.</li>
<li>Challenge yourself to do something you’ve never done before.</li>
<li>Volunteer for a cause outside your normal interests.</li>
<li>Take a risk and do something that scares you.</li>
<li>Step out of your usual routine and do something different.</li>
</ol>
<p>Here are a few lessons I've learned the hard way that can help you on your journey.</p>
<ul>
<li>Organizing meetups. I ran the Minneapolis ServiceNow Developer Meetup for three years. There I learned a <strong>consistent schedule</strong> and <strong>great content</strong> are essential to success. Don't fear reaching out to others for support. By doing that people provided space, and content. It wasn't always that way I had to make my fair share of labs.</li>
<li>Making videos. I made videos to discuss the happenings in the ServiceNow space. Although I've been on hiatus for a hot minute, I'm coming back in January! I learned that <strong>content is key</strong>, and that you need to know how to <strong>capture your viewers' attention</strong>. I'm no expert, but I've come a long way since I started recording, editing, and posting videos.</li>
<li>Blogging: This blog has been part of my life for years now, but when I first started it was a place for me to keep notes. Through content creation, I've learned (and am still learning!) <strong>what success looks like</strong>. Writing is a skill that improves the more you use it, so don't be afraid to write down your notes. Not everyone wants to make them public, and that's ok - make sure you write them down!</li>
</ul>
<p>Ready to give it a go? Take the plunge and break out of your comfort zone. Share your experiences and tag me - I'd love to see it!</p>
Alternatives to OpenAI, AI21, CoHere, Azure, AWS Sagemaker, Google Colab, PipelineAI and others2022-12-31T06:23:51Zhttps://jace.pro/post/2022-12-31-alternatives-to-openai-ai21-cohere-azure-aws-sagemaker-google-colab-pipelineai-and-others/Jace Benson<p>I'm trying to understand the pricing to all of this AI / ML tech for my uses with <a href="https://scribe.monster/">ScribeMonster</a>. This is a work in progress so far I'm categorizing the different solutions as Token, Other, or Compute.</p>
<p>If you find an error, reach out to me on twitter @jacebenson.</p>
<h2>Token Solutions</h2>
<table>
<thead>
<tr>
<th>Model</th>
<th>Hosting/hour</th>
<th>Prompt Price</th>
<th>Completion Price</th>
<th>Cost per Request</th>
</tr>
</thead>
<tbody>
<tr>
<td>OpenAI - Ada</td>
<td></td>
<td>$0.0004/1k</td>
<td>$0.0004/1k token</td>
<td>Free</td>
</tr>
<tr>
<td>OpenAI - Ada Trained</td>
<td></td>
<td>$0.0016/1k</td>
<td>$0.0016/1k token</td>
<td>Free</td>
</tr>
<tr>
<td>OpenAI - Babbage</td>
<td></td>
<td>$0.0005/1k</td>
<td>$0.0005/1k token</td>
<td>Free</td>
</tr>
<tr>
<td>OpenAI - Babbage Trained</td>
<td></td>
<td>$0.0024/1k</td>
<td>$0.0024/1k token</td>
<td>Free</td>
</tr>
<tr>
<td>OpenAI - Curie</td>
<td></td>
<td>$0.0020/1k</td>
<td>$0.0020/1k token</td>
<td>Free</td>
</tr>
<tr>
<td>OpenAI - Curie Trained</td>
<td></td>
<td>$0.0120/1k</td>
<td>$0.0120/1k token</td>
<td>Free</td>
</tr>
<tr>
<td>OpenAI - Davinci</td>
<td></td>
<td>$0.0200/1k</td>
<td>$0.0200/1k token</td>
<td>Free</td>
</tr>
<tr>
<td>OpenAI - Davinci Trained</td>
<td></td>
<td>$0.1200/1k</td>
<td>$0.1200/1k token</td>
<td>Free</td>
</tr>
<tr>
<td>AI21 - J-1 Large</td>
<td></td>
<td>Free</td>
<td>$0.0300/1k token</td>
<td>$0.0003</td>
</tr>
<tr>
<td>AI21 - J-1 Large Trained</td>
<td></td>
<td>Free</td>
<td>$0.0300/1k token</td>
<td>$0.0003</td>
</tr>
<tr>
<td>AI21 - J-1 Grande</td>
<td></td>
<td>Free</td>
<td>$0.0800/1k token</td>
<td>$0.0008</td>
</tr>
<tr>
<td>AI21 - J-1 Grande Trained</td>
<td></td>
<td>Free</td>
<td>$0.0800/1k token</td>
<td>$0.0008</td>
</tr>
<tr>
<td>AI21 - J-1 Jumbo</td>
<td></td>
<td>Free</td>
<td>$0.2500/1k token</td>
<td>$0.0050</td>
</tr>
<tr>
<td>AI21 - J-1 Jumbo Trained</td>
<td></td>
<td>Free</td>
<td>$0.2500/1k token</td>
<td>$0.0050</td>
</tr>
<tr>
<td>CoHere Generate Default</td>
<td></td>
<td>Free</td>
<td>Free</td>
<td>$0.0025</td>
</tr>
<tr>
<td>CoHere Generate Custom</td>
<td></td>
<td>Free</td>
<td>Free</td>
<td>$0.0050</td>
</tr>
<tr>
<td>CoHere Classify Default</td>
<td></td>
<td>Free</td>
<td>Free</td>
<td>$0.0020</td>
</tr>
<tr>
<td>CoHere Classify Custom</td>
<td></td>
<td>Free</td>
<td>Free</td>
<td>$0.0020</td>
</tr>
<tr>
<td>CoHere Embed Default</td>
<td></td>
<td>Free</td>
<td>Free</td>
<td>$0.0010</td>
</tr>
<tr>
<td>CoHere Embed Custom</td>
<td></td>
<td>Free</td>
<td>Free</td>
<td>$0.0020</td>
</tr>
<tr>
<td>Azure - Ada</td>
<td></td>
<td>$0.0004/1k</td>
<td>$0.0004/1k token</td>
<td>Free</td>
</tr>
<tr>
<td>Azure - Ada Trained</td>
<td>$00.05</td>
<td>$0.0004/1k</td>
<td>$0.0004/1k token</td>
<td>Free</td>
</tr>
<tr>
<td>Azure - Babbage</td>
<td></td>
<td>$0.0005/1k</td>
<td>$0.0005/1k token</td>
<td>Free</td>
</tr>
<tr>
<td>Azure - Babbage Trained</td>
<td>$00.08</td>
<td>$0.0005/1k</td>
<td>$0.0005/1k token</td>
<td>Free</td>
</tr>
<tr>
<td>Azure - Curie</td>
<td></td>
<td>$0.0020/1k</td>
<td>$0.0020/1k token</td>
<td>Free</td>
</tr>
<tr>
<td>Azure - Curie Trained</td>
<td>$00.24</td>
<td>$0.0020/1k</td>
<td>$0.0020/1k token</td>
<td>Free</td>
</tr>
<tr>
<td>Azure - Davinci</td>
<td></td>
<td>$0.0200/1k</td>
<td>$0.0200/1k token</td>
<td>Free</td>
</tr>
<tr>
<td>Azure - Davinci Trained</td>
<td>$34.00</td>
<td>$0.0200/1k</td>
<td>$0.0200/1k token</td>
<td>Free</td>
</tr>
</tbody>
</table>
<ul>
<li><a href="https://openai.com/api/pricing/">https://openai.com/api/pricing/</a></li>
<li><a href="https://studio.ai21.com/pricing">https://studio.ai21.com/pricing</a> ($29/mo after 3 month trial + tokens)</li>
<li><a href="https://cohere.ai/pricing">https://cohere.ai/pricing</a></li>
<li><a href="https://azure.microsoft.com/en-us/pricing/details/cognitive-services/openai-service/">https://azure.microsoft.com/en-us/pricing/details/cognitive-services/openai-service/</a></li>
</ul>
<h2>Other Solutions</h2>
<table>
<thead>
<tr>
<th>Host</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td>Google Colab</td>
<td>Priced per "Compute Unit" and that's tied to your config</td>
</tr>
<tr>
<td>AWS Sagemaker</td>
<td>Different pricing for different tasks</td>
</tr>
</tbody>
</table>
<ul>
<li><a href="https://colab.research.google.com/signup/pricing">https://colab.research.google.com/signup/pricing</a></li>
<li><a href="https://aws.amazon.com/sagemaker/pricing/">https://aws.amazon.com/sagemaker/pricing/</a></li>
</ul>
<h2>Compute Solutions</h2>
<table>
<thead>
<tr>
<th>Host</th>
<th>Monthly Price</th>
<th>Price</th>
</tr>
</thead>
<tbody>
<tr>
<td>Pipeline</td>
<td>$12.99</td>
<td>$0.00055 / second [1.98/hour]</td>
</tr>
<tr>
<td>Google Cloud</td>
<td></td>
<td>$3.22 / hour</td>
</tr>
<tr>
<td>AWS EC2 P3</td>
<td></td>
<td>$3.06 / hour</td>
</tr>
<tr>
<td>Azure ML</td>
<td></td>
<td>?</td>
</tr>
</tbody>
</table>
<ul>
<li><a href="https://www.pipeline.ai/pricing">https://www.pipeline.ai/pricing</a></li>
<li><a href="https://cloud.google.com/tpu/pricing#how-pricing-works">https://cloud.google.com/tpu/pricing#how-pricing-works</a></li>
<li><a href="https://aws.amazon.com/ec2/instance-types/p3/">https://aws.amazon.com/ec2/instance-types/p3/</a></li>
<li><a href="https://azure.microsoft.com/en-in/pricing/details/machine-learning/#pricing">https://azure.microsoft.com/en-in/pricing/details/machine-learning/#pricing</a></li>
</ul>
<h2>Other Resources</h2>
<ul>
<li>GPT Products <a href="https://www.gpt-list.com/gpt-products?ref=jace.pro">https://www.gpt-list.com/gpt-products?ref=jace.pro</a></li>
<li>FutureTools <a href="https://www.futuretools.io/?ref=jace.pro">https://www.futuretools.io/?ref=jace.pro</a></li>
</ul>
Why does ServiceNow use Zoomin instead of Knowledge?2022-12-24T02:16:36Zhttps://jace.pro/post/2022-12-24-why-does-servicenow-use-zoomin-instead-of-knowledge/Jace Benson<p>Have you ever wondered why ServiceNow doesn't use their Knowledge management for their docs? I mean you could argue they do, but we know those are only for folks with access to support.</p>
<p>Before the docs site and developer site became what it is today they used MediaWiki. (RIP Wiki).</p>
<p>Now they use <a href="http://zoominsoftware.com/">Zoomin</a> for docs.servicenow.com</p>
<p>I have often wondered why ServiceNow wants to know who you are when you're looking at the docs. They can get traffic data with something like Google Analtyics.</p>
<p>I think this comes back to something ServiceNow is embracing more and more. Picking the right solution for the job. ServiceNow doesn't have a great api and release management suite. At least not a public one. So they've used Zoomin.</p>
<p>As much as I'd like them to use a static site generator for this that's not their perogitive.</p>
<p>I've <a href="https://sn.jace.pro/">my own version</a> as I've been bitten by their docs going down when I needed the most. Maybe we should collectively create one. I know there's times I wish their docs had things they don't. You can leave feedback (if the site is up).</p>
<p>The other thing I can't stand about their implementation of Zoomin is they drop off the old versions of ServiceNow. So you can't look back when something was introduced. I do have another <a href="https://sndocs.jace.pro/">site I maintain with that data</a> but I'm not consistent about it.</p>
What is SUBQUERY and how does it give me superpowers in ServiceNow?2022-12-24T01:52:58Zhttps://jace.pro/post/2022-12-24-what-is-subquery-and-how-does-it-give-me-superpowers-in-servicenow/Jace Benson<h2>What is SUBQUERY</h2>
<p>SUBQUERY is an undocumented close relative of RLQUERY - an encoded query keyword that lets one do joins in... encoded queries.</p>
<p>I'm sure you have read about RLQUERY in docs page Encoded query strings. RLQUERY is the related list conditions query to find records where it's related records meet the given conditions. (I just posted about it).</p>
<p>An example of SUBQUERY can be found in Relationship Related Tasks of Interaction[interaction].</p>
<p>RLQUERY is powerful<br />
I use reports UI just to access it in a gui<br />
I feel like a demo is needed as … joins is something I just keep poking at until I get it working</p>
<p>A subquery is effectively a database join. I'll update this later but I want to get this out there and Thank Pok for sharing this months ago.</p>
<p>All in all, the encoded query for a glide_list field pointing to sys_user would like like this:
<code>javascript: 'SUBQUERYsys_id,user,sys_user_grmember^groupIN' + [array of group sys_ids] + '^EQ^ENDSUBQUERY^active=true^EQ'</code></p>
<p><code>SUBQUERYsys_id,user,sys_user_grmember</code></p>
<p>Means INNER JOIN sys_user_grmember M ON M.user = <sys_user>.sys_id</p>
<p><code>groupIN' + [array of group sys_ids] + '</code></p>
<p>Means WHERE M.group IN (...)</p>
<p><code>active=true</code></p>
<p>Means <sys_user>.active = true</p>
Superpowers with Related Record Conditions2022-12-24T01:51:28Zhttps://jace.pro/post/2022-12-24-superpowers-with-related-record-conditions/Jace Benson<blockquote>
<p>Steve: Jace, I want an alert whenever we don't get an message from this server every hour.<br />
Jace: So you want me to watch for the lack of something, and if there's nothing do the thing?
Steve: Yes.</p>
</blockquote>
<p>Before Related Record Conditions on reports this was a really tough ask.
I remember asking coworkers to jump into a room so we could flesh this out. It wasn't easy. There was 24 events this way. So we had 24 different scripted solutions watching for the lack of a check in.</p>
<p>In retrospect I wonder why I didn't just have a scripted end point update the server or something. However that's not why I'm writing this.</p>
<p>Did you know you can easily get a list of records where theres no related records. No? Neither did I.</p>
<p>Here's a few great use cases for this.</p>
<ol>
<li>Find me groups with no members (Can they be removed?)</li>
<li>Find me catalog items with no related requests (Is this item being used?)</li>
<li>Find me users with no related (If they are licensed can we remove them from those groups?)</li>
<li>Find me notifications, with no email logs (Is this notification being triggered?)</li>
</ol>
<p>To make report like this all you need to do is the following.</p>
<ol>
<li>Built your filter on the list your curious about. (e.g. Users)</li>
<li>Right click on a column that has "Bar Chart", press that.</li>
<li>In your filter, click "Related List Conditions", and pick the related records you want to query. Say you want to find users where they are not a member of any group. (Or maybe users where they are a member of more then 3 groups)</li>
<li>Click the "Greater then or Equal to 1" to change the related list condition.</li>
<li>Pick the Related List Condition table. (sticking with group memberships, you'd pick Groups)</li>
</ol>
<p><img src="https://jace.pro/static/img/related-list-condition.png" alt="Related list condition in ServiceNow" /></p>
<p>One really cool thing about this is if you click on the report you can see how the related condition is built in the URL condition which means you can also use these in encoded queries. Maybe you want to notify folks when they have 5 or more incidents needing their attention.</p>
<p>Related Videos:</p>
<ul>
<li><a href="https://youtu.be/gkzKzSXbwk0">RFedoruk's video</a></li>
<li><a href="https://www.youtube.com/watch?v=IVBmm5XAfHE&hd=1">My rough video</a></li>
</ul>
Understanding AI and ML: From ServiceNow to OpenAI2022-12-23T22:18:51Zhttps://jace.pro/post/the-good-and-bad-about-openai-and-chatgpt-around-servicenow/Jace Benson<h2>Introduction to AI/ML</h2>
<p>ServiceNow's Artificial Intelligence (aka Predictive Intelligence) is complex and . and difficult to set up, and other people weren't impressed with it.</p>
<p>I have this worm in my ear and I need to get it somewhere.</p>
<p>Embrace it or be left behind.</p>
<p>We fear what we don't understand, I hope my journey will help add some understanding. If it does, please let me know where you can find me.</p>
<p>In 2016 I read about Predictive Intelligence in ServiceNow. This wa my first real look at anything like this. I remember thinking this Artificial Intelligence (AI) or Machine Learning (ML) stuff looked awesome. It sounded very complicated and difficult to set up. Back then, you needed around 10,000 incidents to train it to assign tickets to the right group. That seemed painful. To keep it up to date, you had to re-train the cortex. I tell you this to emphasize that I walked away; it was too much.</p>
<p>A while later MoveWorks demo'd their chatbot solution to me. It was also great. You'd message it something and it would ask you simple questions to either answer your question or submit a catalog request for you. I remember how it knows what catalog item or article to surface. They mentioned they train the bot based on the customers instance and weight the items. I didn't understand. I never got to use their product but I didn't understand they were using AI.</p>
<h2>Understanding AI/ML</h2>
<p>I saw a <a href="https://youtu.be/GVsUOuSjvcg?t=217">video</a> by Veratisum on March 4th, 2022 about analog computers and it made sense. He showed how in the 60s they were assigning weights to 20x20 pixel images of dogs to have the Perceptron identify if an image was a dog or not.</p>
<p>It took a while but this video is what made it click for me. I understood the concept. Assign weight things and ask questions so the AI could respond. This had been in my head for months. Then I came across Stable Diffusion and decided to try it out on November 6th. It amazed me, making images of everything. I was paying attention to swyx.io and he had a timeline of how <a href="https://lspace.swyx.io/p/open-source-ai">Open Source is eating AI</a>. To put this into perspective, Stable Diffusion became a thing on September 7th. I looked into Text to Text AI generation, but all I found was Kobold AI which I set up, but it was beyond me. Everything else was too computationally expensive.</p>
<p>Then ChatGPT came out. I was like many, impressed. I wanted to understand more and get Text to Text AI stuff running locally to try things. I hadn't read into OpenAI but I did later that day. One way I learn best is to try to make something. So I did that. I made a little button in ServiceNow to generate code for me. It was neat but I didn't think it would be useful to many. So I took inspiration from SN Utils' extension and started working on an extension. This was December 1st.</p>
<h2>Developing an Scribe.Monster</h2>
<p>I released my extension four days after making my OpenAI account. My first commit to <a href="https://scribe.monster/">https://scribe.monster</a> was on December 5th.</p>
<p>Since then, I've been consuming so much AI educational content.</p>
<p>Fine-tuning, Prompt engineering, one-shot, few-shot, and no-shot prompts. It's been a ride if you've been following along you likely have seen how the extension has changed.</p>
<p>I don't know where this will take me, but AI that was inaccessible before is now accessible everywhere. People are using it in crazy novel ways; some of them are dangerous while others are profound. At the end of the day it is a tool, a very complicated autocomplete.</p>
<p>I'd like to think this anti AI and pro AI stuff is like calculators. Back in the day, calculators weren't allowed for math work, <a href="https://www.quora.com/When-did-calculators-become-commonplace-in-high-school-classrooms">but then they were</a>, and things changed. People who grew up memorizing how to do math <a href="https://youtu.be/GYnRCb3ppAg?t=109">can still do it amazingly</a>, but those with calculators now needed one to do math as fast. Like calculators, AI will be a tool, except AI isn't something one can do in their head. You can create a prompt and it will give you an answer, for better or worse.</p>
<h2>The genie is out, and I don't see it being put back</h2>
<p>Here we are, at the end of this post. I hope it has helped you understand how I came to understand this stuff. For those who think AI is a fad and will go away, I disagree. I'm not in that group. It will stick around. <a href="https://www.linkedin.com/posts/rfedoruk_chatgpt-out-for-days-and-has-more-popular-activity-7007550799002173440-dkEL?utm_source=share&utm_medium=member_desktop">Robert Fedoruk posted this on Linkedin</a>;</p>
<p>"ChatGPT is out for days and has more popular appeal and use cases than BLOCKCHAIN. Edit: Full disclosure, just a good natured ribbing to my blockchain friends. I know there's some important stuff being worked on. Just showcasing how fast simple use cases scale."</p>
<p>That may have been posted in jest, but he's not wrong. Look at the applications folks are coming out with.</p>
<ul>
<li>Canva.com will create content, and create you an image</li>
<li>Notion.so will create content for you</li>
<li>Jasper will help you create content and identify AI-generated content</li>
<li>CopyAI will do copywriting.</li>
</ul>
Call User via Teams2022-11-17T05:20:54Zhttps://jace.pro/post/2022-11-17-call-user-via-teams/Jace Benson<p>Ajay Chavan wrote up a post about Adding
a Teams link to the user form and I thought
it was great. So I'm sharing it here with
my spin on it.. Here's <a href="https://www.servicenow.com/community/it-service-management-articles/service-now-microsoft-teams-integration/ta-p/2301655">his post about it though</a>.</p>
<h2>UI16/Next Experience</h2>
<ol>
<li>
<p>Download a teams icon, I got mine <a href="https://statics.teams.cdn.live.net/hashed/favicon/prod/favicon-32x32-4102f07.png">here</a></p>
</li>
<li>
<p>Upload the image to System UI > Images with a name of "teams.png"</p>
</li>
<li>
<p>Create a UI Macro called <code>incident_caller_teams_button</code>.</p>
</li>
</ol>
<pre class="language-xml"><code class="language-xml"><span class="token prolog"><?xml version="1.0" encoding="utf-8"?></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">j:</span>jelly</span> <span class="token attr-name">trim</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>false<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xmlns:</span>j</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>jelly:core<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xmlns:</span>g</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>glide<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xmlns:</span>j2</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>null<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xmlns:</span>g2</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>null<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">g:</span>evaluate</span> <span class="token attr-name">var</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>jvar_guid<span class="token punctuation">"</span></span> <span class="token attr-name">expression</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>gs.generateGUID(this);<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">j:</span>set</span> <span class="token attr-name">var</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>jvar_n<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>show_incidents_${jvar_guid}:${ref}<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>ref-button btn btn-default btn-ref<span class="token punctuation">"</span></span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>${jvar_n}<span class="token punctuation">"</span></span> <span class="token special-attr"><span class="token attr-name">onclick</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token value javascript language-javascript"><span class="token function">invokeChat</span><span class="token punctuation">(</span><span class="token string">'${ref}'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><span class="token punctuation">"</span></span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>img</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>teams.png<span class="token punctuation">"</span></span> <span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>30<span class="token punctuation">"</span></span> <span class="token attr-name">title</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Popup Teams<span class="token punctuation">"</span></span> <span class="token attr-name">alt</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>${gs.getMessage('Click to open Teams chat')}<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>script</span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"><br /><span class="token keyword">function</span> <span class="token function">invokeChat</span><span class="token punctuation">(</span><span class="token parameter">reference</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> tableAndField <span class="token operator">=</span> reference<span class="token punctuation">.</span><span class="token function">split</span><span class="token punctuation">(</span><span class="token string">'.'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> table <span class="token operator">=</span> tableAndField<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><br /> <span class="token keyword">var</span> field <span class="token operator">=</span> tableAndField<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><br /> <span class="token keyword">var</span> userSysId <span class="token operator">=</span> g_form<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span>field<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> email<span class="token punctuation">;</span><br /> <span class="token keyword">var</span> sysUser <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'sys_user'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>sysUser<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>userSysId<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> email <span class="token operator">=</span> sysUser<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token string">'email'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> teamsLink <span class="token operator">=</span> <span class="token string">'https://teams.microsoft.com/l/chat/0/0?users='</span> <span class="token operator">+</span> email<span class="token punctuation">;</span><br /> <span class="token keyword">var</span> w <span class="token operator">=</span> <span class="token function">getTopWindow</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> w<span class="token punctuation">.</span><span class="token function">open</span><span class="token punctuation">(</span>teamsLink<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span><br /> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>script</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"></</span><span class="token namespace">j:</span>jelly</span><span class="token punctuation">></span></span></code></pre>
<ol start="3">
<li>
<p>From the list view of the macro set the Media Type[<code>media_type</code>] to <code>doctype</code></p>
</li>
<li>
<p>Update the Caller ID's attributes to include the macros name as a ref_contribution like so;<code>ref_contributions=user_show_incidents;incident_caller_teams_button</code></p>
</li>
<li>
<p>Upload an attachment called teams.png with the teams logo.</p>
</li>
</ol>
Side hustles and interesting things folks in the ServiceNow space do2022-11-14T05:04:20Zhttps://jace.pro/post/2022-11-14-side-hustles-and-interesting-things-folks-in-the-servicenow-space-do/Jace Benson<p>I wanted to make a list of things folks in this space make outside of ServiceNow.</p>
<h2>Music</h2>
<ul>
<li>Jeff Pierce is a musician, checkout his album <a href="https://songwhip.com/thenothingleft/everything-right">The Nothing Left</a>.</li>
<li>Thomas Burnell is putting out the beats <a href="https://songwhip.com/arden2">all over</a> and has a <a href="https://www.youtube.com/watch?v=RUzoI1_Vg4E">Youtube</a>.</li>
</ul>
<h2>Textile</h2>
<ul>
<li>Tim Woodruff has an amazing Don't Panic cloth's that is described as "Grippy Textured Non-Slip Microfiber Cleaning Cloth Wipes". Here's a <a href="https://www.linkedin.com/posts/sn-timw_grippy-textured-non-slip-microfiber-cleaning-activity-6970788918757654528-zF0h?utm_source=share&utm_medium=member_desktop">LinkedIn post about them</a>. Here's the <a href="https://www.amazon.com/dp/B09SH3PJNV?&linkCode=ll1&tag=snprotips-20&linkId=5db868602eb19f0733d5ac70f71cf965&language=en_US&ref_=as_li_ss_tl/">Amazon link to buy 'em.</a></li>
<li>Thomas Burnell also is the guy behind <a href="https://mod570.com/pages/our-story">mod570</a> an activewear/comfort-wear clothing brand representing you, the modern day creator.</li>
</ul>
<h2>Craft</h2>
<ul>
<li>Robert Fedoruk is a man of many talents, I don't see a shop but he creates and sells soaps and leather goods. Get in touch on LinkedIn. Here's a link to <a href="https://www.linkedin.com/posts/rfedoruk_tired-of-boring-swag-that-ends-up-in-landfills-activity-6914582136645713920-rPAD?utm_source=share&utm_medium=member_desktop">his post from earlier this year</a>.</li>
<li>(I forgot your name!!!), but this gal I worked with in the past is making very craft tumblers. Here's her <a href="https://www.etsy.com/shop/FancyCupCreations">Etsy store FancyCupCreations</a>. Also if you want to hear her day-to-day on this she has a <a href="https://www.tiktok.com/@fancycupcreations">TikTok</a></li>
<li>Phylicia Rashad from the MTBF cohorts has a <a href="https://mytribe-essentials.com/">candle shop</a> found on <a href="https://twitter.com/LittleMs_MAC/status/1590344500635131906?s=20&t=WyDfMpydLUREg6LR1ZNtdQ">Twitter</a>.</li>
<li>Martin Ivanov was telling me about his woodworking and he has this <a href="https://www.linkedin.com/posts/martin-ivanov-01_servicenow-handmande-project-activity-6933724815069478912-RCp9?utm_source=share&utm_medium=member_desktop">fierce looking lighting fixture</a>. He's working on a catalog of items but until then DM him if you have a custom request.</li>
</ul>
<h2>Art</h2>
<ul>
<li>Ryan C Gillespie's wife has opened a original hand painted watercolor paintings Etsy shop <a href="https://www.etsy.com/shop/GigiGilleArt">GigiGilleArt</a></li>
<li>Andrew Albury-Dor has a sticker shop that's had some... interesting items on but have since been removed. It's still up and if you're a fan of Bluey and other fun things you might find something you love. Here's the link to his <a href="https://www.redbubble.com/people/dorsy99/shop">Redbubble shop</a>. Here's a secret item here for those <a href="https://www.redbubble.com/i/pin/Fladvocate-Flag-by-dorsy99/106895069.NP9QY">#fladvocates</a> you know.</li>
</ul>
<h2>Books</h2>
<ul>
<li>Stephanie Morillo has two books she sells about creating content and book publishing. Here's a <a href="https://www.stephaniemorillo.co/about">link to her about me page with more details</a>.</li>
<li>Chuck Tomasi wrote the book on podcasting! <a href="https://www.amazon.com/Podcasting-Dummies-Tee-Morris/dp/1119711819">Amazon</a>.</li>
<li>Tim Woodruff has a few books on the topic of <a href="https://books.snc.guru/">ServiceNow</a></li>
<li>Anders has a book on ServiceNow - <a href="https://www.amazon.com/Master-ServiceNow-10-000-Painful-Steps/dp/8269300713">How to Master ServiceNow in 10.000 Hard and Painful Steps</a></li>
<li>Goran has a book on ServiceNow - <a href="https://www.amazon.com/Witch-Doctors-Guide-ServiceNow-Knowledge/dp/179462631X">The Witch Doctor's Guide To ServiceNow</a></li>
</ul>
<h2>Courses</h2>
<ul>
<li>Toulson's <a href="https://codecreative.thinkific.com/courses/service-portal-crash-course">Service Portal Crash Course</a></li>
<li>Laurence Tindell has two course, <a href="https://www.udemy.com/course/hardware-asset-management-in-servicenow/">Hardware Asset Management in ServiceNow</a> and another for <a href="https://www.udemy.com/course/it-asset-management/">IT Asset Management</a></li>
</ul>
<p>## E-commerce</p>
<ul>
<li>Juan Villalta messaged me about his <a href="https://www.pricinglabels.ca/cjbase/">pricing label's site</a> he runs with a friend.</li>
</ul>
<h2>Tell me about yours</h2>
<p>If you have a side hustle or something you pitch I'd love to include it so shoot me a message wherever you can find me!</p>
Converting dates and times to readable fuzzy versions2022-11-12T02:14:11Zhttps://jace.pro/post/2022-11-12-converting-dates-and-times-to-readable-fuzzy-versions/Jace Benson<p>I am not sure where I got this but I thought it could be useful. You know how some sites show "3d ago" instead of the YYYY-MM-DD hh:mm:ss version. Here's a small function that does that for you.</p>
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">//debug lines</span><br /><span class="token keyword">var</span> yourUpdated <span class="token operator">=</span> <span class="token string">'2021-08-13T16:54:00Z'</span><br /><br /><span class="token keyword">let</span> <span class="token function-variable function">getFuzzyDate</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">dateTime</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> past <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Date</span><span class="token punctuation">(</span>dateTime<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getTime</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token comment">//ms since epoch</span><br /> <span class="token keyword">var</span> now <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Date</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getTime</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token comment">//now</span><br /> <span class="token keyword">var</span> differenceInSeconds <span class="token operator">=</span> <span class="token punctuation">(</span>now <span class="token operator">-</span> past<span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">1000</span><span class="token comment">//get seconds</span><br /> <span class="token keyword">var</span> thresholds <span class="token operator">=</span> <span class="token punctuation">[</span><br /> <span class="token punctuation">{</span> <span class="token literal-property property">threshold</span><span class="token operator">:</span> <span class="token number">60</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token literal-property property">divideBy</span><span class="token operator">:</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token literal-property property">fuzzyUnit</span><span class="token operator">:</span> <span class="token string">'s'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token punctuation">{</span> <span class="token literal-property property">threshold</span><span class="token operator">:</span> <span class="token number">60</span> <span class="token operator">*</span> <span class="token number">60</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token literal-property property">divideBy</span><span class="token operator">:</span> <span class="token number">60</span><span class="token punctuation">,</span> <span class="token literal-property property">fuzzyUnit</span><span class="token operator">:</span> <span class="token string">'m'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token punctuation">{</span> <span class="token literal-property property">threshold</span><span class="token operator">:</span> <span class="token number">24</span> <span class="token operator">*</span> <span class="token number">60</span> <span class="token operator">*</span> <span class="token number">60</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token literal-property property">divideBy</span><span class="token operator">:</span> <span class="token number">60</span> <span class="token operator">*</span> <span class="token number">60</span><span class="token punctuation">,</span> <span class="token literal-property property">fuzzyUnit</span><span class="token operator">:</span> <span class="token string">'h'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token punctuation">{</span> <span class="token literal-property property">threshold</span><span class="token operator">:</span> <span class="token number">30</span> <span class="token operator">*</span> <span class="token number">24</span> <span class="token operator">*</span> <span class="token number">60</span> <span class="token operator">*</span> <span class="token number">60</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token literal-property property">divideBy</span><span class="token operator">:</span> <span class="token number">24</span> <span class="token operator">*</span> <span class="token number">60</span> <span class="token operator">*</span> <span class="token number">60</span><span class="token punctuation">,</span> <span class="token literal-property property">fuzzyUnit</span><span class="token operator">:</span> <span class="token string">'d'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token punctuation">{</span> <span class="token literal-property property">threshold</span><span class="token operator">:</span> <span class="token number">365</span> <span class="token operator">*</span> <span class="token number">24</span> <span class="token operator">*</span> <span class="token number">60</span> <span class="token operator">*</span> <span class="token number">60</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token literal-property property">divideBy</span><span class="token operator">:</span> <span class="token number">30</span> <span class="token operator">*</span> <span class="token number">24</span> <span class="token operator">*</span> <span class="token number">60</span> <span class="token operator">*</span> <span class="token number">60</span><span class="token punctuation">,</span> <span class="token literal-property property">fuzzyUnit</span><span class="token operator">:</span> <span class="token string">'mo'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token punctuation">{</span> <span class="token literal-property property">threshold</span><span class="token operator">:</span> <span class="token number">100</span> <span class="token operator">*</span> <span class="token number">365</span> <span class="token operator">*</span> <span class="token number">24</span> <span class="token operator">*</span> <span class="token number">60</span> <span class="token operator">*</span> <span class="token number">60</span><span class="token punctuation">,</span> <span class="token literal-property property">divideBy</span><span class="token operator">:</span> <span class="token number">365</span> <span class="token operator">*</span> <span class="token number">24</span> <span class="token operator">*</span> <span class="token number">60</span> <span class="token operator">*</span> <span class="token number">60</span><span class="token punctuation">,</span> <span class="token literal-property property">fuzzyUnit</span><span class="token operator">:</span> <span class="token string">'y'</span> <span class="token punctuation">}</span><br /> <span class="token punctuation">]</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> filtered <span class="token operator">=</span> thresholds<span class="token punctuation">.</span><span class="token function">filter</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">grouping</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span><br /> <span class="token keyword">return</span> differenceInSeconds <span class="token operator"><</span> grouping<span class="token punctuation">.</span>threshold<br /> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">return</span> Math<span class="token punctuation">.</span><span class="token function">round</span><span class="token punctuation">(</span>differenceInSeconds <span class="token operator">/</span> filtered<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span>divideBy<span class="token punctuation">)</span> <span class="token operator">+</span> filtered<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span>fuzzyUnit <span class="token operator">+</span> <span class="token string">' ago'</span><br /><span class="token punctuation">}</span><br />console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token function">getFuzzyDate</span><span class="token punctuation">(</span>yourUpdated<span class="token punctuation">)</span><span class="token punctuation">)</span></code></pre>
Form annotations let you add html to workspaces and other UIs2022-11-12T02:02:05Zhttps://jace.pro/post/2022-11-12-form-annotations-let-you-add-html-to-workspaces-and-other-uis/Jace Benson<p>A long time ago Casey on Slack said you can make custom annotations. I was looking at them and wonder WHY would I ever use them. I know now when and why I might use this.</p>
<p>Have you ever been asked to add a link on a form to some other site or maybe some helpful text for a field but you needed better control. This lets you take control of the page without UI Macros and Formatters!</p>
<p>This works on UI16/Next Experiences</p>
<p><img src="https://jace.pro/static/img/annotation-ui16-next.png" alt="" /></p>
<p>This works on workspaces</p>
<p><img src="https://jace.pro/static/img/annotation-workspace.png" alt="" /></p>
<p>I wanted my annotation to look nice so I figured out how to make this look nice. So Here's my steps.</p>
<p>First you need to create a custom annotation to let you're annotations look good. Otherwise they get styled in a wide way that just looks bad to me.</p>
<p>I tried to set the style to simplify the HTML but nothing seemed to work and I left that empty.</p>
<p>Next you just add the annotation to your form. You need to use Form Layout, not Form Design and this is because you cannot access the HTML value for the annotation from Form Design.</p>
<p>Then just paste this in your html and put your code starting at the <code><a></code> tag below.</p>
<pre><code><label dir="ltr"
class=" col-xs-12 col-md-3 col-lg-4 control-label">
</label>
<div class="col-xs-10 col-sm-9 col-md-6 col-lg-5 form-field input_controls">
<div class="fieldmsg-container" aria-live="polite">
<div class="fieldmsg notification notification-info">
<a href="https://jace.pro">Jace's link</a>
🙌
</div>
</div>
</div>
</code></pre>
<p>PS. You can add onclick attributes and access g_form directly. So you could do some targeted setting of fields or special buttons for consistency without taking the space of UI Actions.</p>
<p>PPS. You can also wrap your put ${current.getValue('caller_id')} as well and that works on UI16/Next See Chuck Tomasi talks about it on <a href="https://youtu.be/Jzpv9IdI8aY?t=2784">Youtube</a></p>
Simple automation that your users can do!2022-11-10T03:00:49Zhttps://jace.pro/post/save-yourself-some-time-with-templates/Jace Benson<p>Account Locked out. That was the error message I got. So working backwards I was troubleshooting this production issue. A service account I used to create a Certificate was failing because it's account was locked out. The only folks with access was me and my team. I've never met anyone who enjoys working with them and generally I took the lead. So I tried authenticating on the web to the Certificate Authorities website. Sure enough it asked me to change my password. At this point I knew one of two things needed happen.</p>
<ol>
<li>Automate the password change</li>
<li>Automate a reminder to change the password</li>
</ol>
<p>I looked and looked at the APIs available to the service account but there was none to change the password. I asked the administrator if there was a way to exclude an account or some other automatic way to change the password and they shrugged and said no.</p>
<p>Defeated I knew I at least had a great tool to remind myself and team to change the password frequently enough to avoid this again.</p>
<h1>Scheduled Templates</h1>
<p>Haven't heard of them? They are OLD. Like pre-legacy workflow old.</p>
<h2>What you'll need</h2>
<p>To use them you need three things.</p>
<ol>
<li>A template</li>
<li>A user with rights (role: <code>template_scheduler</code>) to make a scheduled template</li>
<li>A schedule template</li>
</ol>
<h2>How to make one</h2>
<ol>
<li>When I do this I go and manually enter the data I want in the template on the record type I need.</li>
<li>Turn on the template bar, create a new template.</li>
<li>Now once you create the template you have to go to the template record (unfortunate, but out of box they hide the ui action from the form.) For now, we'll manually just go to the right place. In the filter of your navigation type <strong>sys_template.list</strong>. Open your template and you will see a schedule button, if you don't verify you have that <code>template_scheduler</code> role.</li>
<li>Assuming you are on the schedule entity generation record, fill out the frequency you want this created.</li>
<li>That's it.</li>
</ol>
<h2>Making it available to more users</h2>
<p>A few weeks after I did this I was asked by someone at security how can they create a repeating task. So I gave 'em access to the scheduled template, made links to templates (<code>sys_template</code>) and scheduled templates (<code>sysauto_template</code>) if they have the <code>template_scheduler</code> role. Now anyone can solve this problem with a little help from our team.</p>
<h2>How do they work?</h2>
<p>When you create a Scheduled Template, Servicenow creates a "Schedule" (sys_trigger) which is the same thing used for scheduled jobs, async business rules, inactivity monitors, sla calculations, metric events, upgrades and much more. It's not clear **how** it works under the hood but <a href="https://docs.servicenow.com/csh?version=latest&topicname=c_ScheduledJobs">ServiceNow's doc's don't say much more</a>. <a href="https://community.servicenow.com/community?id=community_question&sys_id=c60153e9dbdcdbc01dcaf3231f9619b0">Dirk wrote about some of this</a> but it's not well documented to I'd just be guessing.</p>
<h2>What about checklist templates?</h2>
<p>I had a note to talk about using checklists too but that's a bit much here. If you're curious about that follow <a href="https://bibingokuldas.wordpress.com/2020/12/17/now-platform-templates-n-checklists/">Bibin Gokuldas's blog about it</a>.</p>
Integrate Gsuite and ServiceNow Using a Google Service Account and JWT (from cache)2022-10-12T19:39:57Zhttps://jace.pro/post/2022-10-12-integrate-gsuite-and-servicenow-using-a-google-service-account-and-jwt-from-cache/Ward van Hoof<p>Today on Slack, mdev asked about a post that seems to be archived. mdev found it and shared the cache link. I am not sure who will need this but I think it's worth keeping.</p>
<p>After being stuck at a client for months, i decided to try whatever it took to get our integration running. After i got it working, i decided to note all my steps for my client (and future consultants). This post is derived from that support document.</p>
<p>See also my post on the community:
https://community.servicenow.com/community?id=community_question&sys_id=2a88e632db6c8850f7fca851ca96...</p>
<h2>1 Google set up</h2>
<p>In Gsuite, a service account with domain wide delegation needs to be registered. It should receive all scopes (roles) which are going to be used in the integration. Gsuite will provide you with a JSON containing the authentication information. This JSON should look like this: (broken image not copied)</p>
<h2>2 Generate authentication JSK</h2>
<p>From the authentication information:</p>
<ul>
<li>Unescape the private key and store it locally</li>
<li>Unescape the client key which you retrieve when entering the value of “client_x509_cert_url” in your browser, and store it locally
Navigate to the folder and run this command (Ubuntu)</li>
</ul>
<p><code>openssl pkcs12 -export -in [path to certificate] -inkey [path to private key] -certfile [path to certificate] -out [p12_file_name].p12</code></p>
<p>Enter a password twice. Run the following command</p>
<p><code>keytool -importkeystore -srckeystore [p12_file_name].p12 -srcstoretype pkcs12 -destkeystore [jks_file_name].jks -deststoretype JKS</code></p>
<p>for every prompt, use the same password as in the previous step. Now you have a .jks file with your credentials.</p>
<p>Delete the locally stored keys as soon as you have the JSK.</p>
<h2>3 Register oauth in ServiceNow</h2>
<h3>3.1 Certificate</h3>
<p>Register a new x509 Certificate (sys_certificate)</p>
<p>Type: Java Key Store
Key store password: the password entered in (2)
Attachment: attach the generated .jks file
Delete the local .jks file</p>
<h3>3.2 JWT key</h3>
<p>Register a JWT key (jwt_keystore_aliases)</p>
<p>Signing Keystore: the certificate just registered
Signing Algorithm: RSA 256
Signing Key password: same as entered in (2)
Key Id: leave blank
Active: true</p>
<h3>3.3 JWT Provider</h3>
<p>Register a JWT provider (jwt_provider)</p>
<p>Signing Configuration: record registered under (3.2)
Related list: standard claims
aud: https://oauth2.googleapis.com/token
iss: client_email from the Gsuite JSON
sub: Email of an admin account
Related list: Custom Claims
scope Space separated domains you need to access,
eg: https://www.googleapis.com/auth/admin.directory.group.readonly</p>
<h3>3.4 Application Registry</h3>
<p>Register an Application Registry (oauth_entity)</p>
<p>Client ID: If the field is mandatory, use script to make blank after saving (if the field is filled, the integration fails because the basic auth is used instead of the JSK attachment)
Client Secret: If the field is mandatory, use script to make blank after saving
Default Grant Type: JWT bearer
Refresh Token Lifespan: 60
Authorizaiton URL: https://accounts.google.com/o/oauth2/auth
Token URL: https://oauth2.googleapis.com/token
Token Revocation URL: https://accounts.google.com/o/oauth2/revoke
Redirect URL: https://<your-instance>.service-now.com/oauth_redirect.do</your-instance></p>
<h4>3.4.1 OAuth entity profiles</h4>
<p>Oauth Provider: Application registery of (3.4)
Grant type: JWT Bearer
JWT Provider: JWT provider of (3.3)
OAuth Entity Profile Scopes (related list): Leave Empty</p>
<h4>3.4.2 Oauth entity scopes</h4>
<p>OAuth provider: Application registry of (3.4)
OAuth scope: The scope you need access to</p>
<h3>3.5 Rest message</h3>
<p>Register a Rest message (sys_rest_message)</p>
<p>Endpoint: https://www.googleapis.com/oauth2/v3/token
Authentication type: Oauth 2.0
Oauth Profile: Application registry of (2.4)</p>
<h3>3.6 HTTP Method</h3>
<p>Register a HTTP Method (sys_rest_message)</p>
<p>Endpoint Endpoint from google docs
Correct scopes for the endpoint have to be declared (both on the Oauth entity scope (3.4.2) AND the “sub” claim (3.3)
e.g. https://www.googleapis.com/admin/directory/v1/groups requires https://www.googleapis.com/auth/admin.directory.group.readonly
Authentication type: Inherent from parent</p>
<h2>4 Scopes</h2>
<p>The service account as defined in Google has certain access rights. To invoke these rights, the API call must declare them as scopes. This has to be done at 2 locations</p>
<p>The JWT Profile definition (space separated) (3.3)
The OAuth Entity Scopes related list of the Application registry (3.4.2)
The definitions at these two locations must match.</p>
<p>The Endpoint access (3.6) has right restrictions. The correct scopes have to be invoked in order to have the endpoint expose its data.</p>
<p>For endpoints with their required scopes, check:</p>
<p>https://developers.google.com/admin-sdk/directory/v1/reference</p>
<p>Scope overview:</p>
<p>https://developers.google.com/admin-sdk/directory/v1/guides/authorizing.html</p>
<p>OAuth authentication (click “HTTP/REST”).</p>
<p>https://developers.google.com/identity/protocols/OAuth2ServiceAccount</p>
<p>https://developers.google.com/identity/protocols/OAuth2ServiceAccount#formingclaimset</p>
<h2>5 Debugging</h2>
<p>Error message when retrieving OAuth token:</p>
<p style="color:red">OAuth flow failed. Verify the configurations and try again. Error detail:invalid_scope, Invalid downscoping, scopes should not be specified as a request parameter.</p>
<p>Make sure the related list “OAuth Entity Profile Scopes” on your OAuth entinty profile is empty</p>
<p style="color:red">OAuth flow failed. Verify the configurations and try again. Error detail:invalid_scope, Empty or missing scope not allowed.</p>
<p>Check the scope entered under the claim “scope” (3.4.1)</p>
<p>You receive an access token, but the request is “403: forbidden”</p>
<p>Check you are impersonating the correct user (3.4.1, the email address entered as claim “sub”)</p>
<p>Source: https://www.servicenow.com/community/contentarchivals/contentarchivedpage/message-uid/2325489</p>
Scoped Metrics Fail2022-06-11T07:17:57Zhttps://jace.pro/post/2022-06-11-scoped-metrics-fail/Jace Benson<!--StartFragment-->
<p>This has been in my queue for a bit to figure out.</p>
<p>I tried this again with a fresh scoped application and this is not currently possible to do entirely within a scope. At some point you need to either shim in access to a script include or create something in global.</p>
<p>I'll walk through the working solution for whatever poor soul happens across this.</p>
<ol>
<li>Create a scoped application.</li>
<li>Create a table called "Content"</li>
<li>Add two fields, "Title" (string), "Stage" (choice)</li>
<li>Give Stage a few choices.</li>
<li>We're done in the scope.</li>
<li>Switch to global</li>
<li>Copy the rule "metric events", and point it to your scoped table.</li>
<li>That's it.</li>
</ol>
<p>Now I feel like I need to argue with myself.</p>
<p>"Come on, it can't be impossible."</p>
<p>Okay, lets walk through the last 3 hours of my life.</p>
<h1>The business rule</h1>
<p>I created a scope, table, copied the business rule, "metrics events".</p>
<p>Created a Fix Script to test running this quickly.</p>
<h2>GlideScriptRecordUtil is not available in scopes.</h2>
<p>So this was used to get the fields that changed. Okay some work and I got a working scoped version here.</p>
<pre class="language-javascript"><code class="language-javascript"><span class="token keyword">function</span> <span class="token function">getChangedFieldNames</span><span class="token punctuation">(</span><span class="token parameter">gr</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> result <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> elements <span class="token operator">=</span> gr<span class="token punctuation">.</span><span class="token function">getElements</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> size <span class="token operator">=</span> elements<span class="token punctuation">.</span>length<span class="token punctuation">;</span><br /> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">var</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> size<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> ge <span class="token operator">=</span> elements<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>ge<span class="token punctuation">.</span><span class="token function">changes</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> result<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>ge<span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">return</span> result<span class="token punctuation">;</span><br /><span class="token punctuation">}</span></code></pre>
<p>Once that's added to the business rule we can call it instead of <code>GlideScriptRecordUtil</code>.</p>
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">//var gru = new GlideScriptRecordUtil.get(current);</span><br /><span class="token comment">//var fieldsChanged = gru.getChangedFieldNames();</span><br /><span class="token keyword">var</span> fieldsChanged <span class="token operator">=</span> <span class="token function">getChangedFieldNames</span><span class="token punctuation">(</span>current<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<h2>addActiveQuery is not available in scopes.</h2>
<p>Okay updated the `getDefinitions` function to use gr.addQuery('active', 'true');</p>
<h2>GlideDBObjectManager.getTables() is not available in scope.</h2>
<p>There's a replacement</p>
<pre class="language-javascript"><code class="language-javascript"><span class="token keyword">var</span> tables <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideTableHierarchy</span><span class="token punctuation">(</span>table<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p>Then when you would have called tables before you call <code>tables.getTables();</code></p>
<h2>metric.update is not available or found for scope.</h2>
<p>So either I don't know how to give permission to generate a global event OR I need to create a scoped version of the event and trigger it.</p>
<p>Created a the scoped version of the event and updated the <code>gs.eventQueue</code> line to</p>
<pre class="language-javascript"><code class="language-javascript">gs<span class="token punctuation">.</span><span class="token function">eventQueue</span><span class="token punctuation">(</span><br /> <span class="token string">'x_8821_testmetric.metric.update'</span><span class="token punctuation">,</span> <br /> current<span class="token punctuation">,</span> <br /> fields<span class="token punctuation">,</span> <br /> current<span class="token punctuation">.</span>sys_mod_count<span class="token punctuation">,</span> <br /> <span class="token string">'metric_update'</span><br /><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p>At this point you have a working rule that <strong>should</strong> work if you can get the event to process. Since this is a different script I'm breaking this up here.</p>
<h1>The Script Action</h1>
<p>Created a copy of the script action that processes <code>metric.update</code>.</p>
<p>Because it's async, created another fix script and emulated running the code there.</p>
<h2>GlideDBObjectManager.getTables not available in scope</h2>
<p>We solved this before, so just solved that the same way. Well nearly, I passed in a table since I was having some other problem with my fix script.</p>
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">//var tables = GlideDBObjectManager.getTables(current.getTableName());</span><br /><span class="token keyword">var</span> tables <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideTableHierarchy</span><span class="token punctuation">(</span>table<span class="token punctuation">)</span><span class="token punctuation">;</span><br />gr<span class="token punctuation">.</span><span class="token function">addQuery</span><span class="token punctuation">(</span><span class="token string">'table'</span><span class="token punctuation">,</span> tables<span class="token punctuation">.</span><span class="token function">getTables</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p>Nail in the coffin is next.</p>
<h2>GlideRecordRollback not available in scope</h2>
<p>I don't see a way around this unless someone reverse engineers how the <code>toVersion</code> function works. I looked and didn't find anything.</p>
<p>If anyone else wants to try this please have it and comment on the <a href="https://community.servicenow.com/community?id=community_question&sys_id=966e14621b824814d01143f6fe4bcbd7">thread</a> here so I can follow along with my ????.</p>
<h1>References</h1>
<p><a href="https://community.servicenow.com/community?id=community_question&sys_id=966e14621b824814d01143f6fe4bcbd7">Original Post</a></p>
<p><a href="https://docs.servicenow.com/csh?version=latest&topicname=c_MetricDefinitionSupport">Docs on Metric Definitions that say create a rule</a></p>
<p>Final Business Rule in global.</p>
<pre class="language-javascript"><code class="language-javascript"><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token function">executeRule</span><span class="token punctuation">(</span>current<span class="token punctuation">,</span> previous <span class="token comment">/*null when async*/</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token function">queueMetricUpdate</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">function</span> <span class="token function">queueMetricUpdate</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <br /> <span class="token keyword">var</span> gru <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideScriptRecordUtil<span class="token punctuation">.</span>get</span><span class="token punctuation">(</span>current<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> fieldsChanged <span class="token operator">=</span> gru<span class="token punctuation">.</span><span class="token function">getChangedFieldNames</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> gr <span class="token operator">=</span> <span class="token function">getDefinitions</span><span class="token punctuation">(</span>fieldsChanged<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> fields <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">;</span><br /> <span class="token keyword">while</span> <span class="token punctuation">(</span>gr<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> fields <span class="token operator">+=</span> gr<span class="token punctuation">.</span>field <span class="token operator">+</span> <span class="token string">','</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>fields<span class="token punctuation">.</span>length <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> fields <span class="token operator">=</span> <span class="token string">'['</span> <span class="token operator">+</span> fields<span class="token punctuation">.</span><span class="token function">substring</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> fields<span class="token punctuation">.</span>length <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">']'</span><span class="token punctuation">;</span><br /> gs<span class="token punctuation">.</span><span class="token function">eventQueue</span><span class="token punctuation">(</span><span class="token string">'metric.update'</span><span class="token punctuation">,</span> <br /> current<span class="token punctuation">,</span> <br /> fields<span class="token punctuation">,</span> <br /> current<span class="token punctuation">.</span>sys_mod_count<span class="token punctuation">,</span> <br /> <span class="token string">'metric_update'</span><br /> <span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span><br /> <span class="token keyword">function</span> <span class="token function">getDefinitions</span><span class="token punctuation">(</span><span class="token parameter">fields</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> gr <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideAggregate</span><span class="token punctuation">(</span><span class="token string">'metric_definition'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> gr<span class="token punctuation">.</span><span class="token function">addActiveQuery</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> tables <span class="token operator">=</span> GlideDBObjectManager<span class="token punctuation">.</span><span class="token function">getTables</span><span class="token punctuation">(</span>current<span class="token punctuation">.</span><span class="token function">getTableName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> gr<span class="token punctuation">.</span><span class="token function">addQuery</span><span class="token punctuation">(</span><span class="token string">'table'</span><span class="token punctuation">,</span> tables<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> gr<span class="token punctuation">.</span><span class="token function">addQuery</span><span class="token punctuation">(</span><span class="token string">'field'</span><span class="token punctuation">,</span> fields<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> gr<span class="token punctuation">.</span><span class="token function">groupBy</span><span class="token punctuation">(</span><span class="token string">'field'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> gr<span class="token punctuation">.</span><span class="token function">query</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">return</span> gr<span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">(</span>current<span class="token punctuation">,</span> previous<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
Better Links - A share item from Casey Barela2022-06-09T04:14:32Zhttps://jace.pro/post/2022-06-09-better-links-a-share-item-from-casey-barela/Jace Benson<p>Copying links in ServiceNow isn't terrible but it could be better.</p>
<p>Casey B. must have felt that way too because he made it better.</p>
<p>This share item, <a href="https://developer.servicenow.com/connect.do#!/share/contents/3931356_copy_quick_link?v=1.0&t=PRODUCT_DETAILS">Copy Quick Link</a>, adds a UI Action on the task table to copy a more descriptive link to the current item.</p>
<p>I made a video going over this too, check it out.</p>
<!--StartFragment-->
<p><a href="https://www.youtube.com/watch?v=FM8cIVFPkjk" title="Video Title"><img src="https://img.youtube.com/vi/FM8cIVFPkjk/0.jpg" alt="Better Links in ServiceNow video" /></a></p>
<!--EndFragment-->Cancelling a flow2022-06-07T00:43:27Zhttps://jace.pro/post/2022-06-07-cancelling-a-flow/Jace Benson<!--StartFragment-->
<p><strong>What is the post about?</strong><br />
Cancelling Workflows<br />
<strong>What things would help with writing the post</strong></p>
<p>Something almost always asked for and rarely delivered is the ability to cancel a requested item. I’ll try to explain why this is so difficult and how I’ve suggested implementing this.</p>
<p>Why is this difficult? The problem is not with the actual canceling the requested item. It’s because asking groups to undo what they did is not a simple statement.</p>
<p>Take for example the following workflow. There’s an approval and two tasks.</p>
<p><img src="https://jace.pro/static/img/cancelling-a-flow.png" alt="cancelling-a-flow" /></p>
<p>Say this item gets cancelled before “Create email” is complete. Do we assume someone needs to check if the email was created but not activated, or just make a task to remove the AD account. Do we need to inform the approval chain?</p>
<p>This is a pretty simple example, but should show some of the issues with trying to cancel an item. I’m of the opinion that I think there are two ways to broadly address this, and one way to specifically address it.</p>
<ul>
<li>For each task updated (sys_mod_count>0) create a task to undo work done in task #.</li>
<li>Create a task to the group to undo all work done from this ritm#.</li>
<li>For specific have a path in your workflow waiting for the cancel and depending where the workflow is, create appropriate tasks to cancel this item completely.</li>
</ul>
<p>The first option will require less involvement from each group to set up, but may find some tasks don’t make sense. Imagine you have a request to make a doctors account in Epic. Sometimes the folks who make the account don’t give the roles. So if you had two tasks one to create the account and another to give the roles. If the group who made the account got a task to “undo” the account, the roles couldn’t be removed.</p>
<p>The second option requires you to identify a single group who is primary owner for the group (which has other great benefits but I’m not going to go into those now). That has some office politics attached and more often then not if this is done I’ll bet a number of non service now items are owners of automated or complex items.</p>
<p>The third option would only work for items where the cancelling was thought through at the time the item was sized or after a conversation came up to clear up questions. Where this is different from the first option is this will create very specific tasks per the workflow. The first option would always make “undo” tasks.</p>
<!--EndFragment-->Export to CSV (Custom)2022-06-07T00:32:04Zhttps://jace.pro/post/2022-06-07-export-to-csv-custom/Jace Benson<!--StartFragment-->
<p><strong>What is the post about?</strong></p>
<p>Exporting to a custom CSV format. There's probably a better way to do this. Here's a way I've done it.</p>
<p><strong>What things would help with writing the post</strong></p>
<!--EndFragment-->
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">// Export to CSV </span><br /><span class="token keyword">var</span> attachment <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideSysAttachment</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token keyword">var</span> data <span class="token operator">=</span> <span class="token string">"Number,Name\n"</span><br /><span class="token keyword">var</span> gr <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'incident'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br />gr<span class="token punctuation">.</span><span class="token function">addQuery</span><span class="token punctuation">(</span><span class="token string">'active'</span><span class="token punctuation">,</span> <span class="token string">'true'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br />gr<span class="token punctuation">.</span><span class="token function">query</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token keyword">while</span><span class="token punctuation">(</span>gr<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> data <span class="token operator">+=</span> gr<span class="token punctuation">.</span>number <span class="token operator">+</span> <span class="token string">","</span> <span class="token operator">+</span> gr<span class="token punctuation">.</span>caller_id<span class="token punctuation">.</span>name <span class="token operator">+</span> <span class="token string">"\n"</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span><br />incident <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'incident'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br />incident<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'85071a1347c12200e0ef563dbb9a71c1'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//Gets the record I want to attach the file too</span><br /><br /><span class="token keyword">var</span> newFile <span class="token operator">=</span> attachment<span class="token punctuation">.</span><span class="token function">write</span><span class="token punctuation">(</span>incident<span class="token punctuation">,</span> <span class="token string">'Incidents.csv'</span><span class="token punctuation">,</span> <span class="token string">'text/csv'</span><span class="token punctuation">,</span> data<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
Making killer emails2022-06-07T00:31:37Zhttps://jace.pro/post/2022-06-07-making-killer-emails/Jace Benson<!--StartFragment-->
<p><strong>What is the post about?</strong><br />
Using MJML for emails.</p>
<p><strong>What things would help with writing the post</strong></p>
<ul>
<li><a href="https://mjml.io/templates/receipt-email">https://mjml.io/templates/receipt-email</a></li>
<li><a href="https://mjml.io/try-it-live/BkYkzL-G4">https://mjml.io/try-it-live/BkYkzL-G4</a></li>
</ul>
<!--EndFragment-->
<p>A few years ago I was working with someone on setting up an email series from ServiceNow to let folks know they are due to replace their computer. They were very concerned with how the email worked. That was how I came across MJML. MJML is an amazing framework to generate better supported HTML for all email clients. <a href="https://caniuse.email/">Email clients are still the wild west</a> when it comes to controlling how an email works.</p>
<p>Okay, one thing my first amazing boss in tech told me was about writing emails. She said "Short and concise is what you want". She wasn't wrong. Emails subjects are the first or second things folks see. You need to make it clear and that email NEEDS to have an ACTIONABLE item.</p>
<p>You can choose to send non-actionable emails but if you're like me you just ignore those messages. At a high level here's the X things you need to do to make a great email.</p>
<ol>
<li>Get their attention with a concise subject.</li>
<li>Make it clear what action you want them to take.</li>
<li>Make it meaningful.</li>
<li>Make it look nice!</li>
</ol>
<h2>Concise Subjects</h2>
<p>Depending on the goal of the email (imagine cancel a meeting, schedule a meeting, ask a question, share a critical detail, get an approval).</p>
<p>If the readers have to click into the email you just wasted some time. Sometimes you need to say more but then you can do that in the body, but the reader should know what they are getting into.</p>
<p>Sometimes that email is a multifactor authentication email, that should contain the code in the subject. I don't want to click that email to get it.</p>
<h2>Clear Call to Action</h2>
<p>Coming back to what the goal is, your email should have ONE. An email is effectively a tool to just get someone to take some action. If you're not expecting an action, why are you sending the email?</p>
<h2>Make it Meaningful</h2>
<p>I'm interested in ServiceNow, RedwoodJS, Design and family stuff. If I get an email about lip balm, I aint opening that. If I get an email that doesn't provide some provide insight about one of those topics or doesn't apply to me. Think about hte "Incident has been updated" emails where it is just a link. That's silly. It might not even be actionable. It's a waste of time.</p>
<h2>Make is Look Nice</h2>
<p>There's three kinds of emails you want to send. Automated and hand-written, and automated hand-written.</p>
<p>Hand-written emails should be plaintext and be written by you to convey a point or ask something of the reader.</p>
<p>Automated emails should look nice, feel free to use images and HTML to make this look great.</p>
<p>Automated hand-written should be sent automatically but should be plaintext and replies should be handled by a person.</p>
Alternatives to the attachment API in ServiceNow2022-06-07T00:30:01Zhttps://jace.pro/post/2022-06-07-alternatives-to-the-attachment-api-in-servicenow/Jace Benson<p>Storage in ServiceNow is expensive. Because of that, I'd encourage you to AVOID this for your work's budget. That being said, if you find you need to upload attachments programtically, this post might be helpful as these ways aren't clearly defined in the other sources.</p>
<p>There's three ways to upload attachments to ServiceNow.</p>
<h3>REST Attachment API</h3>
<p>The <a href="https://docs.servicenow.com/search?q=attachment%20api">Attachment API</a> is probably the one most will use. It works generally how you would expect, you can get the file content, meta data, post a new file, delete a file. One thing to note. When creating a file you must have a valid table and sys_id that will have the file.</p>
<h3>Web Services (soap)</h3>
<p>This is not recommended, ServiceNow recommends the REST Attachment API.</p>
<p>Like the REST Attachment API, this also says it requires a table and sys_id albeit, but that isn't true. So you can attach things to random places like how catalog item attachments get created.</p>
<h3>Related Uploads</h3>
<p>Sometimes you don't only want to upload a file but you also want to tranform the data in the file. There's a special endpoint to handle that as Josh Nerius wrote a few years ago;</p>
<blockquote>
<p>[attachment api] can be used to attach a file to a record in ServiceNow, but it does not facilitate loading/transforming attached data.</p>
<p>Instead, take a look at this page on the docs site: Post CSV or Excel files directly to an import set. This allows you to upload an attachment to a special endpoint that will then load the attached data into an Import Set table and Transform it.</p>
<p>Before posting the file, you must first set up an Import Set and Transform map. Here's a post that explains the basics: Getting Started with Import Sets.</p>
<p>In summary, you will need to:</p>
<p>Create an Import Set / Transform Map
Use the special sys_import.do endpoint with the parameters described above to upload the file - <a href="https://www.servicenow.com/community/developer-forum/send-attachment-using-rest-api/m-p/1486913/highlight/true#M143839">Josh Nerius 2017</a></p>
</blockquote>
<h3>Sources</h3>
<ul>
<li><a href="https://hi.service-now.com/kb_view.do?sysparm_article=KB0546294">https://hi.service-now.com/kb_view.do?sysparm_article=KB0546294</a></li>
<li><a href="https://www.servicenow.com/community/developer-forum/send-attachment-using-rest-api/m-p/1486913/highlight/true#M143839">https://www.servicenow.com/community/developer-forum/send-attachment-using-rest-api/m-p/1486913/highlight/true#M143839</a></li>
<li><a href="https://docs.servicenow.com/bundle/vancouver-api-reference/page/integrate/inbound-soap/reference/r_AttachmentCreatorSOAPWebService.html">https://docs.servicenow.com/bundle/vancouver-api-reference/page/integrate/inbound-soap/reference/r_AttachmentCreatorSOAPWebService.html</a></li>
<li><a href="https://docs.servicenow.com/bundle/vancouver-api-reference/page/integrate/inbound-rest/concept/c_AttachmentAPI.html">https://docs.servicenow.com/bundle/vancouver-api-reference/page/integrate/inbound-rest/concept/c_AttachmentAPI.html</a></li>
</ul>
Resources2022-06-07T00:19:35Zhttps://jace.pro/resources/Jace Benson<table>
<thead>
<tr>
<th>Tools</th>
<th>Labs + Learning</th>
<th>Community</th>
<th>Documentation</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://bootsnipp.com/forms">Bootstrap Form Builder</a></td>
<td><a href="https://developer.servicenow.com/connect.do#!/event/knowledge18">K18</a></td>
<td><a href="https://stackoverflow.com/questions/tagged/servicenow">StackOverflow</a></td>
<td><a href="https://developer.servicenow.com/">Developer</a></td>
</tr>
<tr>
<td><a href="https://workflow.jace.pro/">Workflow Diagrammer</a></td>
<td><a href="https://developer.servicenow.com/connect.do#!/event/creatorcon18">K18 CreatorCon</a></td>
<td><a href="https://reddit.com/r/servicenow">Reddit</a></td>
<td><a href="https://docs.servicenow.com/">Docs</a></td>
</tr>
<tr>
<td><a href="https://code.jace.pro/">Code Collab</a></td>
<td><a href="https://developer.servicenow.com/connect.do#!/event/knowledge19">K19</a></td>
<td><a href="https://www.meetup.com/pro/servicenowdevprogram/">Meetups</a></td>
<td><a href="https://hi.service-now.com/styles/heisenberg/styleguide/docs/index.html">Style Guide</a></td>
</tr>
<tr>
<td><a href="https://github.com/jacebenson/servicenow-code">code search</a></td>
<td><a href="https://developer.servicenow.com/connect.do#!/event/naw19">Now @ Work '19</a></td>
<td><a href="https://discord.gg/QaMwnGd">Discord</a></td>
<td><a href="https://hi.service-now.com/styles/retina_icons/retina_icons.html">Retina Icons</a></td>
</tr>
<tr>
<td><a href="https://dev-labs.io/">Dev-Labs.io</a></td>
<td><a href="https://developer.servicenow.com/connect.do#!/event/knowledge2020">K20</a></td>
<td><a href="https://sndevs.slack.com/">Slack</a></td>
<td><a href="https://code.angularjs.org/1.5.3/docs/api">Angular 1.5.x</a></td>
</tr>
<tr>
<td><a href="https://sndocs.jace.pro/">ServiceNow Versions</a></td>
<td><a href="https://developer.servicenow.com/connect.do#!/event/knowledge2021">K21</a></td>
<td><a href="https://developer.servicenow.com/app.do#!/share">Share</a></td>
<td><a href="https://getbootstrap.com/docs/3.3/components/">Bootstrap 3.3</a></td>
</tr>
<tr>
<td><a href="https://sndocs.jace.pro/"></a></td>
<td><a href="https://developer.servicenow.com/connect.do#!/event/knowledge2022">K22</a></td>
<td><a href="https://developer.servicenow.com/connect.do#!/events/">Upcoming Events</a></td>
<td><a href="https://angular-ui.github.io/bootstrap/">UI Bootstrap</a></td>
</tr>
<tr>
<td></td>
<td><a href="https://nowlearning.service-now.com/lxp">Now Learning</a></td>
<td><a href="https://info.servicenow.com/LiveOnServiceNow-ITSM">IT Events</a></td>
<td><a href="https://sn.jace.pro/">Unofficial Docs</a></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td><a href="https://sn.jace.pro/properties">Unofficial Props</a></td>
</tr>
</tbody>
</table>
Useful reports on variables2022-06-07T00:01:44Zhttps://jace.pro/post/2022-06-07-useful-reports-on-variables/Jace Benson<h2>Where's the data stored</h2>
<table>
<thead>
<tr>
<th>Type</th>
<th>Table</th>
</tr>
</thead>
<tbody>
<tr>
<td>Record Producer</td>
<td>question_answer</td>
</tr>
<tr>
<td>Catalog Item</td>
<td>sc_item_option_mtom</td>
</tr>
<tr>
<td>MRVS</td>
<td>sc_multi_row_question_answer</td>
</tr>
</tbody>
</table>
<h2>What do you do with the data</h2>
<p>If variable options are just not used, is it safe to exclude them or assume the popular is the default? This could have big wins for UX.</p>
<p>If items are not used is it safe to just remove the item etc. etc.</p>
Communicate Like a Pro: Spoken and Written Communication2022-06-06T22:30:02Zhttps://jace.pro/post/2022-06-06-communicate-like-a-pro-spoken-and-written-communication/Jace Benson<h2>Introduction</h2>
<p>Speaking, Listening, and Writing are critical skills when it comes to communicating. I've taken some notes on the topic and here they may help you.</p>
<h2>Spoken Communication</h2>
<p>When engaging in spoken communication, it’s important to practice active listening. This means putting away phones and other distractions so that you can be fully present. Listen and understand what the other person is saying. Avoid pontificating and multi-tasking. Additionally, use open-ended to keep the conversation flowing.</p>
<p><a href="https://youtu.be/R1vskiVDwl4">Celeste Headlee has outlined 10 rules</a> to help ensure effective communication:</p>
<ul>
<li>Don’t multi-task. Put away your phone or clicker. Actually be present. Do not be half in and out of the conversation.</li>
<li>Don’t pontificate - enter every conversation assuming you have something to learn.</li>
<li>Use open ended questions. Complicated questions generally get simple answers.</li>
<li>Go with the flow. When thoughts come into your mind, you need to let them go out of your mind. When you hold that thought you may stop listening.</li>
<li>If you don’t know. Say that you don’t know. Don’t make your talk cheap. Say things as if you are going on the record. Error on the the side of caution.</li>
<li>Don’t equate your experience with theirs. If they are talking about losing a family member don’t talk about the time you lost a family member. All experiences are individual. It is not about you. You don’t need to take that moment to prove how amazing you are or how much you suffered.</li>
<li>Try not to repeat yourself. It’s condescending and boring and done all the time. We keep rephrasing the point over and over, don’t do that.</li>
<li>Stay out of the weeds. People care about you. Remembering the dates and who aren’t as important as finding out what your like and what you have in common.</li>
<li>Listen.</li>
<li>Be brief.</li>
</ul>
<h2>Written Communication</h2>
<p>It’s important to be aware of certain techniques that can help make your writing more effective.</p>
<p>Here are some tips for ensuring effective written communication:</p>
<ul>
<li>Strong Subjects are important.
<ul>
<li>Avoid the words "There" and "It" as they are better ways to refer to the subject. <a href="https://www.youtube.com/watch?v=9S1UlvDHozE">Video 5 min</a></li>
<li>Avoid passive voice. You can do this by eliminating the nominalization(verbs becoming nouns).<a href="https://www.youtube.com/watch?v=99pnFKIt2Ck">Video 3 min</a></li>
</ul>
</li>
<li>Strong Verbs
<ul>
<li>Keep subjects and verbs close. <a href="https://www.youtube.com/watch?v=6_gh15VTrp4">Video 5 min</a></li>
<li>Use the active voice. <a href="https://www.youtube.com/watch?v=w3JRAfwiQA8">Video 6 min</a></li>
<li>Understanding active verbs and passive verbs. <a href="https://www.youtube.com/watch?v=QGX8x-ymFmY">Video 5 min</a></li>
</ul>
</li>
</ul>
<h2>Quiz and Resources</h2>
<ul>
<li><a href="https://www.mindtools.com/pages/article/newCS_99.htm">Quiz - How Good Are Your Communication Skills?</a></li>
<li><a href="https://www.amazon.com/Communicating-Effectively-Dummies-Marty-Brounstein/dp/0764553194">Book: Communicating Effectively for Dummies</a></li>
</ul>
<h2>Conclusion</h2>
<p>Communicating is something we can all improve and should always work on.</p>
What is a shard and how can I find the one this table is on?2022-06-06T22:06:55Zhttps://jace.pro/post/2022-06-06-what-is-a-shard-and-how-can-i-find-the-one-this-table-is-on/Jace Benson<p>I have this code snippet;</p>
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">// The following script (or variant thereof) can be used in </span><br /><span class="token comment">// /sys.scripts.do or in a server-side script to determine</span><br /><span class="token comment">// the current shard for a table. </span><br /><br /><span class="token function">printCurrentShard</span><span class="token punctuation">(</span><span class="token string">'sysevent'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <br /><br /><span class="token keyword">function</span> <span class="token function">printCurrentShard</span><span class="token punctuation">(</span><span class="token parameter">pTableName</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <br /> <span class="token keyword">var</span> gr <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'sys_table_rotation'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>pTableName<span class="token punctuation">)</span> <span class="token punctuation">{</span> <br /> gr<span class="token punctuation">.</span><span class="token function">addQuery</span><span class="token punctuation">(</span><span class="token string">'name'</span><span class="token punctuation">,</span> <span class="token string">'='</span><span class="token punctuation">,</span> pTableName<span class="token punctuation">)</span><span class="token punctuation">;</span> <br /> <span class="token punctuation">}</span> <br /> gr<span class="token punctuation">.</span><span class="token function">query</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <br /> <span class="token keyword">while</span> <span class="token punctuation">(</span>gr<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <br /> <span class="token keyword">try</span> <span class="token punctuation">{</span> <br /> <span class="token keyword">var</span> tre <span class="token operator">=</span><br />Packages<span class="token punctuation">.</span>com<span class="token punctuation">.</span>snc<span class="token punctuation">.</span>db<span class="token punctuation">.</span>replicate<span class="token punctuation">.</span>TableRotationExtensions<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><br /> <span class="token keyword">var</span> extension <span class="token operator">=</span> tre<span class="token punctuation">.</span><span class="token function">getExtension</span><span class="token punctuation">(</span>gr<span class="token punctuation">.</span>name<span class="token punctuation">)</span><span class="token punctuation">;</span> <br /> <span class="token keyword">var</span> tablename <span class="token operator">=</span> extension<span class="token punctuation">.</span><span class="token function">getTableName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <br /> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>e<span class="token punctuation">)</span> <span class="token punctuation">{</span> <br /> gs<span class="token punctuation">.</span><span class="token function">print</span><span class="token punctuation">(</span><span class="token string">'Error getting current shard for table '</span> <span class="token operator">+</span> gr<span class="token punctuation">.</span>name<span class="token punctuation">)</span><span class="token punctuation">;</span> <br /> <span class="token punctuation">}</span> <span class="token keyword">finally</span> <span class="token punctuation">{</span> <br /> gs<span class="token punctuation">.</span><span class="token function">print</span><span class="token punctuation">(</span><span class="token string">'The current shard of table '</span> <span class="token operator">+</span> gr<span class="token punctuation">.</span>name <span class="token operator">+</span> <span class="token string">' is '</span> <span class="token operator">+</span> tablename<span class="token punctuation">)</span><span class="token punctuation">;</span> <br /> <span class="token punctuation">}</span> <br /> <span class="token punctuation">}</span> <br /><span class="token punctuation">}</span> </code></pre>
Save 💵 money on ServiceNow. There's big news in skills management and more from this week2022-06-03T21:04:30Zhttps://jace.pro/post/2022-06-03-save-money-on-servicenow-there-s-big-news-in-skills-management-and-more-from-this-week/Jace<!--
00:00-00:08: Hi, Like and Subscribe.
00:08-00:18: Save 💵 getting your CSA.
00:18-00:44: ServiceNow + Hitch
00:44-00:51: Apex acquiring GlideFast
00:52-01:54: Upcoming events
01:54-03:40: Great Content
03:40-04:47: @JaceNow on LinkedIn
04:47-05:05: Keep Creating
Links on my blog here: https://jace.pro/post/2022-06-03-save-money-on-servicenow-there-s-big-news-in-skills-management-and-more-from-this-week/
-->
<h2>Save thousands</h2>
<ul>
<li>
<h3><a href="https://community.servicenow.com/community?id=community_blog&sys_id=db32f40adb7bcd901227db85ca9619c2">ServiceNow Fundamentals on-demand course and Certified System Administrator exam voucher free till 8/31</a></h3>
</li>
</ul>
<h2>Why did ServiceNow Buy Hitch?</h2>
<p><a href="https://joshbersin.com/2022/06/servicenow-acquires-hitch-entering-the-skills-and-hcm-market/"><img src="https://jace.pro/static/img/servicenow-hitch-explained-by-joshbersin.webp" alt="" /></a></p>
<h2>Apex acquires GlideFast</h2>
<ul>
<li><a href="https://www.apexsystems.com/insights/article/asgn-incorporated-acquire-glidefast-consulting-elite-servicenow-partner"><img src="https://jace.pro/static/img/glidefast-asgn-apex.png" alt="" /></a></li>
</ul>
<h2>Upcoming Events!</h2>
<p><img src="https://jace.pro/static/img/events.png" alt="" /></p>
<h2>Great Content</h2>
<ul>
<li>
<p>Robert Fedoruk</p>
<ul>
<li><a href="https://www.youtube.com/watch?v=ztews1Vltoo"><img src="https://jace.pro/static/img/rfedoruk-sn-toolbox-ui-actions.jpg" alt="" /></a></li>
<li><a href="https://www.youtube.com/watch?v=PpWMFORUsv0"><img src="https://jace.pro/static/img/rfedoruk-sn-toolbox-stylish-emails.jpg" alt="" /></a></li>
<li><a href="https://www.youtube.com/watch?v=s5LKO45r1eQ"><img src="https://jace.pro/static/img/titans-of-now-etta-wilson.jpg" alt="Titans of now themed photo with Etta Wilson on it." title="Titans of now with Etta "Happy Path" Wilson" /></a></li>
</ul>
</li>
<li>
<p>Kevin and Matt talk about good service come from on Ticket Volume podcast
<a href="https://www.youtube.com/watch?v=Rc-vx4S5Arg"><img src="https://jace.pro/static/img/kevin-matt-podcast.jpg" alt="" /></a></p>
</li>
<li>
<p>Jeff pierce has been convincing clients to make intranets with Sevicenow for a decade<a href="https://www.linkedin.com/posts/portalguru_the-next-generation-intranet-with-servicenow-activity-6938522673454956545-OxuH?utm_source=linkedin_share&utm_medium=ios_app"></a>. ServiceNow shared a video on Vimeo how Next Experience can make this great.
<a href="https://www.linkedin.com/posts/portalguru_the-next-generation-intranet-with-servicenow-activity-6938522673454956545-OxuH/?utm_source=linkedin_share&utm_medium=ios_app"><img src="https://jace.pro/static/img/jpierce-shares-now-intranet-promo-video.png" alt="" /></a></p>
</li>
<li>
<p>Free app "freelucy" makes adding relations easier - https://www.ins-pi.com/freelucy
<a href="https://www.ins-pi.com/freelucy"><img src="https://jace.pro/static/img/freelucy-app.png" alt="" /></a></p>
</li>
<li>
<p>Justin Meadows is still bringing his A-Game with Service Catalog builder content
<a href="https://www.youtube.com/watch?v=ilCwE51ehpw"><img src="https://jace.pro/static/img/justin-meadows-catalog-builder.jpg" alt="" /></a></p>
</li>
<li>
<p>Blake M wrote up a great post about Adding a pesky On-call escalations button
<a href="https://community.servicenow.com/community?id=community_article&sys_id=4642275a1b3f8114c17111751a4bcb17"><img src="https://jace.pro/static/img/blakem-oncall-escaltions-post.png" alt="" /></a></p>
</li>
</ul>
<h2>Odds and Ends</h2>
<ul>
<li>
<p>Thanks Phil for noting these fun things out there.</p>
<ul>
<li>Ads in person for ServiceNow sure is nice to see. I had to spend some time to find some images of these but I did. It does really look great, good job Aoife Hall from marketing!
<a href="https://www.linkedin.com/feed/update/urn:li:activity:6935228891103969280/"><img src="https://jace.pro/static/img/aoife-hall-london-sn-ads.png" alt="" /></a></li>
</ul>
</li>
<li>
<p>People are sharing their first messages with The ServiceNow Mayor, Michael Lombardo. There's privacy stuff here but I've collected a few links for yall. I enjoyed all these. I made a list of links, check them out.</p>
<ul>
<li><a href="https://www.linkedin.com/posts/philgoesdeep_jacenow-philgoesdeep-swag-activity-6938279376329314304-HrWf?utm_source=linkedin_share&utm_medium=member_desktop_web">Phillip Swan</a></li>
<li><a href="https://www.linkedin.com/posts/rfedoruk_looks-like-were-all-posting-michael-lombardo-activity-6938267077333979136-ZuPS">Fedoruk</a></li>
<li><a href="https://www.linkedin.com/feed/update/urn:li:activity:6938506874631716864">Fedoruk-2</a></li>
<li><a href="https://www.linkedin.com/posts/portalguru_since-were-all-sharing-our-first-lombardo-activity-6938505866123853825-zl6E">Jeff Pierce</a></li>
<li><a href="https://www.linkedin.com/posts/toptanti_glidefast-consulting-and-michael-lombardo-activity-6938145791693770752-i-15">Top Tanti</a></li>
<li><a href="https://www.linkedin.com/posts/ryancgillespie_since-several-folks-are-posting-their-first-activity-6938149923792052225-rmqG%3E">Ryan Gillespie</a></li>
<li><a href="https://www.linkedin.com/posts/phxdev_servicenow-activity-6938252734903042048-O-LX">Mark Scott</a></li>
<li><a href="https://www.linkedin.com/posts/davidself3_glidefast-activity-6938232705742503937-gy6U">David Self</a></li>
<li><a href="https://www.linkedin.com/posts/steve-reeves-85948929_congrats-michael-lombardo-and-the-glidefast-activity-6938514587080155136-ezdY">Steve Reeves</a></li>
</ul>
</li>
</ul>
News with Jace May 30th2022-05-21T04:53:55Zhttps://jace.pro/post/2022-05-21-news-with-jace-may-30th/Jace<h2>K22 Amazing content</h2>
<ul>
<li>
<p>Unleash the Citizen Developer Hero in your Organization - Phil S +1, +</p>
</li>
<li>
<p><a href="https://nowlearning.service-now.com/lxp?id=learning_course_prev&course_id=000ebf3edb7e0990421266f748961990">Building a Killer Experience with UI Builder</a></p>
<p><img src="https://jace.pro/static/img/building-killer-uib.png" alt="CCL1072-K22-Building a Killer Experience with UI Builder screenshot" title="CCL1072-K22-Building a Killer Experience with UI Builder" /></p>
</li>
<li>
<p><a href="https://nowlearning.service-now.com/lxp?id=search&q=CreatorCon%202022">Other Nowlearnings from Creatorcon</a></p>
<p><img src="https://jace.pro/static/img/other-now-learnings-k22.png" alt="CreatorCon 2022 NowLearnings" title="CreatorCon 2022 NowLearnings" /></p>
</li>
<li>
<p><a href="https://www.linkedin.com/feed/update/urn:li:activity:6935967944006914048/">ES6 was announced for Tokyo!</a></p>
<p><img src="https://jace.pro/static/img/es6.png" alt="ES6 is announced for ServiceNow's Tokyo Release" title="ES6 is announced for ServiceNow's Tokyo Release" /></p>
</li>
<li>
<p><a href="https://www.linkedin.com/feed/update/urn:li:activity:6935678399122219008/">Chuck Tomasi is literally signing laptops!</a></p>
<p><img src="https://jace.pro/static/img/chuck-tomasi-signing-laptops.png" alt="Chuck Tomasi signing his fans laptops!" title="Chuck Tomasi signing his fans laptops!" /></p>
</li>
<li>
<p><a href="https://www.linkedin.com/feed/update/urn:li:activity:6934839172729901056/">WomenNow Meetup was great and full of amazing individuals</a></p>
<p><img src="https://jace.pro/static/img/womennow-unite.png" alt="WomenNow Meetup" title="WomenNow Meetup" /></p>
</li>
<li>
<p><a href="https://www.youtube.com/watch?v=VYFzY2q3gyA">Jon, Dorin and Eric Schuman discuss K22</a></p>
<p><img src="https://jace.pro/static/img/cask-k22.jpg" alt="Cask talk on K22" title="Cask talk on K22" /></p>
</li>
</ul>
<h2>New Folks</h2>
<ul>
<li>
<p><a href="https://www.linkedin.com/feed/update/urn:li:activity:6935649028495867904/">Frank Shorey and his POD finish week 12</a></p>
<p><img src="https://jace.pro/static/img/frank-s-pod-week-12.png" alt="Frank S. shares week 12 is complete!" title="Frank S. shares week 12 is complete!" /></p>
</li>
<li>
<p><a href="https://www.linkedin.com/feed/update/urn:li:activity:6935699746036617216/">DeAnn Boudreaux on Team Now Travel delivering their project!</a></p>
<p><img src="https://jace.pro/static/img/deann-b-nextgen.png" alt="If the flow ain't broke don't fix it" title="If the flow ain't broke don't fix it" /></p>
</li>
</ul>
<h2>Other good stuff</h2>
<ul>
<li>
<p>Ryal Litwiller said Darren did a great job on the <a href="https://www.youtube.com/watch?v=DXGJtPBzAhk">Creating Custom Components</a> video. Related content from the <a href="https://www.youtube.com/watch?v=6AXWj4RRiSs&list=PLRpsAi5HxghTBQ4IW7xsyGL4KYGWK25gS">ServiceNow Ninja's channel</a> and this <a href="https://nowlearning.service-now.com/lxp?id=learning_course_prev&course_id=38717dd9db7320d0785e2a591396199d">nowlearning</a></p>
<p><img src="https://jace.pro/static/img/creating-custom-components.png" alt="Creating Custom Components video from serviceportal.io" title="Creating Custom Components video from serviceportal.io" /></p>
</li>
<li>
<p><a href="https://www.linkedin.com/feed/update/urn:li:activity:6934983747939282945/">Tim Woodruff discusses the FREE Tanium Integration Core app.</a></p>
<p><img src="https://jace.pro/static/img/tim-w-tanium-interview.png" alt="Tim W. interviews on Endless Explorers re: Tanium Free App" title="Tim W. interviews on Endless Explorers re: Tanium Free App" /></p>
</li>
<li>
<p><a href="https://www.youtube.com/watch?v=NNV1Z2dLPH4&t=1s">Jarod M inducted into Titans of Now</a></p>
<p><img src="https://jace.pro/static/img/jarod-now.jpg" alt="Titans of Now featuring Jarod Mundt" title="Titans of Now featuring Jarod Mundt" /></p>
</li>
<li>
<p><a href="https://www.youtube.com/watch?v=eEWH5KinzFE">Horea shares how to do OAuth 2.0 auth with ServiceNow and Postman in 4 minutes</a></p>
<p><img src="https://jace.pro/static/img/horea-oauth-sn.jpg" alt="Horea Porutiu video thumbnail showing his face, postman, and servicenow" title="Horea Porutiu video thumbnail showing his face, postman, and servicenow" /></p>
</li>
<li>
<p>New podcasts to me.</p>
<ul>
<li><a href="https://www.youtube.com/playlist?list=PLEXUf6YDCK-koA6Xpn62BpFzgJSC4aPnb">Alldus Podcast</a></li>
<li><a href="https://www.youtube.com/playlist?list=PLp1Rra7OyefU6o7u8qEeRgVOyAKqCCbyW">XenTegra Podcast</a></li>
</ul>
</li>
<li>
<p>New Learning channels</p>
<ul>
<li><a href="https://www.youtube.com/channel/UCAZadwRpHjCa_oLimTC-ULA/featured">Step Up</a></li>
<li><a href="https://www.youtube.com/channel/UCXpQCadm49L7FtPlCuOzqbA/videos">ServiceNow 911</a></li>
<li><a href="https://www.youtube.com/c/LearnGrowTogetherwithAtulG">Learn & Grow Together With Atul G</a></li>
</ul>
</li>
</ul>
Getting Started2022-05-21T04:53:55Zhttps://jace.pro/post/2022-05-21-getting-started/Jace<p>You want to write a blog sweet! Let's get started.</p>
<p>A few things you'll need;</p>
<ol>
<li>Patience</li>
<li>This post</li>
<li>A GitHub account (you'll be prompted for this, and it's free)</li>
<li>A Netlify account (you'll be prompted for this, and it's free)</li>
</ol>
<h2>Press this button</h2>
<p>This will fork this codebase onto your user account on GitHub, and then connect it to Netlify to build your blog.</p>
<p><a href="https://app.netlify.com/start/deploy?repository=https://github.com/jacebenson/neat-starter&stack=cms"><img src="https://www.netlify.com/img/deploy/button.svg" alt="Deploy to Netlify" /></a></p>
<h2>Connect GitHub and Netlify</h2>
<p>You'll be prompted with this screen. Go ahead and connect these accounts.</p>
<p><img src="https://jace.pro/static/img/neat-starter-1.png" alt="Connect your Netlify account to GitHub" title="Connect your Netlify account to GitHub" /></p>
<h2>Press "Save & Deploy"</h2>
<p>This will create a repository on your GitHub account. It will initially be public, but you can change that to be private, that will be at the end here.</p>
<p><img src="https://jace.pro/static/img/neat-starter-3.png" alt="Configure your site" title="Configure your site" /></p>
<h2>Play a game of match</h2>
<p>Seriously, after you've saved and deploy, this will take ~ 2-3 minutes. You'll land on this page. Go ahead and click on the Deploy, then the Play game on the top right.</p>
<p><img src="https://jace.pro/static/img/snip-neat-starter-4.png-photos.png" alt="Netlify's site interface" title="Click the 1 on the production deploy" /></p>
<p>Once you've finished your game, let's continue.</p>
<h2>Check your email for an invite from Netlify</h2>
<p>You should have gotten an email inviting you to have access to your blog. Mine looked like this;</p>
<p><img src="https://jace.pro/static/img/neat-starter-8.png" alt="Email from Netlify inviting me to join my blog" title="Email from Netlify inviting me to join my blog" /></p>
<p>Click the "Accept the invite" link. The site will ask you for a password. Make note of this. Technically you're good to go but let's do two more things.</p>
<ol>
<li>Update your site name</li>
<li>Make your repo private</li>
</ol>
<h2>Go back to Netlify and update your site's name (optional)</h2>
<p>Once on the site, click "Site Settings" then "Change site name". Choose a site name. You can <a href="https://docs.netlify.com/domains-https/custom-domains/">buy a domain and use that</a> too, here's the docs on that. Check that out later if you're interested.</p>
<p><img src="https://jace.pro/static/img/rename-site.gif" alt="Animated gif clicking Site settings, Change site name, and renaming site" title="Animated gif clicking Site settings, Change site name, and renaming site" /></p>
<h2>Make your repo private (optional)</h2>
<p>To make your repository private, go to https://github.com/yourusername/neat-starter, then click Settings, scroll to the bottom, there is a red highlighted area of options. Click "Change visibility", choose "Make private" it'll ask you to type out your username/repo. Click I understand. Done.</p>
<h2>Let's make a post</h2>
<p>Go back to your blog at the new site name you gave it. Add `/admin` to url and it will ask you for your email and password. Log in. You'll land on something like this.</p>
<p><img src="https://jace.pro/static/img/neat-starter-11.png" alt="NetlifyCMS's interface" title="NetlifyCMS's interface" /></p>
<p>There's three sections.</p>
<p>On the left is the Collections. Here we have all the collections of things you can change without any code.</p>
<ul>
<li>Post is the lists of posts and is where you land by default.</li>
<li>Settings has the details about the site, you'll want to update the "Meta Settings" there for your branding and public URL.</li>
<li>Pages and Partials controls most of the actual templating code. You shouldn't need this, not initially.</li>
</ul>
Next Experience Notes2021-12-07T04:56:32Zhttps://jace.pro/post/2021-12-06-now-experience-notes/Jace Benson<h2>Now Component Concepts</h2>
<p>My rough notes on this, as I get more understanding I'll update this... Sometimes called Tectonic or UI21</p>
<p><a href="https://developer.servicenow.com/dev.do#!/reference/now-experience/rome/ui-framework/main-concepts/view">https://developer.servicenow.com/dev.do#!/reference/now-experience/rome/ui-framework/main-concepts/view</a></p>
<h3>Virtual DOM</h3>
<p>Snabbdom: This is the virtual dom library they use under the hood - tltoulson</p>
<h3>State Store / Application State Management</h3>
<p>Redux is one of the most popular state stores in use and ServiceNow drew inspiration from it in creating the Now Experience Framework - tltoulson</p>
<h3>Actions</h3>
<h3>Reducers</h3>
<h3>One Direction Data Flow</h3>
<h3>Hooks</h3>
<ul>
<li>React Hooks: Seems to be the inspiration for Effects and how the DOM is tied to the state in NowX (<a href="https://reactjs.org/docs/hooks-intro.html">https://reactjs.org/docs/hooks-intro.html</a>)</li>
</ul>
<h3>Effects</h3>
<h3>Web Components</h3>
<h3>Component Based UI</h3>
<h3>Shadow DOM</h3>
<h2>Tooling</h2>
<p><a href="https://mermaid-js.github.io/mermaid-live-editor/edit#pako:eNqVVE1v2zAM_SuCTh1Q9wfkUKDN2jVAmw1xtx3mHTibsY3akiHJSYui_32ULckf8YouFzN875GUSOqVpzJDvuL7Sh7TApRhj9eJSARbgziAvnlufiW8txn9QVWiSPFMf0r478AKlDP0wE-pnnQDKRIW7CD7BrkF7GcIJetGChTGRvP2gBZllb1Pibfr-w0h8ZaR0fu-b65bEqIi_1YeR0cgiDmsp97trnIKNy78bsc633CannpbCqAQ60pqvGqNrMGUUpDAAaxD5qofKDKpHkDQqWuXySXqITZgzIPu9PHDSXHkW65u87jAts5letftcE8suuiayVKFYIjC6HcRXQ6iD5BtX5d5UuzLvFWWSrzQww-RJxPg-20zBsV6Wsb_kWfhSaPbP7mCpmBCHvG50fnpEMETsNO5ulVQ45FubLwkRGFR1Ocu4ICsBvHiMNR9HX2B0aVzB23v9luGmhWyytjR92RQW-24VcFeSN1Ql8Z5ndw1z368c65M_TVNE4_vO9hLcnvV0yCdfN5gWopuPodG3MsUqi62oUH5umNfStPIzPc3aIIgRnUoU7Qt2ght7HKOZ22cJHQpGk27nhUwAeYvxj9fhneWf2m5F3e4L5Wf8xpVDWVGb_Yr-VjCTUERE74iM8M9tJVJeCLeiNo2GY34TVYaqfhqD5XGcw5UVvwiUr4yqkVP-lwCnbB2rLe_Z2YTFA"><img src="https://mermaid.ink/img/pako:eNqVVE1v2zAM_SuCTh1Q9wfkUKDN2jVAmw1xtx3mHTibsY3akiHJSYui_32ULckf8YouFzN875GUSOqVpzJDvuL7Sh7TApRhj9eJSARbgziAvnlufiW8txn9QVWiSPFMf0r478AKlDP0wE-pnnQDKRIW7CD7BrkF7GcIJetGChTGRvP2gBZllb1Pibfr-w0h8ZaR0fu-b65bEqIi_1YeR0cgiDmsp97trnIKNy78bsc633CannpbCqAQ60pqvGqNrMGUUpDAAaxD5qofKDKpHkDQqWuXySXqITZgzIPu9PHDSXHkW65u87jAts5letftcE8suuiayVKFYIjC6HcRXQ6iD5BtX5d5UuzLvFWWSrzQww-RJxPg-20zBsV6Wsb_kWfhSaPbP7mCpmBCHvG50fnpEMETsNO5ulVQ45FubLwkRGFR1Ocu4ICsBvHiMNR9HX2B0aVzB23v9luGmhWyytjR92RQW-24VcFeSN1Ql8Z5ndw1z368c65M_TVNE4_vO9hLcnvV0yCdfN5gWopuPodG3MsUqi62oUH5umNfStPIzPc3aIIgRnUoU7Qt2ght7HKOZ22cJHQpGk27nhUwAeYvxj9fhneWf2m5F3e4L5Wf8xpVDWVGb_Yr-VjCTUERE74iM8M9tJVJeCLeiNo2GY34TVYaqfhqD5XGcw5UVvwiUr4yqkVP-lwCnbB2rLe_Z2YTFA" alt="" /></a></p>
ServiceNow keeps buying things2021-08-13T03:53:39Zhttps://jace.pro/post/2021-08-12-servicenow-acquisitions/Jace Benson<table>
<thead>
<tr>
<th>Date</th>
<th>Company</th>
<th>Blurb</th>
<th>Platform Feature</th>
<th>When</th>
</tr>
</thead>
<tbody>
<tr>
<td>2013-07-09</td>
<td><a href="https://xconomy.com/san-diego/2013/07/09/servicenow-acquires-dutch-provider-of-performance-analytics-software/">Mirror42</a></td>
<td>Business Intelligence Solutions</td>
<td>Performance Analytics</td>
<td>(2015) Fuji</td>
</tr>
<tr>
<td>2014-07-09</td>
<td><a href="https://en.globes.co.il/en/article-servicenow-acquires-neebula-systems-for-100m-1000953148">Neebula Systems</a></td>
<td>Service Availability Management</td>
<td>ServiceWatch</td>
<td>(2016) Helsinki</td>
</tr>
<tr>
<td>2015-02-25</td>
<td><a href="https://itbrief.co.nz/story/servicenow-acquires-intreis-launches-new-grc-offering">Interis</a></td>
<td>Consultancy specializing in GRC</td>
<td>Unified Compliance Framework</td>
<td>?</td>
</tr>
<tr>
<td>2016-04-05</td>
<td><a href="https://www.servicenow.com/company/media/press-room/servicenow-acquires-cloud-management-provider-itapp.html">ITapp</a></td>
<td>Cloud Management</td>
<td>Cloud Management</td>
<td>?</td>
</tr>
<tr>
<td>2016-06-01</td>
<td><a href="https://fortune.com/2016/06/01/servicenow-security-software-brightpoint/">BrightPoint</a></td>
<td>Security Analtyics and Software</td>
<td></td>
<td>?</td>
</tr>
<tr>
<td>2017-01-18</td>
<td><a href="https://www.zdnet.com/article/servicenow-buys-dxcontinuum-to-boost-enterprise-automation-services/">DxContinuum</a></td>
<td>Intelligent Automation</td>
<td>Machine Learning</td>
<td>?</td>
</tr>
<tr>
<td>2017-05-17</td>
<td><a href="https://www.servicenow.com/company/media/press-room/servicenow-acquires-qlue-and-invests-in-buildonme-to-deliver-intelligent-automation-to-everyday-enterprise-work.html">Qlue Inc</a></td>
<td>AI powered Virtual Agents</td>
<td>Virtual Agent</td>
<td>?</td>
</tr>
<tr>
<td>2017-10-01</td>
<td><a href="https://www.zdnet.com/article/servicenow-acquires-telepathy-a-ux-ui-consulting-company-that-has-worked-with-quip-new-relic/">Telepathy</a></td>
<td>Human centered design firm</td>
<td></td>
<td>NA</td>
</tr>
<tr>
<td>2017-10-25</td>
<td><a href="https://www.zdnet.com/article/servicenow-buys-mobile-platform-startup-skygiraffe/">SkyGiraffe</a></td>
<td>Mobile Development</td>
<td>Mobile Studio</td>
<td>(2019) Madrid</td>
</tr>
<tr>
<td>2018-04-01</td>
<td><a href="https://www.zdnet.com/article/servicenow-beats-estimates-acquires-vendorhawk/">VendorHawk</a></td>
<td>Software Asset Management</td>
<td>SAM Pro Enhancements</td>
<td>(2017) Jakarta</td>
</tr>
<tr>
<td>2018-05-03</td>
<td><a href="https://www.zdnet.com/article/servicenow-buys-ai-startup-parlo/">Parlo</a></td>
<td>AI Natural Language Understanding</td>
<td>Natural Language Query</td>
<td>(2020) Paris</td>
</tr>
<tr>
<td>2018-10-01</td>
<td><a href="https://www.zdnet.com/article/servicenow-acquires-friendlydata-for-natural-language-interfaces/">FriendlyData</a></td>
<td>Natural Language Understanding</td>
<td>Natural Language Understanding</td>
<td>(2020) Orlando</td>
</tr>
<tr>
<td>2019-05-01</td>
<td><a href="https://www.servicenow.com/company/investor-relations/financials/servicenow-to-acquire-appsee-in-app-mobile-analytics-platform-and-rd-talent.html">Appsee</a></td>
<td>In-App Mobile Analytics Platform</td>
<td>Mobile Analytics</td>
<td>(2020) Orlando</td>
</tr>
<tr>
<td>2019-10-23</td>
<td><a href="https://blogs.servicenow.com/2019/servicenow-acquires-attivio-cognitive-search-platform.html">Attivio</a></td>
<td>Cognitive Search Platform</td>
<td>AI Search</td>
<td>?</td>
</tr>
<tr>
<td>2019-11-08</td>
<td><a href="https://blogs.servicenow.com/2019/fairchild-resiliency-acquisition-helps-companies-manage-risk.html">Fairchild</a></td>
<td>GRC + IRM</td>
<td>Business C ?</td>
<td>(2020) Paris</td>
</tr>
<tr>
<td>2020-01-01</td>
<td><a href="https://www.zdnet.com/article/servicenow-buys-loom-systems-to-extend-aiops-capabilities/">Loom Systems</a></td>
<td>AIOps Company</td>
<td>Machine Learning</td>
<td>?</td>
</tr>
<tr>
<td>2020-01-28</td>
<td><a href="https://www.servicenow.com/company/investor-relations/financials/servicenow-to-acquire-passage-ai.html">Passage AI</a></td>
<td>AI Platform</td>
<td>Genius Results</td>
<td>(2021) Quebec</td>
</tr>
<tr>
<td>2020-07-01</td>
<td><a href="https://www.zdnet.com/article/servicenow-scoops-up-data-management-firm-sweagle/">Sweagle</a></td>
<td>Configuration Data Management</td>
<td>TBD - DB as a service</td>
<td>Guessing - (2022) San Diego</td>
</tr>
<tr>
<td>2020-11-30</td>
<td><a href="https://www.zdnet.com/article/servicenow-acquires-artificial-intelligence-startup-element-ai/">Element AI</a></td>
<td>AI Talent</td>
<td></td>
<td>NA</td>
</tr>
<tr>
<td>2021-03-23</td>
<td><a href="https://www.zdnet.com/article/servicenow-acquires-hyderabad-based-rpa-company-intellibot/">Intellibot</a></td>
<td>Robotic Process Automation</td>
<td>TBD - RBA Orchestration</td>
<td>Guessing - (2022) Tokyo</td>
</tr>
<tr>
<td>2021-05-10</td>
<td><a href="https://www.zdnet.com/article/servicenow-acquires-lightstep-aims-to-leverage-observability-across-enterprises/">LightStep</a></td>
<td>Observability</td>
<td>TBD - Incident Response</td>
<td>Guessing - (2022) San Diego</td>
</tr>
<tr>
<td>2021-08-08</td>
<td><a href="https://www.zdnet.com/article/servicenow-acquires-database-performance-company-swarm64/#ftag=RSSbaffb68">Swarm64</a></td>
<td>PostgrSQL database platform</td>
<td>TBD - DB analytics</td>
<td>Guessing - (2022) Tokyo</td>
</tr>
<tr>
<td>2021-08-11</td>
<td><a href="https://www.zdnet.com/article/servicenow-acquires-mapwize-aims-to-add-indoor-mapping-to-now-platform/">Mapwize</a></td>
<td>Indoor Mapping</td>
<td>TBD - Space management 2.0</td>
<td>Guessing - (2023) Utah</td>
</tr>
<tr>
<td>2021-10-26</td>
<td><a href="https://blogs.servicenow.com/2021/gekkobrain-acquisition-erp-migrations.html">Gekkobrain</a></td>
<td>Code Migrations</td>
<td>TBD - Update Sets 2.0</td>
<td>Guessing - (2023) Utah</td>
</tr>
<tr>
<td>2021-11-23</td>
<td><a href="https://www.zdnet.com/article/servicenow-acquires-dotwalk-aims-to-automate-speed-up-upgrades/">Dotwalk</a></td>
<td>Integellient Test Generations</td>
<td>TBD - ATF Automatic Tests</td>
<td>Guessing - (2022) Tokyo / Store</td>
</tr>
<tr>
<td>2023-Q3</td>
<td><a href="https://www.finsmes.com/2023/05/servicenow-to-buy-g2k.html">G2K</a></td>
<td>German AI powered platform</td>
<td></td>
<td></td>
</tr>
<tr>
<td>2023-Q3</td>
<td><a href="https://www.businesswire.com/news/home/20231218270685/en/ServiceNow-to-Acquire-Task-Mining-Company-UltimateSuite-to-Enhance-Process-Mining-and-Intelligent-Automation-on-the-Now-Platform">UltimateSuite</a></td>
<td>task mining technology</td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<p>Thanks allen, and Tommy LaMonte for helping me filling in these details!</p>
Activity Streams ACLs changed in Paris2021-08-13T03:52:28Zhttps://jace.pro/post/2021-08-12-paris-activity-stream-acl-changed/Jace Benson<p>The other day Matt (mhz) was answering a question about form activity streams visiblity for emails. He had recently opened a support case and shared that on Slack.</p>
<p>Here's my understanding of what was conveyed.</p>
<ol>
<li>There's two gates to view emails on activity streams</li>
<li>The first gate is if the logged in user has roles matched with sys_property <code>glide.ui.activity.email_roles</code></li>
<li>The second gate (new in Paris) leverages reader ACLs against the user.</li>
</ol>
<blockquote>
<p>Basically this is '2 gates to viewing an Email within the Activity Stream', 1st gate 'glide.ui.activity.email_roles' will let user of the roles defined see the "Show Email Details" section regardless the content being displayed, while post-PRB1406163 (since Paris) the added logic in processor (2nd gate) will leverage email reader ACLs against the user to determine if the content can be displayed to the user or not - even the user is permitted to see the "Show Email Details" section due to his role being added into 'glide.ui.activity.email_roles'.</p>
<p>From Dev:</p>
<p>EmailDisplayProcessor controls ability to see email body. Thus fixing PRB1406163 was about respecting the sys_email ACL when the processor loaded this email for viewing. (Meaning it has not relied on activity stream specific properties like glide.ui.activity.email_roles.)<br />
In particular: this 'glide.ui.activity.email_roles' property is checked to determine whether to show the "Show Email Details" link that can be clicked. Then if the link appears, then the EmailDisplayProcessor will open and respect the sys_email ACLs from there.</p>
<p>There are 2 gates to viewing an Email within the Activity Stream. The property glide.ui.activity.email_roles is still effective and determines which roled users are able to see Emails in the Activity Stream. There are cases where not all users containing one of the roles should see every email on the target record. Consider the case where a notification generates an email containing a randomly generated password. Due to security concerns, rather than displaying the email body to all users, you might want only the recipient of the email to have read access. The OOB email read ACL specifically handles emails containing sensitive content such as the PW example, by evaluating Email Access Restriction records (sys_email_access_restriction).</p>
<p>The customer has added the 'admin' role to their sys_email table READ ACL, which indicates that only admins should have read access to email records. They certainly could revert the change in the Email Display processor to begin seeing emails again, but that also re-introduces the security concern that a user will be able to view an email that they shouldn't have access to. My suggestion would be to leave the Email Display processor as is and update the email read ACL to accurately reflect who should be able to read an email record.</p>
<p>So even quick fix is reverting email processor logic to pre-Paris, but as dev said it "re-introduces the security concern that a user will be able to view an email that they shouldn't have access to.".</p>
<p>Please consider the suggestion from Dev - add the role of the users to the email read acl, so the users will be able to see the email records, then based on the logic of the process, they will be able to see the email content in Activity Stream (along with the "Show Email Details" section due to the defined role in 'glide.ui.activity.email_roles')<br />
https://.service-now.com/nav_to.do?uri=sys_security_acl.do?sys_id=8de12cdfc0a8016701fdf6b2bdb041cb</p>
<p>Thank you Matt for sharing this!</p>
</blockquote>
Mirroring choices on catalog items2021-08-13T03:51:09Zhttps://jace.pro/post/2021-08-12-mirroring-choices-on-catalog-items/Jace Benson<p>To do this you don't need a lot. I've hinted at this kind of stuff before with my <a href="https://jace.pro/post/2017-10-28-lookup-select-attributes/">Lookup Select Attribute</a> post. Here I'll spell it out.</p>
<ol>
<li>
<p>Make <code>category</code> variable with the following bits</p>
<ul>
<li>Type: Lookup select box</li>
<li>Include none: true</li>
<li>Table: <code>sys_choice</code></li>
<li>Reference Qualifier: <code>name=incident^element=category^language=en^inactive=false^ORDERBYsequence</code></li>
</ul>
</li>
<li>
<p>Make <code>subcategory</code> variable with the following bits</p>
<ul>
<li>Type: Lookup select box</li>
<li>Include none: true</li>
<li>Table: <code>sys_choice</code></li>
<li>Reference Qualifer: <code>javascript: 'name=incident^element=subcategory^language=en^inactive=false^dependent_value=' + current.variables.category</code><br />
(note the dependent value column in your query)</li>
<li>Attributes: <code>ref_qual_elements=category</code></li>
</ul>
</li>
</ol>
Extending User is Bad2021-08-13T03:49:21Zhttps://jace.pro/post/2021-08-12-extending-user-is-bad/Jace Benson<p>A few weeks ago extending User [<code>sys_user</code>] came up and I had always thought, well ServiceNow did it for Customer Service Management, so it must be fine. This day however Pheedbaq explained why this is a problem and why we shouldn't do it.</p>
<p>Here's my understanding.</p>
<p>Let's go with spatial bodies. For this example we'll extend sys_user to user_martian and user_plutonian.</p>
<p>You can create a user on user_martian, they will never hav a class of sys_user.</p>
<p>If you decide that later you want user_plutonian extension, users who were made on user_martian can never also exist on user_plutonian.</p>
<p>Let's use an example. Let's say John is a new Citizen on Mars and moved there yesterday. You guys have a process that creates a user_martian record for him. Then you decided he's going to move to Pluto and work from the branch there.</p>
<p>You'd need a second record because his class cannot be both user_plutonian and user_martian.</p>
<h2>Pheedbaq's message that spurred this</h2>
<blockquote>
<p>If you have: sys_user</p>
<p>contract_user extends sys_user</p>
<p>subsidiary_user extends sys_user</p>
<p>Then you create Bob who is a contract_user</p>
<p>Bob's class will never be "sys_user".</p>
<p>Bob can never be a "subsidiary_user".</p>
<p>To make Bob both a contract_user and a subsidiary_user, Bob must have 2 accounts.</p>
<p>The User table should never be extended. We have had apps and guidance in the past that say "extend sys_user" and those are wrong. For ServiceNow-made apps which extend sys_user, those teams have already or are in the process of unwinding that so they don't break future customers. The documentation should hopefully already be cleaned up, but there may be some lingering bad advice out there.</p>
<p>I didn't mean to interrupt the LCHH; I thought posting here would be non-disruptive. Hope it wasn't a bother.</p>
<p>-- Pheedbaq</p>
</blockquote>
TechNow Rome2021-07-23T03:47:39Zhttps://jace.pro/post/2021-07-27-technow-rome/Jace Benson<p>Feel free to edit!!!! everyone!</p>
<h1><a href="https://jace.pro/post/2021-07-27-technow-rome/#technow-rome"></a>Now Exp</h1>
<ul>
<li>CSS available on an element level.</li>
</ul>
<h1>playbook</h1>
<ul>
<li>moving to store release</li>
</ul>
<h2>playbook record generator</h2>
<ul>
<li>allows an agent to enter the data before the record is created.</li>
<li>playbook + ui builder has a better intergration</li>
<li>more options to add actions at the playbook level</li>
</ul>
<h2>playbook preview</h2>
<ul>
<li>improves the exp of building a playbook by allowing you to see it as you build on</li>
</ul>
<p>Q: Can you use SP on Now Experience?<br />
A: No, they are different technologies.</p>
<p>SN may release now components to SP (safe harbor)</p>
<h1>Dev Tool Enhancements</h1>
<h2>Expanded Source control</h2>
<ul>
<li>can edit things like CSM in studio now?</li>
<li>headless testing is now possible via docker</li>
<li>servicenow cli</li>
</ul>
<h2>delegate dev</h2>
<ul>
<li>admin can delegate the source control feature</li>
<li>delete app can be given to users</li>
</ul>
<h2>studio enchancements</h2>
<ul>
<li>can now create a now experience in studio</li>
<li>this allows folks w/o the app eng. studio licensines to create now exp.'s</li>
</ul>
<h2>flow designer</h2>
<ul>
<li>improved error handling</li>
<li>new simple math and string functions</li>
<li>performance of flow can be imporved by turning off logging</li>
<li>automatic variable cleaning. var_dictionary cleared after a month</li>
</ul>
<p>Q: Can error handling actions have access to data pills?<br />
A: Yes</p>
<h2>intergrationhub $</h2>
<ul>
<li>now does imports (competes with import sets now - import sets reimagined - only supports data streams)</li>
<li>notifications - will tell you when you run into licensing issues</li>
<li>tls 1.2 support for fips compliance</li>
</ul>
<h1>security</h1>
<h2>multi-factor authentication</h2>
<ul>
<li>adaptive authentication - contextual security?</li>
<li>certificate based authentication</li>
</ul>
<h2>data exports metrics</h2>
<ul>
<li>this will let you measure whats being exported and if its sensitve</li>
</ul>
<h2>platform encryption Enhancements $</h2>
<ul>
<li>in rome encryption now doesnt need to apply to business rules/scripts</li>
</ul>
<h1>platform foundation</h1>
<h2>system logs</h2>
<ul>
<li>
<p>new fields</p>
<ul>
<li>source (existing)</li>
<li>source package (new)</li>
<li>source application family (new)</li>
</ul>
</li>
<li>
<p>schedule installation of plugins and applications<br />
Q: Can you scheduled install of update sets? A: ?</p>
</li>
<li>
<p>instance scan has new scan</p>
<ul>
<li>reactive scan (based on a specific failure)</li>
</ul>
</li>
<li>
<p>inbound emails actions</p>
<ul>
<li>now can properly identify the user based on email across the extended user tables.</li>
<li>this was resolved by changing how the inbound does a match, <code>cmn_notif_device</code> table to find the user.</li>
</ul>
</li>
</ul>
<p>Q: how is the health scan different then the instance scan?<br />
A: They are not different. Well Support does a health scan, you run an instance scan.</p>
<p>Q: is instance scans performance intensive?<br />
A: Generally no</p>
<p>Q: an interesting use for instance scan.<br />
A: data sanity checks (verify users have managers)</p>
Calculating Business Durations2021-04-20T03:45:02Zhttps://jace.pro/post/2021-04-19-calculating-business-durations/Jace Benson<h1>Calculating Business Durations</h1>
<p>First, why is this a thing? Well companies like to list things in "business days" sometimes. I'm not sure why, but that's the origin.</p>
<p>Sure, so now that we know why, how does this work in ServiceNow?</p>
<p>To do that you're going to have to dig in to some code.</p>
<p>As of today, ServiceNow still uses <a href="https://developer.servicenow.com/dev.do#!/reference/api/quebec/server_legacy/c_GlideSystemAPI#r_GS-dateDiff_S_S_B">gs.dateDiff</a> and <a href="https://developer.servicenow.com/dev.do#!/reference/api/quebec/server_legacy/c_GlideSystemAPI#r_GS-calDateDiff_S_S_B">gs.calDateDiff</a> to calculate duration and business duration. See Business rule <code>mark_resolved</code> and <code>mark_closed</code> on Incident. Below I've pasted the business rule for <code>mark_closed</code>.</p>
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">//mark_closed business rule</span><br /><span class="token function">setClosureFields</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><br /><span class="token keyword">function</span> <span class="token function">setClosureFields</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token comment">// incident_state is Closed so</span><br /> <span class="token comment">// 1. mark the task as inactive</span><br /> <span class="token comment">// 2. set the closed by to current user if not supplied</span><br /> <span class="token comment">// 3. set the closed time to now if not supplied</span><br /> current<span class="token punctuation">.</span>active <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>current<span class="token punctuation">.</span>closed_by<span class="token punctuation">.</span><span class="token function">nil</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><br /> current<span class="token punctuation">.</span>closed_by <span class="token operator">=</span> gs<span class="token punctuation">.</span><span class="token function">getUserID</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>current<span class="token punctuation">.</span>closed_at<span class="token punctuation">.</span><span class="token function">nil</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><br /> current<span class="token punctuation">.</span>closed_at <span class="token operator">=</span> gs<span class="token punctuation">.</span><span class="token function">nowDateTime</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <br /> <span class="token comment">// Update the fields that indicate the time/duration of the incident</span><br /> <span class="token comment">// from open to close.</span><br /> <span class="token comment">// Keep track of duration as a glide_duration value (dd hh:mm:ss)</span><br /> <span class="token comment">// and as a pure number of seconds.</span><br /> <span class="token comment">// Both calendar time and business time are maintained.</span><br /> <br /> <span class="token keyword">var</span> dataChange <span class="token operator">=</span> <span class="token punctuation">(</span>current<span class="token punctuation">.</span>opened_at<span class="token punctuation">.</span><span class="token function">changes</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <br /> <span class="token operator">||</span> <span class="token punctuation">(</span>current<span class="token punctuation">.</span>closed_at<span class="token punctuation">.</span><span class="token function">changes</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <br /> <span class="token operator">&&</span> <span class="token operator">!</span>current<span class="token punctuation">.</span><span class="token function">isValidField</span><span class="token punctuation">(</span><span class="token string">"resolved_at"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> opened <span class="token operator">=</span> current<span class="token punctuation">.</span>opened_at<span class="token punctuation">.</span><span class="token function">getDisplayValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> closed <span class="token operator">=</span> current<span class="token punctuation">.</span>closed_at<span class="token punctuation">.</span><span class="token function">getDisplayValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>dataChange <span class="token operator">||</span> current<span class="token punctuation">.</span>business_duration<span class="token punctuation">.</span><span class="token function">nil</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><br /> current<span class="token punctuation">.</span>business_duration <span class="token operator">=</span> gs<span class="token punctuation">.</span><span class="token function">calDateDiff</span><span class="token punctuation">(</span>opened<span class="token punctuation">,</span> closed<span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>dataChange <span class="token operator">||</span> current<span class="token punctuation">.</span>business_stc<span class="token punctuation">.</span><span class="token function">nil</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><br /> current<span class="token punctuation">.</span>business_stc <span class="token operator">=</span> gs<span class="token punctuation">.</span><span class="token function">calDateDiff</span><span class="token punctuation">(</span>opened<span class="token punctuation">,</span> closed<span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>dataChange <span class="token operator">||</span> current<span class="token punctuation">.</span>calendar_duration<span class="token punctuation">.</span><span class="token function">nil</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><br /> current<span class="token punctuation">.</span>calendar_duration <span class="token operator">=</span> gs<span class="token punctuation">.</span><span class="token function">dateDiff</span><span class="token punctuation">(</span>opened<span class="token punctuation">,</span> closed<span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>dataChange <span class="token operator">||</span> current<span class="token punctuation">.</span>calendar_stc<span class="token punctuation">.</span><span class="token function">nil</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><br /> current<span class="token punctuation">.</span>calendar_stc <span class="token operator">=</span> gs<span class="token punctuation">.</span><span class="token function">dateDiff</span><span class="token punctuation">(</span>opened<span class="token punctuation">,</span> closed<span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span></code></pre>
<p>You can see it's using those old methods.</p>
<h2>gs.dateDiff</h2>
<p><a href="https://developer.servicenow.com/dev.do#!/reference/api/quebec/server_legacy/c_GlideSystemAPI#r_GS-dateDiff_S_S_B">gs.dateDiff</a> takes two string of time in the user's format and returns the duration between them in a ddd hh:mm:ss format. ServiceNow docs do also say;</p>
<blockquote>
<p>If you are working with GlideDateTime objects use the GlideDateTime subtract() method instead of dateDiff().</p>
</blockquote>
<p>I'm not sure if gs.dateDiff is available to scopes but I would not bet on it. This is an instance of "Do what I say, and not what I do." from ServiceNow.</p>
<h2>gs.calDateDiff</h2>
<p><a href="https://developer.servicenow.com/dev.do#!/reference/api/quebec/server_legacy/c_GlideSystemAPI#r_GS-calDateDiff_S_S_B">gs.calDateDiff</a> takes two string of time in the user's format and returns the duration between them in a ddd hh:mm:ss format against the "default" schedule. I can hear you now, "Jace, what is the default schedule?" It's not defined to me. I know it uses the 8-5 weekdays schedule (on cmn_schedule) but there are lot of <a href="https://docs.servicenow.com/bundle/quebec-platform-administration/page/administer/time/reference/r_DefaultSchedules.html">default schedules</a>. ServiceNow docs do also say;</p>
<blockquote>
<p>Calendars are now legacy. If Schedules are being used, see the topic Calculate Duration Given a Schedule.</p>
</blockquote>
<p>I looked for this "Topic" but there isn't a page for this. I did find a section on <a href="https://docs.servicenow.com/bundle/quebec-application-development/page/script/useful-scripts/concept/c_UsefulSchedulingScripts.html">Usefil scheduling scripts</a> that matches. Let's look here.</p>
<blockquote>
<p>Type: Before update/insert business rule<br />
Table: Incident<br />
Description: A Business Duration calculates the Open to Close duration on an incident based on the particular Creating and using schedules. If there is no schedule specified, the script will use the first schedule returned by the query.<br />
Script example:<br />
The example below sets the resolved duration when the incident state moves to resolved.</p>
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">/*Modified to make more readable*/</span><br /><span class="token keyword">var</span> opened_at <span class="token operator">=</span> current<span class="token punctuation">.</span>opened_at<span class="token punctuation">;</span><br /><span class="token keyword">var</span> updated_on <span class="token operator">=</span> current<span class="token punctuation">.</span>sys_updated_on<span class="token punctuation">;</span><br /><span class="token keyword">var</span> schedule_sys_id <span class="token operator">=</span> <span class="token string">'08fcd0830a0a0b2600079f56b1adb9ae'</span><span class="token punctuation">;</span><br /><span class="token keyword">if</span><span class="token punctuation">(</span>current<span class="token punctuation">.</span>incident_state<span class="token operator">==</span><span class="token number">6</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">var</span> dur <span class="token operator">=</span> <span class="token function">calcDurationSchedule</span><span class="token punctuation">(</span>opened_at<span class="token punctuation">,</span> updated_on<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> current<span class="token punctuation">.</span>u_resolved_duration<span class="token operator">=</span> dur<span class="token punctuation">;</span><br /><br /> <span class="token keyword">function</span> <span class="token function">calcDurationSchedule</span><span class="token punctuation">(</span><span class="token parameter">start<span class="token punctuation">,</span> end</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <br /> <span class="token comment">// Get the user </span><br /> <span class="token keyword">var</span> usr <span class="token operator">=</span><span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'sys_user'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> usr<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>gs<span class="token punctuation">.</span><span class="token function">getUserID</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token comment">// Create schedule - pass in the sys_id of your standard work </span><br /> <span class="token comment">// day schedule and >pass in the users timezone</span><br /> <span class="token keyword">var</span> sched <span class="token operator">=</span><span class="token keyword">new</span> <span class="token class-name">GlideSchedule</span><span class="token punctuation">(</span>schedule_sys_id<span class="token punctuation">,</span>usr<span class="token punctuation">.</span>time_zone<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token comment">// Get duration based on schedule/timezone </span><br /> <span class="token keyword">return</span><span class="token punctuation">(</span>sched<span class="token punctuation">.</span><span class="token function">duration</span><span class="token punctuation">(</span>start<span class="token punctuation">.</span><span class="token function">getGlideObject</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> end<span class="token punctuation">.</span><span class="token function">getGlideObject</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span></code></pre>
</blockquote>
<p>This again seems like a case where it's "Do as I say and not as I do."</p>
<h2>TL;DR</h2>
<p>ServiceNow uses old functions to calculate these bits.</p>
<p>Business Duration seems to use a "default" calendar of 8-5 Weekdays. An example duration might be;<br />
Opened at: Feb 5th (Fri) at 7am<br />
Closed at: Feb 8th (Mon) at 2pm<br />
Duration calculated ...<br />
Feb 5th: 9 hours<br />
Feb 6th: 0 hours<br />
Feb 7th: 0 hours<br />
Feb 8th: 6 hours<br />
Total Business Duration: 15 hours.</p>
<p>Duration is the difference in time without a calendar considered. An example duration might be;</p>
<p>Opened at: Feb 5th (Fri) at 7am<br />
Closed at: Feb 8th (Mon) at 2pm<br />
Total Hours: 79 hours. (ServiceNow displays these in days, so 3 days 7 hours)</p>
Custom Domain for PDIs using Vercel2021-02-06T04:42:34Zhttps://jace.pro/post/2021-02-05-custom-domain-for-pdis-using-vercel/Jace Benson<h1>Custom Domain for PDIs using Vercel</h1>
<p>I was able to do this with the help of Mav and Mike Bahr. Thanks guys!</p>
<p>First of all this fixes the redirect issues from the Netlify version. Netlify appends a slash to some endpoints. I don't see a way to control it, Vercel lets you control how that works.</p>
<h1>Simple Vercel Proxy</h1>
<p>This is a simple repository.</p>
<p>It's purpose it to create a proxy to a site you own.</p>
<h2>How does it work?</h2>
<ol>
<li>You have a domain point to Vercel</li>
<li>Vercel has a "redirect/rewrite" rule that doesn't redirect instead proxies</li>
<li>That's it</li>
</ol>
<h2>What do I have to do?</h2>
<ol>
<li>A GitHub account.</li>
<li><strong>Access to your DNS</strong> for the domain to create appropriate records.</li>
<li>A <strong>Vercel account</strong>.</li>
</ol>
<h1>Ok, I'm ready!</h1>
<h2>Deploy the repo</h2>
<ol>
<li><a href="https://vercel.com/new/git/external?repository-url=https%3A%2F%2Fgithub.com%2Fjacebenson%2Fdev"><img src="https://vercel.com/button" alt="Deploy with Vercel" /></a></li>
<li>Login with GitHub, trust me.</li>
<li>Enter a project name, I called mine <code>pdi-redirect</code>.</li>
<li>Pick GitHub.</li>
<li>Create the repository private or public, your choice.</li>
<li>Leave the Import Project settings, they were auto-detected by Vercel, and "Deploy".</li>
<li>Now it's building, it'll take about 20 seconds to build.</li>
<li>You should get a 🎉 <strong>CONGRATULATIONS</strong> 🎉 message. It should work now.<br />
Well, it's redirecting to my site. Let's fix that.</li>
</ol>
<h2>Update the repo to point to your site</h2>
<ol>
<li>Go to your git source where that button created the repo.</li>
<li>Update the <code>./_includes/layout/redirect.njk</code> file to the site you want.</li>
<li>Vercel should trigger a build and update index.html and 404.html to redirect to your site.</li>
</ol>
<h2>Set up the domain</h2>
<ol>
<li>Now you need to set up the domain. To do that goto "Domains",</li>
<li>It'll ask what project you want to use, pick the one you made from #1.</li>
<li>It will show you, that your DNS is wrong. Go forth and set the dns as depicted.</li>
<li>Comeback to Vercel's domain page and "Refresh" your domain entry. You may need to wait for your DNS to propagate.</li>
<li>That's it.</li>
</ol>
Technow Quebec Review2021-01-27T04:38:38Zhttps://jace.pro/post/2021-01-26-technow-quebec-review/Jace Benson<h1>Technow Quebec Review</h1>
<p>The team presenting this noted that slides had a price tag indicating if something was effectively platform, or "extra". I'll denote this in the title with a 💲 emoji.</p>
<p>This aired on Jan. 26th, and will be available in video sometime in March.</p>
<h2>UI Builder</h2>
<ul>
<li>Lots of things in here, but just check the <a href="https://www.youtube.com/watch?v=xEb6-E0Xk1w">LCHH video</a></li>
</ul>
<h2>Data Classification</h2>
<ul>
<li>Categorize fields as PII, internal, restricted, confidential</li>
<li>Quickly report on field categorization for regulatory compliance</li>
<li>Manage fields via REST and script APIs</li>
</ul>
<h2>Now Platform foundation enhancements</h2>
<ul>
<li>Office 365 integration</li>
<li>Embedded Help Panel</li>
<li>User on-boarding walkthroughs</li>
</ul>
<h2>AI Search</h2>
<ul>
<li>Via the acquisition from <a href="https://blogs.servicenow.com/2019/servicenow-acquires-attivio-cognitive-search-platform.html">Attivio</a>.</li>
<li>This is everywhere. Service portal, workspaces, mobile, etc.</li>
</ul>
<h2>Process Optimization 💲</h2>
<ul>
<li>This shows a kind of diagram of how work is actually done in the platform.</li>
<li>Part of ITSM Enterprise and CSM Enterprise packages.</li>
</ul>
<h2>Virtual Agent enhancements 💲</h2>
<ul>
<li>Guided set up with topic recommendations</li>
<li>Advanced authoring tools</li>
<li>Automatically resolve incidents, actionable notifications, and password reset</li>
</ul>
<h2>NLU Workbench</h2>
<ul>
<li>This replaces the "Model Builder".</li>
<li>Support for 13 more languages (now at 16 total).</li>
<li>Ability to add vocabulary sources to be referenced by models</li>
</ul>
<h2>Regression Framework 💲</h2>
<p>Uses machine learning to estimate a value. e.g.<br />
If we have 100 things done what will the time be for the 101st item.</p>
<p>Any prof or ent. package as part of artificial intelligence</p>
<h2>Natural Language Query NLQ 💲</h2>
<p>NLQ is officially released with Quebec.<br />
This is nice as you can ask ServiceNow is common language for things.</p>
<p>E.g. How many P1's were logged last month? Should build a report showing incident.priority=1^sys_created_on=LastMonth</p>
<h2>Performance Analytics enhancements 💲</h2>
<ul>
<li>PA Capabilities now availabe on workspaces</li>
<li>PA now supports flexible calendars (e.g. fiscal not matching standard calendar)</li>
</ul>
<h2>Reporting enhancements</h2>
<ul>
<li>Quick calculations on specific fields</li>
<li>Tailor reporting to highlight what's important</li>
<li>Design dynamic reports with response to questions stored on the catalog</li>
</ul>
<h2>Mobile Experience enhancements</h2>
<p>(Jace's note what app does this apply to? You all have 4!)</p>
<ul>
<li>Added AI Search</li>
<li>Added Deeplink capability to apps</li>
<li>Cards now can have actionable buttons</li>
</ul>
<h2>Mobile Agent enhancements</h2>
<ul>
<li>Saved Views, favorite mobile screens for quicker access</li>
<li>Field Service surveys online and offline</li>
<li>Native Knowledge KB articles</li>
</ul>
<h2>Mobile Developer Tool Enhancements</h2>
<ul>
<li>Mobile Card builder. You can make your own cards now instead of using the pre-made designs</li>
<li>UI Rules, Apply field value calculations and UI Styling to UI elements</li>
<li>Impersonate Users</li>
</ul>
<h2>App Engine Studio (AES) 💲 (Store release)</h2>
<p>Not really gone into, will be topic in March TechNow.</p>
<p>Not available in PDI's yet.</p>
<h2>IntegrationHub enhancements 💲</h2>
<ul>
<li>"Simplify inbound integrations with REST API trigger"</li>
<li>Remote Process Sync allows for better ebonding (by-directional) integrations</li>
<li>Perform data mapping with modern UX for codeless ETL</li>
<li>Retrieve date easily with JDBC data stream</li>
<li>Send one or more files to your instance over SFTP</li>
<li>Choose specific MID server for your integration</li>
</ul>
<h2>Flow Designer enhancements</h2>
<ul>
<li>UX improvements to help citizen developers</li>
<li>Record Producers can now be submitted via Flow designer with variables</li>
<li>Flow level variables now exist (akin to workflow scratchpad)</li>
</ul>
<h2>Email enhancements</h2>
<ul>
<li>Parse email replies with per domain separators that also support regex</li>
<li>Notification common content (available to notification, and other communication channels e.g. slack, va)</li>
</ul>
<h2>App Studio enhancements</h2>
<ul>
<li>Some store apps can be customized (depends on app author's settings in app)</li>
<li>Some ServiceNow apps can also be customized (depends same as above)</li>
</ul>
<h2>Dev @ Scale</h2>
<ul>
<li>APIs to install modify and rollback your changes</li>
</ul>
<h2>Script Tracer</h2>
<ul>
<li>Server side script debugging improvements</li>
</ul>
<h2>Instance Scan</h2>
<ul>
<li>Scan your instance for problems with code/configuration</li>
<li>Been in the works since 2012</li>
<li>Allows for custom checks to be added</li>
</ul>
What is the Catalog Builder from Quebec2021-01-23T04:33:23Zhttps://jace.pro/post/2021-01-22-quebec-catalog-builder/Jace Benson<h1>TL;DR</h1>
<p>I had a stream ad-hoc with Druhv about this. It's way longer than I had hoped but there's just so many ways to set up this and I didn't even hit all the features.</p>
<ol>
<li>This feature will save me time.<br />
This will take work out of my backlog and enable non-admins to create catalog items for predefined templates.</li>
<li>Creating the templates takes some thought ahead of time. Thankfully, I've thought about this a lot in the past. See <a href="https://youtu.be/wyVLCxOtZl8?t=1059">"The Nine Standard Workflows"</a> from Robert Fedoruk's Titans of Now series.</li>
<li>This utility doesn't do anything special with update sets or scopes. Do you have to have the "Catalog Builders" build in dev? No. Should you? I'm not sure.</li>
<li>There didnt appear to be any approval process to get these items published.</li>
<li>This has some limitations, but they seemed pretty minor to me.</li>
</ol>
<h1>Getting started</h1>
<p>I jumped in without looking at the docs and didn't seem to have much trouble, there's a lot here. I'll lay out the logical steps here.</p>
<p>Before you can even try this as a "Catalog Builder", you need a template. This isn't the templates I'm used to in ServiceNow. This template lets users control most options about the item. Here's the link to <a href="https://docs.servicenow.com/bundle/quebec-servicenow-platform/page/product/service-catalog-management/concept/catalog-builder.html#:~:text=Limitations">limitationsits on the lower half of the page</a>.</p>
<h2>Limitations</h2>
<blockquote>
<p>"Catalog builder does not allow creation and editing of the following entities, but they can be set in Now Platform either for a draft item or a published item that has not been checked out."<br />
ServiceNow Docs</p>
</blockquote>
<ul>
<li>
<p>Catalog Item limitations</p>
<ul>
<li>Can't set meta tags</li>
<li>Can't use execution plans</li>
<li>Can't deal with prices</li>
</ul>
</li>
<li>
<p>Variable limitations</p>
<ul>
<li>Can't set Help Text</li>
<li>Can't set default value</li>
<li>Not all variable types are available here. Most are, but some are not, notible, List Collectors, and Macros are missing.</li>
<li>Doesn't allow editing variables with two levels of containers.</li>
</ul>
</li>
<li>
<p>Logic limitations</p>
<ul>
<li>
<p>Catalog Client Scripts are not available.</p>
</li>
<li>
<p>Data lookup rules (maybe ref. qualifier)</p>
</li>
<li>
<p>Catalog UI policy (Source: AAtrey)</p>
<ul>
<li>On Load field (defaults to true)</li>
<li>Script field. When a catalog UI policy has a script, it does not show up in the question’s behavior settings list in the catalog builder.</li>
<li>Reverse if false field. By default, it is set to true.</li>
<li>Multiple actions. When a catalog UI policy has multiple actions, it does not show up in the question’s behavior settings list in the catalog builder.</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2>Creating a template</h2>
<p>A heads up, all the choices here can be overridden on a granular basis. So you'll probably want to be more permissive then restrictive here.</p>
<p>There's 8 sections to these templates. Here's the <a href="https://docs.servicenow.com/bundle/quebec-servicenow-platform/page/product/service-catalog-management/task/create-cat-item-template-cat-builder.html">official docs</a> on this, but I'll spell it out here too.</p>
<h3>Template Details</h3>
<p>Template name and short description are details available when looking at the templates.</p>
<p>Template available for, dictates who can use this template.</p>
<h3>Details</h3>
<p>Item Name, Short description, Image, and Description will be set based on these for the "Catalog Builder". If you want the "Catalog Builder" to come up with those details, you should leave them blank.</p>
<h3>Location</h3>
<p>These catalogs and categories are the items unless you allow editing this in the overrides.</p>
<h3>Questions</h3>
<p>Questions only allow you include variable sets. Variables added this way cannot be removed from the item. The set can be rearranged. Here is also where you can limit the kinds of variables available.</p>
<h3>Settings</h3>
<p>Settings allows you to control the "Add to cart", "Add to wishlist", "Quantity", "Hide Delivery Time", "Hide Attachment", "Make attachment mandatory", and the "Submit button label".</p>
<h3>Access</h3>
<p>Access is controlled strictly by User Criteria. This allows for granting and limiting by User Criteria.</p>
<h3>Fulfillment</h3>
<p>The fulfillment can get set to a workflow or flow designer. If you want to</p>
<h3>Overrides</h3>
<p>This is where the "Catalog builder" can override the allowed options.</p>
<h2>Creating an item</h2>
<p>After overrides above you're done making the template. This means the "Catalog builder" now can use the template to make an item.</p>
<p>They can pick the template you made and set the overrides you allows and also add any number of questions here.</p>
<h3>Problems I ran into</h3>
<ul>
<li>Making available for and not available for mandatory means they will have to set at least one user criteria in each</li>
<li>They cannot edit variable sets you've added but they can add them themselves</li>
<li>They cannot edit the order within the variable sets</li>
</ul>
<h1>Jace's review</h1>
<p>Will this get used? Yes. Does it meet all the problems posed? No. Does it come with guidance how to set up citizen developers to get this catalog items and flows out there? No.</p>
<p>That beign said, it's exciting to see the current work done.</p>
Success with Flow Designer2021-01-17T04:26:13Zhttps://jace.pro/post/2021-01-16-success-with-flow-designer/Jace Benson<h1>Success with Flow Designer</h1>
<p>Here's the requirements that drove this post.</p>
<p>✅ Create a catalog item (I can do this every day)<br />
✅ Add a MRVS (easy peasy lemon squeezy)<br />
✅ From a service account (sure, but MRVS and the cart api might be weird)<br />
✅ As someone else (sure, <code>gs.impersontate</code> never hurt right)<br />
🛑 Without admin role (Um, I'm not sure about the impersonate bit)</p>
<p>This seemed like something simple at first. I created a item to track my thoughts. It had one variable set on it called "Ideas". That variable set had two variables in it <code>thought</code> and <code>order</code>. I'm always thinking and needed something to test against.</p>
<p>I was told the older cart api didn't seem to work with the MRVS. I didn't try it I went straight for <a href="https://developer.servicenow.com/dev.do#!/reference/api/paris/server/sn_sc-namespace/c_CartJSScoped">CartJS</a>.</p>
<p>First attempt was showing this is possible from a fix script like so;</p>
<pre class="language-javascript"><code class="language-javascript"><span class="token keyword">var</span> impUser <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideImpersonate</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br />impUser<span class="token punctuation">.</span><span class="token function">impersonate</span><span class="token punctuation">(</span><span class="token string">'someUserSysId'</span><span class="token punctuation">)</span><br /><span class="token keyword">var</span> cart <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">sn_sc<span class="token punctuation">.</span>CartJS</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token keyword">var</span> request <span class="token operator">=</span> <span class="token punctuation">{</span><br /> <span class="token string-property property">'sysparm_id'</span><span class="token operator">:</span> <span class="token string">'2edaaaec2f31e090bd54d5f62799b62b'</span><span class="token punctuation">,</span><br /> <span class="token string-property property">'sysparm_quantity'</span><span class="token operator">:</span> <span class="token string">'1'</span><span class="token punctuation">,</span><br /> <span class="token string-property property">'variables'</span><span class="token operator">:</span><span class="token punctuation">{</span><br /> <span class="token string-property property">'ideas'</span><span class="token operator">:</span> <span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">stringify</span><span class="token punctuation">(</span><span class="token punctuation">[</span><br /> <span class="token punctuation">{</span><br /> <span class="token literal-property property">thought</span><span class="token operator">:</span> <span class="token string">"This is a thought"</span><span class="token punctuation">,</span> <br /> <span class="token literal-property property">order</span><span class="token operator">:</span> <span class="token string">"100"</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">]</span><span class="token punctuation">)</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span><br /><span class="token keyword">var</span> cartDetails <span class="token operator">=</span> cart<span class="token punctuation">.</span><span class="token function">orderNow</span><span class="token punctuation">(</span>request<span class="token punctuation">)</span><span class="token punctuation">;</span><br />gs<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span>cartDetails<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p>That worked but, then he brought up the issue of race conditions were multiple requests would come in at the same time. Before the problem was it would submit and work, but it would checkout as the wrong person in some cases.</p>
<p>This new problem needed a new solution.</p>
<p>Generally when you have race conditions, one way to solve this is to create a queue of sorts.</p>
<p>I suggested the tried-and-true method of using event queue and script actions to deal with this. But, that seemed more complicated.</p>
<h1>Enter Flow Designer</h1>
<p>I have not been a fladvocate. It's a new year. I thought I'd give it a go and you know what. Flow Designer suprised me by how well it worked*. I'll walk through those steps. For you professional fladvocates, this old news.</p>
<p>High level of what I did. I knew I needed a subflow so I could call it from my scripted endpoint.</p>
<h2>Create Flow Designer Action "Impersonate User"</h2>
<p>You'll need to set up the input to take a user. That's it.</p>
<pre class="language-javascript"><code class="language-javascript"><span class="token keyword">var</span> impUser <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideImpersonate</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br />impUser<span class="token punctuation">.</span><span class="token function">impersonate</span><span class="token punctuation">(</span>inputs<span class="token punctuation">.</span>user<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<h2>Created a Subflow</h2>
<p>I created a subflow. This subflow, needed a input of <code>user</code> and a input array for the <code>multirow variable set</code>.</p>
<ul>
<li>
<p>Create the inputs and outputs</p>
<p><img src="https://jace.pro/static/img/fd-input-output.jpg" alt="" /></p>
</li>
<li>
<p>Add the "Impersontate User" action.\n</p>
</li>
<li>
<p>Add the Create Catalog item action.</p>
</li>
<li>
<p>Add Assign Subflow Outputs</p>
</li>
<li>
<p>Connect the pills appropriately.</p>
</li>
<li>
<p>Publish the subflow</p>
<p><img src="https://jace.pro/static/img/fd-subflow.jpg" alt="" /></p>
</li>
<li>
<p>In the verticle elipses (aka the thin hamburger [top right of screen]), click the "Code Snippets" button. Copy that text.</p>
</li>
</ul>
<h2>Create your scripted rest api</h2>
<p>In here you're going to match up the data to the subflow like so.</p>
<pre class="language-javascript"><code class="language-javascript"><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token function">process</span><span class="token punctuation">(</span><span class="token comment">/*RESTAPIRequest*/</span> request<span class="token punctuation">,</span> <span class="token comment">/*RESTAPIResponse*/</span> response<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /><br /> <span class="token comment">//expect person to request for </span><br /> <span class="token comment">//expect array for mvrs</span><br /> <span class="token keyword">var</span> user <span class="token operator">=</span> request<span class="token punctuation">.</span>body<span class="token punctuation">.</span>data<span class="token punctuation">.</span>user<span class="token punctuation">;</span><br /> <span class="token keyword">var</span> thoughts <span class="token operator">=</span> request<span class="token punctuation">.</span>body<span class="token punctuation">.</span>data<span class="token punctuation">.</span>ideas<span class="token punctuation">;</span><br /> <span class="token keyword">var</span> now <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Date</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">try</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> inputs <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span><br /> inputs<span class="token punctuation">[</span><span class="token string">'user'</span><span class="token punctuation">]</span> <span class="token operator">=</span> user<span class="token punctuation">;</span> <span class="token comment">// String </span><br /> inputs<span class="token punctuation">[</span><span class="token string">'ideas'</span><span class="token punctuation">]</span> <span class="token operator">=</span> thoughts<span class="token punctuation">;</span> <span class="token comment">// Array.Object </span><br /> <span class="token keyword">var</span> result <span class="token operator">=</span> sn_fd<span class="token punctuation">.</span>FlowAPI<span class="token punctuation">.</span><span class="token function">getRunner</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">subflow</span><span class="token punctuation">(</span><span class="token string">'global.request_item_for_person'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">inForeground</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">withInputs</span><span class="token punctuation">(</span>inputs<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> outputs <span class="token operator">=</span> result<span class="token punctuation">.</span><span class="token function">getOutputs</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> request <span class="token operator">=</span> outputs<span class="token punctuation">[</span><span class="token string">'request'</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">// String</span><br /> response<span class="token punctuation">.</span><span class="token function">setBody</span><span class="token punctuation">(</span>outputs<span class="token punctuation">)</span><br /> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>ex<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> message <span class="token operator">=</span> ex<span class="token punctuation">.</span><span class="token function">getMessage</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> gs<span class="token punctuation">.</span><span class="token function">error</span><span class="token punctuation">(</span>message<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">(</span>request<span class="token punctuation">,</span> response<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<h2>Test the REST</h2>
<p>Testing the rest worked great. Here's the rest body and response;</p>
<p><a href="https://dev16718.service-now.com/api/8821/item">https://dev16718.service-now.com/api/8821/item</a></p>
<pre class="language-json"><code class="language-json"><span class="token punctuation">{</span><br /> <span class="token property">"user"</span><span class="token operator">:</span><span class="token string">"ca826bf03710200044e0bfc8bcbe5d89"</span><span class="token punctuation">,</span><br /> <span class="token property">"ideas"</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token punctuation">{</span><br /> <span class="token property">"thought"</span><span class="token operator">:</span> <span class="token string">"Jace says adios baby!"</span><span class="token punctuation">,</span> <br /> <span class="token property">"order"</span><span class="token operator">:</span> <span class="token string">"100"</span><br /> <span class="token punctuation">}</span><span class="token punctuation">]</span><br /><span class="token punctuation">}</span></code></pre>
<pre class="language-json"><code class="language-json"><span class="token punctuation">{</span><br /> <span class="token property">"result"</span><span class="token operator">:</span> <span class="token punctuation">{</span><br /> <span class="token property">"request"</span><span class="token operator">:</span> <span class="token string">"RITM0010017"</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span></code></pre>
<p>* I still think the UI is confusing but, I don't have feedback to fix it.</p>
CloudFlare Pages, Netlify, Vercel, Github Pages, and Gitlab Pages. Where to host for free?2020-12-17T07:17:07Zhttps://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/Jace Benson<!--StartFragment-->
<h1><a href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/#cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host">CloudFlare Pages, Netlify, Zeit, Github Pages, and Gitlab Pages. Where to host?</a></h1>
<p>Let me know in the comments or via a <a href="https://github.com/jacebenson/jace.pro/issues/new">GitHub issue</a> if I'm missing something or got something wrong.</p>
<p>I excluded AWS Amplify as they are "free for a year". That is a while but it will cost you something every month after that year.</p>
<table>
<thead>
<th>Feature</th><th>GitHub</th>
<th>GitLab</th>
<th>Netlify</th>
<th>Vercel</th>
<th>CloudFlare</th>
<th>Firebase</th>
<th>Render</th>
</thead>
<tbody>
<tr>
<th>Build Limit</th>
<td>
<p><a title="GitHub Pages sites have a soft limit of 10 builds per hour." href="https://docs.github.com/en/free-pro-team@latest/github/working-with-github-pages/about-github-pages#usage-limits">10/hour</a></p>
</td>
<td>
<p><a title="GitLab limits builds and other CI/CD to Pipeline Minutes. 400 Minutes are free. No Build Limit beyond that." href="https://about.gitlab.com/releases/2020/09/01/ci-minutes-update-free-users/">None</a></p>
</td>
<td>
<p><a title="Buried in the Terms of Service" href="https://www.netlify.com/tos#:~:text=3%20deploys/minute">3/Minute</a></p>
</td>
<td>
<p><a title="You are able to build 32 Deployments every 3600 seconds (1 hour)" href="https://vercel.com/docs/platform/limits#builds-per-hour-(free)">32/hour</a></p>
</td>
<td>
<p><a title="You can deploy up to 500 times per month on the free plan" href="https://developers.cloudflare.com/pages/platform/limits#builds">500/month</a></p>
</td>
<td>
<p><a title="From what I can tell, you need to do the build. No build process in Firebase that I can tell." href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/">Not Applicable</a></p>
</td>
<td>
<p><a title="" href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/">Unlisted</a></p>
</td>
</tr>
<tr>
<th>Build Time to Error</th>
<td>
<p><a title="I couldn't find a quantity of builds can happen at once on GitHub pages." href="https://github.community/t/page-build-timed-out/10476/7">10 minutes</a></p>
</td>
<td>
<p><a title="Jobs handled by the shared runners on GitLab.com, time out after 3 hours, regardless of the timeout configured in a project." href="https://docs.gitlab.com/ee/user/gitlab_com/index.html#shared-runners">3 Hours</a></p>
</td>
<td>
<p><a title="You should count on your builds having only 15 minutes to complete their build command." href="https://answers.netlify.com/t/support-guide-how-long-should-netlify-builds-take/151/7">15 minutes</a></p>
</td>
<td>
<p><a title="A build can last for 30 minutes. If the build exceeds this time, the deployment will error." href="https://vercel.com/docs/build-step#maximum-build-duration">30 minutes</a></p>
</td>
<td>
<p><a title="I cant find anything build details except Build commands and directories and Build settings" href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/">Unlisted</a></p>
</td>
<td>
<p><a title="From what I can tell, you need to do the build. No build process in Firebase that I can tell." href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/">Not Applicable</a></p>
</td>
<td>
<p><a title="All builds currently have a timeout of 120 minutes." href="https://community.render.com/t/is-there-a-limit-for-how-long-a-build-is-allowed-to-take/175/3">120 minutes</a></p>
</td>
</tr>
<tr>
<th>Build Time per Month</th>
<td>
<p><a title="I couldn't find any build minutes for pages. GitHub Actions, needed for Serverless, has a limit of 2000 a month" href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/">NA</a></p>
</td>
<td>
<p><a title="400 Minutes are free" href="https://about.gitlab.com/releases/2020/09/01/ci-minutes-update-free-users/">400 Minutes</a></p>
</td>
<td>
<p><a title="300 minutes /month(then $7 per 500)" href="https://www.netlify.com/pricing/#features">300 Minutes</a></p>
</td>
<td>
<p><a title="On the Fair Use Policy Page, it reads, Up to 100 Hrs." href="https://vercel.com/docs/platform/fair-use-policy">6000 Minutes</a></p>
</td>
<td>
<p><a title="" href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/">Unlisted</a></p>
</td>
<td>
<p><a title="From what I can tell, you need to do the build. No build process in Firebase that I can tell." href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/">Not Applicable</a></p>
</td>
<td>
<p><a title="" href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/">Unlisted</a></p>
</td>
</tr>
<tr>
<th>Concurrent Builds</th>
<td>
<p><a title="" href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/">🤷♂️</a></p>
</td>
<td>
<p><a title="For each runner a concurrent job can execute." href="https://docs.gitlab.com/ee/ci/pipelines/">Yes</a></p>
</td>
<td>
<p><a title="One Concurrent build" href="https://www.netlify.com/pricing/#features">One</a></p>
</td>
<td>
<p><a title="Hobby is allotted One (1) build concurrently." href="https://vercel.com/knowledge/why-are-my-vercel-builds-queued">One</a></p>
</td>
<td>
<p><a title="On the Plans page it says, '1 build at a time'" href="https://pages.cloudflare.com/#plans">One</a></p>
</td>
<td>
<p><a title="From what I can tell, you need to do the build. No build process in Firebase that I can tell." href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/">Not Applicable</a></p>
</td>
<td>
<p><a title="I coudn't find any thing about the builds" href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/">Unlisted</a></p>
</td>
</tr>
<tr>
<th>Deploy Limits</th>
<td>
<p><a title="" href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/">NA</a></p>
</td>
<td>
<p><a title="I couldn't find any deploy limits for GitLab Pages." href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/">No</a></p>
</td>
<td>
<p><a title="There is no limit listed but you will be limited by your build minutes." href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/">Not Applicable</a></p>
</td>
<td>
<p><a title="" href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/">100/Day</a></p>
</td>
<td>
<p><a title="I coudn't find any 'Deploy limits' but this is probably controlled via the builds. I asked on twitter" href="https://twitter.com/jacebenson/status/1339791209942949889">Unlisted</a></p>
</td>
<td>
<p><a title="From what I can tell, you need to do the build. No build process in Firebase that I can tell." href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/">Not Applicable</a></p>
</td>
<td>
<p><a title="I coudn't find any 'Deploy limits'." href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/">Unlisted</a></p>
</td>
</tr>
<tr>
<th>Deploy Previews</th>
<td>
<p><a title="" href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/">No</a></p>
</td>
<td>
<p><a title="I couldn't find anything about deploys on pull requests." href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/">No</a></p>
</td>
<td>
<p><a title="Deploy a live shareable preview of your production URL or any individual branch that is not your production branch." href="https://www.netlify.com/pricing/#features">Yes</a></p>
</td>
<td>
<p><a title="They have this... in their main page, I couldn't find it in their docs." href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/">Yes</a></p>
</td>
<td>
<p><a title="On the pages site it shows 'Preview early, preview often' and 'Preview control' showing builds on commit, and control to who sees it." href="https://pages.cloudflare.com/">Yes</a></p>
</td>
<td>
<p><a title="Yes" href="https://firebase.google.com/docs/hosting/test-preview-deploy">Yes</a></p>
</td>
<td>
<p><a title="Yes" href="https://render.com/docs/pull-request-previews">Yes</a></p>
</td>
</tr>
<tr>
<th>Serverless Functions</th>
<td>
<p><a title="There's no native serverless function on GitHub, you can make an action to make a function on AWS." href="https://github.com/serverless/github-action">No</a></p>
</td>
<td>
<p><a title="You can have a runner build a AWS Lambda function." href="https://docs.gitlab.com/ee/user/project/clusters/serverless/aws.html">No</a></p>
</td>
<td>
<p><a title="These are great but keep in mind they are isolated from eachother, meaning you can't share a common file among them." href="https://www.netlify.com/pricing/#features">Yes</a></p>
</td>
<td>
<p><a title="Vercel has Serverless Functions. Not sure who hosts them but they have differnt limits. 12/per deployment." href="https://vercel.com/docs/serverless-functions/introduction">Yes</a></p>
</td>
<td>
<p><a title="Cloudflare has workers to do serverless stuff. This is a feature they've offered for years now." href="https://developers.cloudflare.com/workers/">Yes</a></p>
</td>
<td>
<p><a title="Yes" href="https://firebase.google.com/pricing/">Yes</a></p>
</td>
<td>
<p><a title="Looks like they have this requested, but its not there yet, for $7 you could use https://www.openfaas.com/ on render." href="https://feedback.render.com/features/p/support-for-serverless-scripts">Not for free</a></p>
</td>
</tr>
<tr>
<th>Invocations/Month</th>
<td>
<p><a title="" href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/"></a></p>
</td>
<td>
<p><a title="" href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/"></a></p>
</td>
<td>
<p><a title="125k per site /month($25+ when exceeded)" href="https://www.netlify.com/pricing/#features">125k/per site/mo</a></p>
</td>
<td>
<p><a title="Vercel's Serverless functions usage is measured not in requests but in GB hours. I found this on the Fair Use Page." href="https://vercel.com/docs/platform/fair-use-policy">100GB hours/mo</a></p>
</td>
<td>
<p><a title="100,000 / day, 1000 / minute." href="https://developers.cloudflare.com/workers/platform/limits">100k/day</a></p>
</td>
<td>
<p><a title="125k/mo" href="https://firebase.google.com/docs/functions/quotas">125k/mo</a></p>
</td>
<td>
<p><a title="" href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/"></a></p>
</td>
</tr>
<tr>
<th>Duration Allowed</th>
<td>
<p><a title="" href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/"></a></p>
</td>
<td>
<p><a title="" href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/"></a></p>
</td>
<td>
<p><a title="10 second execution limit for synchronous serverless functions" href="https://docs.netlify.com/functions/overview/#default-deployment-options">10s</a></p>
</td>
<td>
<p><a title="On the limits page, they state it's 10 seconds." href="https://vercel.com/docs/platform/limits#serverless-function-execution-timeout">10s</a></p>
</td>
<td>
<p><a title="10ms. Wait what? How can anything happen in 10ms? I guess they are fast, always on, and has storage" href="https://developers.cloudflare.com/workers/platform/limits">10ms</a></p>
</td>
<td>
<p><a title="540s wow!" href="https://firebase.google.com/docs/functions/quotas">540s</a></p>
</td>
<td>
<p><a title="" href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/"></a></p>
</td>
</tr>
<tr>
<th>DNS Management</th>
<td>
<p><a title="You can create a CNAME file for the DNS, but no way to dicate other subdomains from the Repo." href="https://docs.github.com/en/free-pro-team@latest/github/working-with-github-pages/managing-a-custom-domain-for-your-github-pages-site#configuring-a-subdomain">No</a></p>
</td>
<td>
<p><a title="GitLab doesn't manage your domains. You configure TXT Records to verify the domain." href="https://about.gitlab.com/handbook/support/workflows/verify_pages_domain.html">No</a></p>
</td>
<td>
<p><a title="Netlify offers the option to handle DNS management for you." href="https://docs.netlify.com/domains-https/netlify-dns/">Yes</a></p>
</td>
<td>
<p><a title="Vercel allows you to manage DNS Records on their site at noted on 'How can I manage my Vercel DNS records'" href="https://vercel.com/knowledge/how-to-manage-vercel-dns-records">Yes</a></p>
</td>
<td>
<p><a title="CloudFlare has a huge offering for DNS management" href="https://www.cloudflare.com/dns/">Yes</a></p>
</td>
<td>
<p><a title="No" href="https://firebase.google.com/docs/hosting/custom-domain">No</a></p>
</td>
<td>
<p><a title="" href="https://render.com/docs/custom-domains#adding-a-custom-domain">No</a></p>
</td>
</tr>
<tr>
<th>HTTPS Available</th>
<td>
<p><a title="GitHub serves their sites over HTTPS, if you use your own domain, you need a certificate." href="https://docs.github.com/en/free-pro-team@latest/github/working-with-github-pages/securing-your-github-pages-site-with-https">Yes</a></p>
</td>
<td>
<p><a title="GitLab has a integration with Let's Encrypt to automatically do this." href="https://docs.gitlab.com/ee/user/project/pages/custom_domains_ssl_tls_certification/lets_encrypt_integration.html">Yes</a></p>
</td>
<td>
<p><a title="Netlify offers free HTTPS on all sites, including automatic certificate creation and renewal." href="https://docs.netlify.com/domains-https/https-ssl/">Yes</a></p>
</td>
<td>
<p><a title="Vercel automatically adds SSL from Let's Encrypt." href="https://vercel.com/blog/automatic-ssl-with-vercel-lets-encrypt">Yes</a></p>
</td>
<td>
<p><a title="Yes, this is something they offer" href="https://support.cloudflare.com/hc/en-us/articles/360024787372-End-to-end-HTTPS-with-Cloudflare-Part-1-conceptual-overview">Yes</a></p>
</td>
<td>
<p><a title="" href="https://firebase.google.com/docs/hosting">Yes</a></p>
</td>
<td>
<p><a title="Automatic SSL certificate issuance and renewal using Let’s Encrypt." href="https://render.com/docs/static-sites">Yes</a></p>
</td>
</tr>
<tr>
<th>Bandwidth/Month</th>
<td>
<p><a title="GitHub Pages sites have a soft bandwidth limit of 100GB per month." href="https://docs.github.com/en/free-pro-team@latest/github/working-with-github-pages/about-github-pages#usage-limits">100GB/Mo</a></p>
</td>
<td>
<p><a title="GitLab doesn't set a max bandwidth for pages." href="https://forum.gitlab.com/t/what-are-the-restrictions-for-gitlab-pages-sites/15067/6">No limit</a></p>
</td>
<td>
<p><a title="Network Bandwidth: 100GB/month — Soft" href="https://www.netlify.com/tos/#for-free-accounts">100GB/Mo</a></p>
</td>
<td>
<p><a title="Vercel limits bandwidth to 100GB" href="https://vercel.com/docs/platform/fair-use-policy">100GB/Mo</a></p>
</td>
<td>
<p><a title="On the Plans page it says, 'Unlimited bandwidth'" href="https://pages.cloudflare.com/#plans">No Limit</a></p>
</td>
<td>
<p><a title="" href="https://firebase.google.com/docs/hosting/usage-quotas-pricing">10GB/Mo</a></p>
</td>
<td>
<p><a title="We do not have any request size restrictions. Just note that we do charge for bandwidth that exceeds 100GB in a month." href="https://community.render.com/t/request-size-limits/552">100GB/Mo</a></p>
</td>
</tr>
<tr>
<th>Site Limit</th>
<td>
<p><a title="Published GitHub Pages sites may be no larger than 1 GB." href="https://docs.github.com/en/free-pro-team@latest/github/working-with-github-pages/about-github-pages#usage-limits">1GB</a></p>
</td>
<td>
<p><a title="The only limitations are < 10GB repository size and available pipeline minutes." href="https://forum.gitlab.com/t/what-are-the-restrictions-for-gitlab-pages-sites/15067/6">10GB</a></p>
</td>
<td>
<p><a title="Storage: 100GB / Soft" href="https://www.netlify.com/tos/#for-free-accounts">100GB</a></p>
</td>
<td>
<p><a title="Vercel has a limit on files quantity, it's 12.5k pre build." href="https://vercel.com/docs/platform/limits#files">12.5K Files</a></p>
</td>
<td>
<p><a title="Cloudflare limits site to 20k files" href="https://developers.cloudflare.com/pages/platform/limits#files">20K Files</a></p>
</td>
<td>
<p><a title="10GB" href="https://firebase.google.com/pricing/">10GB</a></p>
</td>
<td>
<p><a title="" href="https://render.com/docs/static-sites">None listed</a></p>
</td>
</tr>
<tr>
<th>Default URL</th>
<td>
<p><a title="You can host your site on GitHub's github.io domain or your own custom domain." href="https://docs.github.com/en/free-pro-team@latest/github/working-with-github-pages/about-github-pages#about-github-pages">github.io</a></p>
</td>
<td>
<p><a title="gitlab.io is the domain they share." href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/">gitlab.io</a></p>
</td>
<td>
<p><a title="By default any site Netlify is accessible viat it's Netlify subdomain [name-of-your-site].netlify.app" href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/">netlify.app</a></p>
</td>
<td>
<p><a title="Vercel defaults to .vercel.app" href="https://vercel.com/docs/custom-domains">vercel.app</a></p>
</td>
<td>
<p><a title="Cloudflare is using pages.dev for the domain." href="https://developers.cloudflare.com/pages/getting-started#add-a-custom-cname-record">pages.dev</a></p>
</td>
<td>
<p><a title="" href="https://firebase.google.com/docs/hosting">web.app and firebaseapp.com</a></p>
</td>
<td>
<p><a title="Every web service and static site on Render automatically gets a free onrender.com address which does not change." href="https://render.com/docs/custom-domains">onrender.com</a></p>
</td>
</tr>
<tr>
<th># of Team Members</th>
<td>
<p><a title="How long will GitHub Free allow unlimited collaborators? Forever! This change is permanent." href="https://docs.github.com/en/free-pro-team@latest/github/getting-started-with-github/faq-about-changes-to-githubs-plans#how-long-will-github-free-allow-unlimited-collaborators">Unlimited</a></p>
</td>
<td>
<p><a title="Unlimited as it says on their pricing page." href="https://about.gitlab.com/pricing/">Unlimited</a></p>
</td>
<td>
<p><a title="For free you get... one team member so for free... No team." href="https://www.netlify.com/pricing/#features">One</a></p>
</td>
<td>
<p><a title="For free Vercel doesn't give you access to Teams (CTRL+f teams )" href="https://vercel.com/docs/platform/limits">One</a></p>
</td>
<td>
<p><a title="Unlimited seats for free: additional collaborators shouldn’t break the bank. With Pages, you can add them all for free." href="https://pages.cloudflare.com/">Unlimited</a></p>
</td>
<td>
<p><a title="" href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/"></a></p>
</td>
<td>
<p><a title="Render allows you to share your site with other Render users for free so they can help you manage it through their own Render account." href="https://render.com/docs/static-sites#unlimited-collaborators">Unlimited</a></p>
</td>
</tr>
<tr>
<th>Team SSO Available</th>
<td>
<p><a title="If you're using GitHub as a organization, you can set up SAML single sign-on" href="https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/about-authentication-with-saml-single-sign-on">Yes</a></p>
</td>
<td>
<p><a title="Looks like there's integrations with Okta, so I assume you can do this with other SAML providers." href="https://about.gitlab.com/handbook/business-ops/okta/">Yes</a></p>
</td>
<td>
<p><a title="Team Owners can allow team members to log in to Netlify through their company's SAML signle sign on." href="https://docs.netlify.com/accounts-and-billing/team-management/saml-single-sign-on/">Yes</a></p>
</td>
<td>
<p><a title="Vercel has this, but its only for 'teams'" href="https://vercel.com/docs/platform/projects#sso-protection">Not for Free</a></p>
</td>
<td>
<p><a title="I couldn't find anything about collaborators login methods." href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/">Unlisted</a></p>
</td>
<td>
<p><a title="Firebase is owned by Google, google has their whole enterprise bit." href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/">Yes</a></p>
</td>
<td>
<p><a title="I couldn't find anything about this" href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/">No</a></p>
</td>
</tr>
<tr>
<th># of Users</th>
<td>
<p><a title="You can point users to use GitHub's OAuth Service. I'm not sure how that would work, but it's an option." href="https://docs.github.com/en/free-pro-team@latest/developers/apps/authorizing-oauth-apps">Yes</a></p>
</td>
<td>
<p><a title="Like GitHub, GitLab offers itself as a OAuth2 provider." href="https://docs.gitlab.com/ee/integration/oauth_provider.html">Yes</a></p>
</td>
<td>
<p><a title="Here's the link to the Netlify Identity details." href="https://www.netlify.com/pricing/#add-ons-identity">1000/site/month</a></p>
</td>
<td>
<p><a title="Vercel lists solutions for Identity, but tehy don't have one with their offereings" href="https://vercel.com/docs/solutions/authentication">No</a></p>
</td>
<td>
<p><a title="Workers has this, but that only shows how to do user auth with Auth0." href="https://developers.cloudflare.com/workers/tutorials/authorize-users-with-auth0">No</a></p>
</td>
<td>
<p><a title="Yes" href="https://firebase.google.com/pricing/">Yes</a></p>
</td>
<td>
<p><a title="This idea may not be excatly this, but it's like it." href="https://feedback.render.com/features/p/password-protection-for-static-sites">Planned</a></p>
</td>
</tr>
<tr>
<th>User SSO Available</th>
<td>
<p><a title="Users of GitHub can have SSO set up if they're part of an organization that sets that up." href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/">Yes</a></p>
</td>
<td>
<p><a title="Again, like GitHub, GitLab offers SAML SSO for GitLab.com groups." href="https://docs.gitlab.com/ee/user/group/saml_sso/">Yes</a></p>
</td>
<td>
<p><a title="Here SAML-SSO lists as ❌ for free, and ✔ for Level 2." href="https://www.netlify.com/pricing/#add-ons-identity">Not for free</a></p>
</td>
<td>
<p><a title="I didn't see anyhting along these lines when looking" href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/">No</a></p>
</td>
<td>
<p><a title="I didn't see anyhting along these lines when looking" href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/">No</a></p>
</td>
<td>
<p><a title="Looks like they have this" href="https://firebase.google.com/docs/auth/where-to-start">Yes</a></p>
</td>
<td>
<p><a title="I didn't see anyhting along these lines when looking" href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/"></a></p>
</td>
</tr>
<tr>
<th>Form Submissions/Month</th>
<td>
<p><a title="GitHub provides no 'Forms' but you can leverage Issues for that." href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/">No</a></p>
</td>
<td>
<p><a title="GitLab provides no 'Forms' but you can leverage Issues for that." href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/">No</a></p>
</td>
<td>
<p><a title="100 submissions a month, and up to 10MB of uploads a month." href="https://www.netlify.com/pricing/#add-ons-forms">100</a></p>
</td>
<td>
<p><a title="I didn't see anyhting along these lines when looking" href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/">No</a></p>
</td>
<td>
<p><a title="With Workers, you get access to a Key-Value database, but you don't have a way to do forms without building a worker to handle the submission." href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/">Yes and No</a></p>
</td>
<td>
<p><a title="" href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/">No</a></p>
</td>
<td>
<p><a title="This feels like cheating, but /shrug, it works." href="https://feedback.render.com/features/p/render-form-submissions">Yes - via Formspree integration</a></p>
</td>
</tr>
<tr>
<th>Analytics</th>
<td>
<p><a title="GitHub provides you no analytics on your websites page views." href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/">No</a></p>
</td>
<td>
<p><a title="Today GitLab does not provide any analytics, but being open source, there's an issue for Server-side analtyics." href="https://gitlab.com/gitlab-org/gitlab-pages/-/issues/384">Not Yet</a></p>
</td>
<td>
<p><a title="Analytics are available for $9 a month per site." href="https://www.netlify.com/pricing/#add-ons-analytics">Not for free</a></p>
</td>
<td>
<p><a title="Vercel offers Analtyics. It can run on any host but they are limited to 1 day for free." href="https://vercel.com/docs/analytics#limits">Free is only good for 1 day</a></p>
</td>
<td>
<p><a title="Cloudflare is all about caching your sites. They show you uncached traffic, you gotta pay for cached analytics." href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/">Yes</a></p>
</td>
<td>
<p><a title="Yes" href="https://firebase.google.com/pricing/">Yes</a></p>
</td>
<td>
<p><a title="I didn't see anyhting along these lines when looking" href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/">No</a></p>
</td>
</tr>
<tr>
<th>Split A/B Testing</th>
<td>
<p><a title="GitHub provides no A/B Testing I'm aware of." href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/">No</a></p>
</td>
<td>
<p><a title="I found some issues that are a year to four years old. Looks like this isn't available." href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/">No</a></p>
</td>
<td>
<p><a title="Netlify Split Testing lets your divide your traffic to your site between different deploys." href="https://docs.netlify.com/site-deploys/split-testing/">Yes</a></p>
</td>
<td>
<p><a title="I didn't see anyhting along these lines when looking" href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/">No</a></p>
</td>
<td>
<p><a title="I could find A / B testing for workers. Not for pages." href="https://developers.cloudflare.com/workers/examples/ab-testing">No</a></p>
</td>
<td>
<p><a title="Yes" href="https://firebase.google.com/pricing/">Yes</a></p>
</td>
<td>
<p><a title="I didn't see anyhting along these lines when looking" href="https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/">No</a></p>
</td>
</tr>
<tr>
<th>Allowed for Business Use</th>
<td>
<p><a title="GitHub Pages is not intended for or allowed to be used as a free web hosting service to run your online business, e-commerce site, or any other website that is primarily directed at either facilitating commercial transactions or providing commercial software as a service (SaaS)." href="https://docs.github.com/en/github/working-with-github-pages/about-github-pages#prohibited-uses">No</a></p>
</td>
<td>
<p><a title="With GitLab Pages, you can publish static websites directly from a repository in GitLab. Use for any personal or business website." href="https://docs.gitlab.com/ee/user/project/pages/">Yes</a></p>
</td>
<td>
<p><a title="I looked and nothing says you can or cannot use for any personal or business website, however, their offerings do." href="https://answers.netlify.com/t/is-the-free-tier-safe-for-client-projects/13535">Yes</a></p>
</td>
<td>
<p><a title="Hobby accounts are restricted to non-commercial personal use only." href="https://vercel.com/docs/platform/fair-use-policy#commercial-usage">No for hobby</a></p>
</td>
<td>
<p><a title="I looked and nothing says you can or cannot use for any personal or business website, however, their offerings do." href="https://pages.cloudflare.com/#pricing">Yes</a></p>
</td>
<td>
<p><a title="Acceptable use has some simple things you agree not to" href="https://cloud.google.com/terms/aup">Yes</a></p>
</td>
<td>
<p><a title="" href="https://render.com/acceptable-use">Yes</a></p>
</td>
</tr>
</tbody><tbody>
</tbody></table>
<h2>Comments</h2>
<blockquote>
<p><strong><a href="https://github.com/yashwanth2804">yashwanth2804</a></strong> commented <a href="https://github.com/jacebenson/jace.pro/issues/260#issuecomment-873416684">on Jul 3, 2021</a></p>
<p>Great JOB, please also include the if the free tire allows to have commercial website</p>
</blockquote>
<blockquote>
<p><strong><a href="https://github.com/jacebenson">jacebenson</a></strong> commented <a href="https://github.com/jacebenson/jace.pro/issues/260#issuecomment-875032990">on Jul 6, 2021</a></p>
<p><a href="https://github.com/yashwanth2804">@yashwanth2804</a> I thought I did include that.. Allowed for Business Use is the label.</p>
<p>I can relabel it or you can make a PR.</p>
<p>Just modify this file as needed. <a href="https://github.com/jacebenson/jace.pro/blob/master/src/_data/ssg.js">https://github.com/jacebenson/jace.pro/blob/master/src/_data/ssg.js</a></p>
</blockquote>
<blockquote>
<p><strong><a href="https://github.com/fmartins-andre">fmartins-andre</a></strong> commented <a href="https://github.com/jacebenson/jace.pro/issues/260#issuecomment-901362924">on Aug 18, 2021</a></p>
<p>Vercel free tier is not allowed to business use! Netlify and CloudFlare Pages are.<br />
These I checked.</p>
</blockquote>
<blockquote>
<p><strong><a href="https://github.com/jacebenson">jacebenson</a></strong> commented <a href="https://github.com/jacebenson/jace.pro/issues/260#issuecomment-901602297">on Aug 18, 2021</a></p>
<p>Thanks I'll update the page</p>
</blockquote>
<blockquote>
<p><strong><a href="https://github.com/jacebenson">jacebenson</a></strong> commented <a href="https://github.com/jacebenson/jace.pro/issues/260#issuecomment-901962252">on Aug 19, 2021</a></p>
<p>Can you share your sources for this?</p>
<p><strong><a href="https://github.com/fmartins-andre">fmartins-andre</a></strong> commented <a href="https://github.com/jacebenson/jace.pro/issues/260#issuecomment-902107504">on Aug 19, 2021</a></p>
<p><a href="https://vercel.com/docs/platform/fair-use-policy#commercial-usage">https://vercel.com/docs/platform/fair-use-policy#commercial-usage</a></p>
<p>Here, mate.<br />
I didn't find anything like this in Netlify or Cloudflare Pages.</p>
</blockquote>
<blockquote>
<p><strong><a href="https://github.com/jacebenson">jacebenson</a></strong> commented <a href="https://github.com/jacebenson/jace.pro/issues/260#issuecomment-902182720">on Aug 19, 2021</a></p>
<p>For Vercel, I didn't see that when I looked before.<br />
I've updated it.</p>
<p>I looked again for Cloudflare, they dont say aynthing one way or the other. Where as Github explicitly says you can't. So I'm making an assumption. Below the table I add a comment to each element.</p>
<p>I looked again at Netlify and like you said it's not explicitly stated, but they also don't say you cannot. There's a post about it on their answers site here where they say, don't <a href="https://answers.netlify.com/t/is-the-free-tier-safe-for-client-projects/13535">break the TOS and you wont have an issue</a></p>
</blockquote>
<blockquote>
<p><strong><a href="https://github.com/fmartins-andre">fmartins-andre</a></strong> commented <a href="https://github.com/jacebenson/jace.pro/issues/260#issuecomment-902190872">on Aug 19, 2021</a></p>
<p>I think it's secure to assume that if they say nothing, you can use it for business purposes. But it seems to these free tier solutions are all under the same kind of discretion about the termination of the offer. Vercel also has some statements about this:</p>
<blockquote>
<ol start="4">
<li>Hobby Plan. We offer a free hobby plan at our sole discretion. We may change the terms and conditions applicable to the hobby plan or discontinue offering the hobby plan at any time. We reserve the right to disable or remove any project or website deployment on the hobby plan with or without notice at our sole discretion. We may shut down and terminate projects or deployments using the hobby plan without notice for any reason or no reason.(...)<br />
--(<a href="https://vercel.com/legal/terms">https://vercel.com/legal/terms</a>)</li>
</ol>
</blockquote>
</blockquote>
<blockquote>
<p><strong><a href="https://github.com/dacog">dacog</a></strong> commented <a href="https://github.com/jacebenson/jace.pro/issues/260#issuecomment-948915832">on Oct 21, 2021</a></p>
<p>Great comparison! Thank you!</p>
</blockquote>
<!--EndFragment-->You want a blog? Here's how to get started2020-12-05T07:15:53Zhttps://jace.pro/post/2020-12-05-own-your-content-getting-started/Jace Benson<!--StartFragment-->
<ol>
<li>
<p><a href="https://jace.pro/post/2020-12-05-own-your-content-getting-started/#why-blog">Why Blog</a></p>
</li>
<li>
<p><a href="https://jace.pro/post/2020-12-05-own-your-content-getting-started/#getting-started">Getting started</a></p>
<ul>
<li><a href="https://jace.pro/post/2020-12-05-own-your-content-getting-started/#the-logical-workflow">The logical workflow</a></li>
<li><a href="https://jace.pro/post/2020-12-05-own-your-content-getting-started/#actually-making-the-content">Actually making the content</a></li>
</ul>
</li>
<li>
<p><a href="https://jace.pro/post/2020-12-05-own-your-content-getting-started/#contact-me">Let me know if you set one up I'd love to follow along</a></p>
</li>
</ol>
<p>Help me help you. Leave your future self notes.</p>
<p>I do this via this blog. I think this is a great way to do this.<a href="https://jace.pro/post/2020-12-05-own-your-content-getting-started/"></a></p>
<h1><a href="https://jace.pro/post/2020-12-05-own-your-content-getting-started/#why-blog">Why Blog</a></h1>
<p>I blog to keep notes of code I work on, and make them available for others. It's my way of saving me from myself. It's also my way of sharing what I've done. Others seem to find it useful, to win win. Also writing down my thoughts, means I have to at least understand it enough to talk about it. There's loads of reasons folks choose to blog.</p>
<p>Other benefits to do this privately or publicly.</p>
<p>Reasons to create content</p>
<table>
<thead>
<tr>
<th>Reason</th>
<th>Publicly</th>
</tr>
</thead>
<tbody>
<tr>
<td>Attract an Audience</td>
<td>✅</td>
</tr>
<tr>
<td>Establish Authority</td>
<td>✅</td>
</tr>
<tr>
<td>Build Rapport and Engagement</td>
<td>✅</td>
</tr>
<tr>
<td>Organize Your Thoughts and Learn</td>
<td>✅</td>
</tr>
<tr>
<td>Tell Your Story</td>
<td>✅</td>
</tr>
<tr>
<td>Meet New People</td>
<td>✅</td>
</tr>
<tr>
<td>Stand Out</td>
<td>✅</td>
</tr>
<tr>
<td>Validate Expertise</td>
<td>✅</td>
</tr>
<tr>
<td>Get into the habit of writing more</td>
<td>✅</td>
</tr>
<tr>
<td>Use the blog as a case study reference</td>
<td>✅</td>
</tr>
<tr>
<td>Share your perspective</td>
<td>✅</td>
</tr>
</tbody>
</table>
<p>If you're convinced but not sure where to start keep reading.<a href="https://jace.pro/post/2020-12-05-own-your-content-getting-started/"></a></p>
<h1><a href="https://jace.pro/post/2020-12-05-own-your-content-getting-started/#getting-started">Getting Started</a></h1>
<p>There's two sides of this.</p>
<p>Lots of places talk about each seperately. I'm going to tackle both here.</p>
<ol>
<li>There's the side of how to manage the ideas that become pieces. I think of this as the logical workflow.</li>
<li>There's the side of how to actually organize the data.</li>
</ol>
<p>This is my opinionated guide to get started. I've worked with most of the tools used over the years.</p>
<p>My preference is Git(Github or Gitlab) and Netlify.</p>
<p>You generally have three artifacts after you set this up.</p>
<ul>
<li>A place to store ideas and drafts</li>
<li>A place to store posts</li>
<li>A domain</li>
</ul>
<p>A domain is nice. They have a annual cost but generalyl they are pretty inexpensive.</p>
<p>By choosing Github and Netlify you should have no extra cost.<a href="https://jace.pro/post/2020-12-05-own-your-content-getting-started/"></a></p>
<h2><a href="https://jace.pro/post/2020-12-05-own-your-content-getting-started/#the-logical-workflow">The logical workflow</a></h2>
<ol>
<li>You have an question or idea. You don't know the answer but you would like to and think I might look that up. Write it down as an idea.</li>
<li>When you have time, review your ideas and start researching the question.</li>
<li>Once you're comfortable with the topic, create the post. Make sure you verify the content.</li>
</ol>
<p>Sometimes I start writing but often I will start with an idea.</p>
<p>By tracking this backlog of ideas you can let those thoughts go. You can comeback to them and work them little at a time. Writing is hard. Don't make it harder than it has to be.<a href="https://jace.pro/post/2020-12-05-own-your-content-getting-started/"></a></p>
<h2><a href="https://jace.pro/post/2020-12-05-own-your-content-getting-started/#actually-making-the-content">Actually making the content</a></h2>
<p>I use <a href="https://11ty.dev/">11ty</a> for my blog. I think it's great. I've made a template of my blog for you. Really.</p>
<p>Here's what I like about how <a href="https://github.com/jacebenson/jace-ty">Jace-ty</a> works.</p>
<ul>
<li>A folder for each post lets you organize your assets for each post with the text.</li>
<li>Build times are fast because 11ty is fast.</li>
<li>Search is important and included.</li>
<li>RSS feeds are great to let people read where they want to read.</li>
<li>Fast load times are important because no one wants a slow blog.</li>
</ul>
<p>You get all that by pressing this button.</p>
<p><a href="https://app.netlify.com/start/deploy?repository=https://github.com/jacebenson/jace-ty"><img src="https://www.netlify.com/img/deploy/button.svg" alt="Deploy to Netlify" /></a></p>
<p>What happens when you press that button.</p>
<ul>
<li>Netlify will ask for permission to Github so it can create a repository for you.</li>
<li>Netlify will link the repository with their system so they can build the files on update.</li>
</ul>
<p>What do you do after that?</p>
<ol>
<li>Update the <code>./src/_data/site.js</code> file with your details. The template files use this data to show your information.</li>
<li>Start creating content.</li>
</ol>
<ul>
<li>To create a Post look at the three sample posts in <code>./src/post/</code></li>
<li>Edit the post <code>index.md</code>. It starts with <a href="https://www.11ty.dev/docs/data-frontmatter/">frontmatter</a>. The content of the post is below the frontmatter.</li>
<li>Each post has two images.<br />
<code>featured.jpg</code> is the image shown on the post when you go to the page.<br />
<code>featured-thumbnail.jpg</code> is the image shown in footer for the last 4 posts, and also on the <code>/posts</code> of your site.</li>
</ul>
<ol start="3">
<li>
<p>You may have done those edits on Github. I prefer to do this locally. Here's how to get started;</p>
<pre class="language-shell"><code class="language-shell"><span class="token function">git</span> clone git@github.com:YOURUSERNAME/jace-ty.git my-blog <span class="token comment">#clones the code made from above</span><br /><span class="token builtin class-name">cd</span> my-blog <span class="token comment"># goes into the cloned directory</span><br /><span class="token function">yarn</span> <span class="token comment">#installs dependencies for this</span><br />code <span class="token builtin class-name">.</span> <span class="token comment">#opens vs code to this directory</span><br /><span class="token function">yarn</span> serve <span class="token comment"># this starts serve the site on 8081 ctrl-c stops this</span></code></pre>
<p>Now as you edit the files locally you can see them change on your localhost:8081</p>
<p>Copy one of the other posts folder, update the folder name, and the content. Replace the images</p>
<p>Once you're done making content, lets deploy that up to github.</p>
<pre class="language-shell"><code class="language-shell"><span class="token comment"># from cloned directory my-blog</span><br /><span class="token function">git</span> <span class="token function">add</span> <span class="token builtin class-name">.</span> <span class="token comment"># stages all the modified files commit</span><br /><span class="token function">git</span> status <span class="token comment"># shows you whats staged</span><br /><span class="token function">git</span> commit <span class="token parameter variable">-m</span> <span class="token string">"Created some content"</span> <span class="token comment"># commit message of what you did</span><br /><span class="token function">git</span> push <span class="token comment"># pushes the code up to github</span></code></pre>
</li>
</ol>
<p>Thats it!</p>
<p><a href="https://jace.pro/post/2020-12-05-own-your-content-getting-started/"></a></p>
<h1><a href="https://jace.pro/post/2020-12-05-own-your-content-getting-started/#contact-me">Contact me</a></h1>
<p>Easiest way is to drop a comment below or reach out to me on <a href="https://twitter.com/jacebenson">twitter.com/jacebenson</a></p>
<!--EndFragment-->New ServiceNow CLI2020-11-20T07:15:00Zhttps://jace.pro/post/2020-11-20-sn-cli-preview/Jace Benson<!--StartFragment-->
<p>Tonight I popped in the latest Let's Code Happy Hour on ServiceNow's Youtube channel. They were going to "Enhance the Karaoke App" that Chuck Tomasi maintains.<br />
It's great fun. The technology they choose to preview is not available yet. It's neat. I wanted to write about it before I forget since <strong>THIS IS NOT DOCUMENTED ANYWHERE YET</strong>.</p>
<p>At <a href="https://youtu.be/3tXqzXyyvxY?t=547">9:07 on the stream</a> Chuck starts summarizing what this is. Below I have that quote;</p>
<blockquote>
<p>We are going to be using the new cli.<br />
Which will be coming out shortly.<br />
This is a preview.<br />
I did ask our product people, <em>"Can I show this 'cause its not publicly available yet?"</em> It will be available in the store, you install the plugin, or the module, or whataver it is.<br />
And you will be able to configure endpoints.<br />
<strong>Think of it as a custom curl if you will, but you dont have to specify the full url or your credentials and all the stuff to be able to run macros.</strong><br />
From a command line (linux mac windows) you could automate some more stuff and integrate with scripted rest apis or the table apis or any of the built in apis to be able to carry out actions<br />
and trigger them in the instance from a command line.<br />
Chuck Tomasi</p>
</blockquote>
<p>This seems pretty sweet. During the stream I was thinking about some possible use cases;</p>
<ul>
<li>Start up script on a server to check in with ServiceNow</li>
<li>Generate Release Notes for ServiceNow Releases</li>
<li>Create a task (change request, item, incident)</li>
<li>Update a record</li>
</ul>
<p>That all seems .... powerful.</p>
<p>I can see this getting some good usage.</p>
<p>I asked "where do I get this?". It's not out yet and will be release <em>soon</em>.</p>
<p><a href="https://youtu.be/3tXqzXyyvxY?t=1937">One other thing mentioned</a> about how to get new commands <code>snc</code>;</p>
<blockquote>
<p>Yea and so what that does right is that<br />
connects to the instance and goes and<br />
you know introspects those table in which<br />
you were editing those records and pulls<br />
down any new command so that you can engage<br />
with them here.<br />
Andrew Barnes</p>
</blockquote>
<h2><a href="https://jace.pro/post/2020-11-20-sn-cli-preview/#what-does-this-look-like-on-the-terminal">What does this look like on the terminal?</a></h2>
<p>I typed out what was on his terminal below.</p>
<p><img src="https://jace.pro/post/2020-11-20-sn-cli-preview/snc-001.jpg" alt="" /><img src="https://jace.pro/post/2020-11-20-sn-cli-preview/snc-002-record-query.jpg" alt="" /></p>
<h2><a href="https://jace.pro/post/2020-11-20-sn-cli-preview/#this-new-thing-uses-three-tables">This new thing uses three tables</a></h2>
<ul>
<li>End Points [<code>sn_cli_metadata_end_point</code>]</li>
<li>Command Groups [<code>sn_cli_metadata_command_group</code>]</li>
<li>Commands [<code>sn_cli_metadata_command</code>]</li>
</ul>
<p><img src="https://jace.pro/post/2020-11-20-sn-cli-preview/command-group-list.jpg" alt="" /><img src="https://jace.pro/post/2020-11-20-sn-cli-preview/command-group-item.jpg" alt="" /><img src="https://jace.pro/post/2020-11-20-sn-cli-preview/endpoint-list.jpg" alt="" /></p>
<h2><a href="https://jace.pro/post/2020-11-20-sn-cli-preview/#what-are-my-thoughts">What are my thoughts?</a></h2>
<p>Well this is cool. I wish I could play with it. I hope it isn't attached to some random SKU.</p>
<p>This <em>might</em> get some serious usage if non-admins get permissions to use it.</p>
<p>Could I have used this in the past. Yes.</p>
<p>In the past when I've needed to connect to ServiceNow send up data to the instance. In those cases, this could have been helpful.</p>
<p>The ServiceNow CLI looks cool. It's a new feature I will mess with.</p>
<!--EndFragment-->Listacle of interesting posts2020-10-23T06:14:27Zhttps://jace.pro/post/2020-10-23-whats-new/Jace Benson<!--StartFragment-->
<p>I think I'm going to start some sort of review of the content from my news aggregater.</p>
<p>I'm not sure what format this will end up in but I'll start here in written form.</p>
<p>Let's dig in.</p>
<p>There's some great content for the Creatorcon 2020 event. So far</p>
<ul>
<li><a href="https://players.brightcove.net/5703385908001/zKNjJ2k2DM_default/index.html?videoId=ref:CC20-CCB1010">Prosenjit Sengupta - UI Builder: Build a Space App dashboard for Mars Rovers, Astro Images and NEOs</a><br />
This is great. He shows a lot of the functionality of the Now Components and Experience with the builder. It's 22 minutes, or 11 if you can run at doublespeed.</li>
<li><a href="https://www.youtube.com/watch?v=FU04cqUXIko">TechNow Ep 80 - Process Automation Designer/Playbook Part 1</a><br />
If you're curious about how the PAD system will look and work, this should meet the need.</li>
<li><a href="https://developer.servicenow.com/blog.do?p=/post/paris-graphql-framework/">Brad Titlon - Paris - GraphQL API Framework</a><br />
Brad went deep in here to help share this understanding of graphQL. If you don't get it. I'd look here.</li>
<li>Travis Toulson has been doing some live streams to tackle the Salary Survey he ran through. It's not <em>on</em> ServiceNow but it's related.<br />
<a href="https://www.youtube.com/watch?v=Lag14qxWYdU">Part 1</a>, <a href="https://www.youtube.com/watch?v=BUWNPJfMGgU">Part 2</a>, <a href="https://www.youtube.com/watch?v=g1lHRMfZEMY">Part 3</a>, <a href="https://www.youtube.com/watch?v=wHzt7dECCdg">Part 4</a></li>
<li>Mark Roethof dives deep into <code>g_form.setValue</code> I love these smaller scoped topics. <a href="https://community.servicenow.com/community?id=community_article&sys_id=e047d880db8c245466f1d9d968961994">Check it out here.</a></li>
<li><a href="https://community.servicenow.com/community?id=community_article&sys_id=b222ee63db7fd454a08a1ea668961933">Madison writes about "Storing And Using System Properties As Objects"</a></li>
<li>Mike Moody has been putting out the kind of content I want to see at K21. Recently, <a href="https://community.servicenow.com/community?id=community_video&sys_id=a47f4af3db37d05466f1d9d968961901">Triggering client-side UI Notifications on Async API response or long running job completion.</a></li>
<li>Nia McCash is killing it with her posts about Now Components. <a href="https://community.servicenow.com/community?id=community_article&sys_id=e85238cedb7f989066f1d9d968961995">How I'm Learning to Build Now Components</a>, <a href="https://community.servicenow.com/community?id=community_article&sys_id=a4485f701b402410305fea89bd4bcba6">Demistifying Now Components Slots - Named vs Default (Unnamed)</a> and <a href="https://community.servicenow.com/community?id=community_article&sys_id=8015b4a7dbb79854fb115583ca96198b">How to idenfity which Now Component Button was clicked</a></li>
</ul>
<p>Oh and if you want to hear some tough times Fedoruk and CJ went through their most recent pod about the <a href="https://share.transistor.fm/s/3889310f">worst things they've seen</a></p>
<!--EndFragment-->How to override a UI Action2020-10-13T06:13:45Zhttps://jace.pro/post/2020-10-13-overridding-ui-actions/Jace Benson<!--StartFragment-->
<p>Someone asked the other day, how to override the "Submit" ui action for incident.</p>
<p>Let me start with why you shouldn't change the oob "Submit" ui action. There is no specific "Submit" ui action for incident. So if you change the one on "global", it will change it for all tables. That is not the desired outcome.</p>
<p>Instead you should create a new UI action against the table you want with the same "Action Name". The new UI action should be all set then.</p>
<p>Chuck Tomasi discusses this on a stream <a href="https://youtu.be/_G8X9bi8spE?t=2496">here</a></p>
<!--EndFragment-->Hacktoberfest 2020 - lets get started2020-09-29T06:13:14Zhttps://jace.pro/post/2020-09-29-hacktoberfest-2020/Jace Benson<!--StartFragment-->
<p>I was thinking something about your past experience and why you think people should participate, but it could really be whatever you want.<br />
What is it, why do you think it’s worth participating, how did you get started, what does it typically look like, what is a quality pull request, then how do they get started at the end.</p>
<h1><a href="https://jace.pro/post/2020-09-29-hacktoberfest-2020/#what-is-hacktoberfest">What is Hacktoberfest</a></h1>
<p><a href="https://hacktoberfest.digitalocean.com/" title="Hacktoberfest">Hacktoberfest</a> is a event run by stewards of open source to encourage contributing to projects that are also open source.</p>
<h1><a href="https://jace.pro/post/2020-09-29-hacktoberfest-2020/#why-participate-in-hactoberfest">Why participate in Hactoberfest</a></h1>
<ul>
<li>The more able you have your community, the more that community can contribute.</li>
<li>When you have that, you can help any number of open source projects.</li>
<li>There's a free t-shirt. We're all very <a href="https://codecreative.io/blog/service-now-salary-influence-survey-2020/">well paid</a>,<br />
but this shirt will convince most of you.</li>
</ul>
<p>Okay now that your convinced (if you're not see the third bullet, it's, um enticing).<br />
What kinds of contributions do you have to make for this?<br />
GitHub focuses on "Quality contributions".<br />
What does that mean? Does this solve a problem or issue on the project, sounds good to me.</p>
<blockquote>
<p>Quantity is fun, quality is key" - Hacktoberfests Value #2</p>
</blockquote>
<h2><a href="https://jace.pro/post/2020-09-29-hacktoberfest-2020/#what-is-a-quality-pull-request">What is a quality pull request</a></h2>
<p>I'd wager anything is meaningful.<br />
That could be something as simple as cleaning up the <a href="http://contributors.md/">CONTRIBUTORS.md</a> file to something as complex as adding an integration to read the public Known Errors out of ServiceNow.</p>
<h1><a href="https://jace.pro/post/2020-09-29-hacktoberfest-2020/#how-did-i-get-started">How did I get started</a></h1>
<p>Why did I start doing the Hacktoberfest events? For me, it's all about doing something, anything.<br />
Hacktoberfest started in 2013. I didn't know about it until 2016. I'm pretty sure I got the shirt that year, but I can't find the evidence.</p>
<p>Do you want get more familiar with git? Do you want to learn something new? Great, nothing like Hacktoberfest to push you into something. That's my take on it.<br />
Git can be confusing. Heck, I still have problems. I'd never had done it without something to do.</p>
<p>I try learn something every October with this event. This year my focus is Now Components.</p>
<h1><a href="https://jace.pro/post/2020-09-29-hacktoberfest-2020/#how-do-you-get-started">How do you get started?</a></h1>
<p>Find a open source project you'd like to contribute to.<br />
I know I've had some.</p>
<p>Here's a short list of projects I'd suggest looking at;</p>
<ul>
<li><a href="https://github.com/ServiceNowDevProgram/sn-slack-points-thing/">Slacker</a> on <a href="https://sndevs.slack.com/">SNDevs</a>, you know you want to make this better.</li>
<li><a href="https://github.com/j4rodm/sn-libra/">Libra</a> is a toolkit of utilies to use on development instances.</li>
<li><a href="https://github.com/NowComponents/nowcomponents.github.io/">NowComponents</a> Catalog of open source Now Components for the Now Experience.</li>
<li><a href="https://github.com/jacebenson/cajunbot">Cajunbot</a> on Discord (used on the <a href="https://discord.gg/QaMwnGd">unoffical ServiceNow Discord</a>)</li>
<li><a href="https://github.com/jacebenson/news-api">ServiceNow News Aggregetor</a> See it in action here <a href="https://news.jace.pro/">news.jace.pro</a></li>
<li><a href="https://github.com/jacebenson/sndocs">ServiceNow Version Tracker</a></li>
<li><a href="https://github.com/jacebenson/workflow">Workflow</a> is tool to visualize diagrams in a markdown like text where there's also some standard flows</li>
</ul>
<p>If none of those stand out, here's the <a href="https://github.com/search?q=label%3Ahacktoberfest+state%3Aopen+no%3Aassignee+is%3Aissue&type=Issues">link to issues from the official site</a></p>
<h1><a href="https://jace.pro/post/2020-09-29-hacktoberfest-2020/#what-does-it-typically-look-like">What does it typically look like</a></h1>
<p>Most projects follow the "<a href="https://guides.github.com/introduction/flow/" title="GitHub Flow">GitHub Flow</a>".</p>
<ul>
<li>Find an issue, comment on it to claim it.</li>
<li>Fork the repository</li>
<li>Clone the repository</li>
<li>Create a branch</li>
<li>Make the changes to address the issue</li>
<li>Commit the changes to your fork's branch</li>
<li>Push your changes to your fork's branch</li>
<li>Open a Pull Request</li>
<li>Answer questions by the project maintainer and help where you can to get the work accepted</li>
</ul>
<p>That seems like a lot but really it isn't that much. Generally that's as complicated as it gets.</p>
<p>I'd love to see more folks contribute in the groups I watch. (I'm looking at 8000 strong from SNDevs Slack, and you smaller Discord community).</p>
<p>There's great content on <a href="https://dev.to/tcgronk/beginners-guide-to-hacktoberfest-3m0m" title="Beginners Guide to Hacktoberfest">Dev.to</a> about starting from nothing.</p>
<h1><a href="https://jace.pro/post/2020-09-29-hacktoberfest-2020/#go-contribute">Go contribute</a></h1>
<p>Add text here about contributing or creating a project.</p>
<!--EndFragment-->GraphQL in a way I understand2020-09-15T06:12:44Zhttps://jace.pro/post/2020-09-15-graphql/Jace Benson<!--StartFragment-->
<p>I have been dabbling with GraphQL for some time now but I still don't know much about it. Now that we, ServiceNow Developers, have to make the definitions for them we need to know a lot more. I was going to try to write a post about all that but Marcus Reinhardt has an amazing resource. <a href="https://github.com/noxify/ServiceNow-GraphQL-Example">https://github.com/noxify/ServiceNow-GraphQL-Example</a></p>
<p>This is a short post and something so I can find it easily but again thank you Marcus!</p>
<p>Other Resources</p>
<ul>
<li><a href="https://docs.servicenow.com/bundle/paris-application-development/page/integrate/graphql/concept/scripted-graph-ql.html">Paris Concept Docs</a></li>
<li><a href="https://servicenowthink.wordpress.com/2019/09/10/how-servicenow-is-updating-its-tech-stack-and-using-graphql/">Undocumented GraphQL thing</a></li>
</ul>
<!--EndFragment-->Undocumented - Setting User Preferences via URL2020-09-03T06:12:12Zhttps://jace.pro/post/2020-09-03-sysprarm_userpref/Jace Benson<!--StartFragment-->
<p>The other day on slack I read that you can set any user preference via URL by using this parameter scheme;</p>
<p><code>https://hi.service-now.com/incident_list.do?sysparm_userpref_literally_anything=whatever</code></p>
<p>Just replace <code>literally_anything</code> with the preference name, and the <code>whatever</code> with the value you want.</p>
<p>This seems like something you could use to possibly change language, timezone, update set, row limits. With that being said, anyone can do this so be careful.</p>
<p>I don't know that I trust anyone's links but I will take more care to look at them now. I am not sure if this works with the <a href="https://docs.servicenow.com/bundle/orlando-platform-user-interface/page/use/navigation/task/t_EnableTinyURLSupport.html">tiny url support</a></p>
<p>I did a quick search on the docs site for <code>sysparm_userpref</code> and you can see it's used in a number of pages but not really clear what it's doing. According to the <a href="https://docs.servicenow.com/bundle/geneva-release-notes/page/release-notes/r_Geneva-Patch-6.html">Genava Patch 6 page</a> it can disable concourse which goes to show you, it does in fact set prefrences.</p>
<p>The more you know!</p>
<!--EndFragment-->Careful with reserved words2020-09-03T06:11:39Zhttps://jace.pro/post/2020-09-03-reserved-words/Jace Benson<!--StartFragment-->
<p>If you have a variable say "class" or "package" when calling them via a script you will get weird results. I'd advise to avoid this list of names for columns.</p>
<h2><a href="https://jace.pro/post/2020-09-03-reserved-words/#javascript-reserved-words">Javascript Reserved Words</a></h2>
<table>
<thead>
<tr>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td><code>abstract</code></td>
<td><code>arguments</code></td>
<td><code>await</code></td>
<td><code>boolean</code></td>
<td><code>break</code></td>
<td><code>byte</code></td>
<td><code>case</code></td>
<td><code>catch</code></td>
</tr>
<tr>
<td><code>char</code></td>
<td><code>class</code></td>
<td><code>const</code></td>
<td><code>continue</code></td>
<td><code>debugger</code></td>
<td><code>default</code></td>
<td><code>delete</code></td>
<td><code>do</code></td>
</tr>
<tr>
<td><code>double</code></td>
<td><code>else</code></td>
<td><code>enum</code></td>
<td><code>eval</code></td>
<td><code>export</code></td>
<td><code>extends</code></td>
<td><code>false</code></td>
<td><code>final</code></td>
</tr>
<tr>
<td><code>finally</code></td>
<td><code>float</code></td>
<td><code>for</code></td>
<td><code>function</code></td>
<td><code>goto</code></td>
<td><code>if</code></td>
<td><code>implements</code></td>
<td><code>import</code></td>
</tr>
<tr>
<td><code>in</code></td>
<td><code>instanceof</code></td>
<td><code>int</code></td>
<td><code>interface</code></td>
<td><code>let</code></td>
<td><code>long</code></td>
<td><code>native</code></td>
<td><code>new</code></td>
</tr>
<tr>
<td><code>null</code></td>
<td><code>package</code></td>
<td><code>private</code></td>
<td><code>protected</code></td>
<td><code>public</code></td>
<td><code>return</code></td>
<td><code>short</code></td>
<td><code>static</code></td>
</tr>
<tr>
<td><code>super</code></td>
<td><code>switch</code></td>
<td><code>synchronized</code></td>
<td><code>this</code></td>
<td><code>throw</code></td>
<td><code>throws</code></td>
<td><code>transient</code></td>
<td><code>true</code></td>
</tr>
<tr>
<td><code>try</code></td>
<td><code>typeof</code></td>
<td><code>var</code></td>
<td><code>void</code></td>
<td><code>volatile</code></td>
<td><code>while</code></td>
<td><code>with</code></td>
<td><code>yield</code></td>
</tr>
</tbody>
</table>
<p>Try it out. make a catalog item. make a variable, call it "class", try to use that variable in a refernce qualifer and observe weird things.</p>
<p><a href="https://docs.servicenow.com/bundle/orlando-application-development/page/script/topic/c_Script.html">The docs also say, "you cannot use reserved words"</a>.</p>
<p>Other's have had issues using these terms for column names. If you can, avoid that so you don't have the <a href="https://community.servicenow.com/community?id=community_question&sys_id=fddbba91dbbf48945129a851ca961933">same problem here as Detlef</a>.</p>
<h2><a href="https://jace.pro/post/2020-09-03-reserved-words/#mysql-reserved-words">MysQL Reserved Words</a></h2>
<p><a href="https://docs.servicenow.com/bundle/orlando-platform-administration/page/use/reporting/concept/c_DatabaseViews.html#d771413e105">Database view reserved words</a> seems to be different and dependent on <a href="https://dev.mysql.com/doc/refman/8.0/en/keywords.html">MysQL's list</a></p>
<!--EndFragment-->State of Ideas2020-08-18T06:10:47Zhttps://jace.pro/post/2020-08-18-state-of-ideas/Jace Benson<!--StartFragment-->
<p>The Idea portal is great in that we can share these ... what were enhancements on HI with eachother. However, it still feels like a black box of not happening. Most ideas aren't actioned on and the ones that are, are confusing. Here's a list of ones I've been tracking. There is no way to comment on a idea once closed so no way to add context or respond. This is frustrating when it's closed without handling the specifics the original question or ask.</p>
<p>At <strong>417</strong> upvotes, and submitted 10 months ago by me. Now in "Under Review", <a href="https://community.servicenow.com/community?id=view_idea&sysparm_idea_id=d60a8d46db6c04500be6a345ca961996&sysparm_idea_table=x_snc_com_ideation_idea&sysparm_module_id=enhancement_requests">Create a public ROADMAP of features/plugins for upcoming releases</a>. This is still outstanding. According to the Idea Portal page, things in this state should be dispositioned in 6 weeks.</p>
<p>At <strong>285</strong> upvotes, and submitted 10 months ago by Matt Warwick. Sometime in June, it was closed with <strong>"Unlikely to implement"</strong>, "<a href="https://community.servicenow.com/community?id=view_idea&sysparm_idea_id=fba89402dbe0801014d6fb2439961936&sysparm_idea_table=x_snc_com_ideation_idea&sysparm_module_id=enhancement_requests">Improve WYSIWYG HTML Editor/TinyMCE</a>". This is long overdue. Paris release notes have some TinyMCE enhancements but also the comment says, "This feature has been added in the Paris release.". Which is it? I asked on <a href="https://twitter.com/jacebenson/status/1283980567915253762?s=20">Twitter</a>. It's still unclear.</p>
<p>At <strong>184</strong> upvotes, and submitted 10 months ago by Alexander. On 2020-08-18 it was changed to "In Consideration", "<br />
<a href="https://community.servicenow.com/community?id=view_idea&sysparm_idea_id=7ef66823dbacc0d014d6fb24399619c1&sysparm_idea_table=x_snc_com_ideation_idea&sysparm_module_id=enhancement_requests">Copy / Paste images and attachments from clipboard</a>". This idea is not new. I am actually suprised it's not already done yet. The change is not large to do it. I've two posts for implementing it but we shouldn't have to do this. It should be standard.</p>
<p>At 80 upvotes, and submitted 9 months ago by Drew. On 2020-08-12 it wsa changed to <strong>"Unlikely to implement"</strong>, "<a href="https://community.servicenow.com/community?id=view_idea&sysparm_idea_id=d63d3faa1b45c050ada243f6fe4bcba7&sysparm_idea_table=x_snc_com_ideation_idea&sysparm_module_id=enhancement_requests">Document all of the ServicePortal directives...</a>". This is truely unfortunate. As developers knowing what we have access to use is critical. When we have to interrogate directives that are there, but just not documented means we have to explore. Yansa has made one of their products a well made, maintainted and documented set of components for service portal their deal. We should have that kind of experience with all directives in Service Portal. Not just the ones ServiceNow deems are important. I'm unsuprised by this as it's my opinion that Service Portal will see less and less updates as the Seismic framework gets more time.</p>
<p>At 40 upvotes, and submitted 11 months ago by Hatmaker. Now "In Consideration", "<a href="https://community.servicenow.com/community?id=view_idea&sysparm_idea_id=75aa3202db0080d44819fb24399619f0&sysparm_idea_table=x_snc_com_ideation_idea&sysparm_module_id=enhancement_requests">Make the HealthScan (ACEReport) available to customer within the tool</a>". This was listed as a feature for a hot minute with either Madrid or Orlando but was pulled from the PTR notes. I'm not sure why but if the feature was nearly ready with one of theose two releases this should have been a fast one to get out. I'm glad its in consideration, but I wish it were here now.</p>
<p>At 39 upvotes, and submitted 10 months ago by Marco. Sometime in June, it was closed with <strong>"Unlikely to implement"</strong>, "<a href="https://community.servicenow.com/community?id=view_idea&sysparm_idea_id=4686654fdbe4c0140be6a345ca9619f4&sysparm_idea_table=x_snc_com_ideation_idea&sysparm_module_id=enhancement_requests">Pre- & Post-script for update set</a>". This is available with plugins you can see it in the messages when installing something. We should have the same tools that available to plugins authors. As an administrator of ServiceNow, it's <strong>OFTEN</strong> I have to write a piece of code to fix data as part of a release for an update set. This is unfortunate ServiceNow wont give us the tools we are asking for.</p>
<p>At 38 upvotes, and submitted 10 months ago by Blake. Sometime in June, it was closed with <strong>"Unlikely to implement"</strong>, "<a href="https://community.servicenow.com/community?id=view_idea&sysparm_idea_id=e3cd61d7dba88890d82ffb24399619d1&sysparm_idea_table=x_snc_com_ideation_idea&sysparm_module_id=enhancement_requests">Allow Multi-Row Variable Sets to be 'Global'</a>". This is also terribly sad. As folks want to use Multi-Row Variable Sets, this is just another reason not to. What does this actually mean? Well in Workflow, to show variables on catalog tasks, you must checkout the workflow and add each variable on to each task manually, or... set the variable to Global. This is a convience method that worked for all things up until Multi-Row Variable Sets. The fact it's now caveated makes them worse. Also the answer here doesn't even address the problem described which is the use of Multi-Row Variable sets on Workflow.</p>
<p>At 6 upvotes, and submitted 5 months ago by Ian Mildon. Sometime in June, it was changed to "In Consideration", "<a href="https://community.servicenow.com/community?id=view_idea&sysparm_idea_id=8be7d184db2340d06064eeb5ca9619a7&sysparm_idea_table=x_snc_com_ideation_idea&sysparm_module_id=enhancement_requests">Add Business Calendars (Fiscal Calendars) to reporting tools</a>". This should not need to be asked for. Anything you can do on a list filter, you should be able to do on a standard report. Anything you can do on a report, you should be able to do on list. I was going to leave that alone but I went ahead and made the idea for that.</p>
<p>At 1 upvote, and submitted moments ago by me. <a href="https://community.servicenow.com/community?id=view_idea&sysparm_idea_id=f8e34f0c1b7a5010d2ccea89bd4bcb07&sysparm_idea_table=x_snc_com_ideation_idea&sysparm_module_id=enhancement_requests">Lists filters and Report Filters should have feature parity</a>.</p>
<!--EndFragment-->Opportunity is out there2020-07-30T06:10:11Zhttps://jace.pro/post/2020-07-30-opportunity-is-out-there/Jace Benson<!--StartFragment-->
<p>The other day I was on my computer when I got a message.</p>
<p>"Hey Jace, Do you have any thoughts on getting a job working on ServiceNow during these times?" (I wasn't asked this specifically but the conversation went down that way)</p>
<p>Oof, when asked this the first thing I do is consider myself losing my employment. I cannot begin to know the worry they have.</p>
<p>These are terrible times. I wish you all best, but every time I try to get involved getting someone a gig or job things go sideways fast. So I stopped doing that. Now I just tell people... the stuff below. That's why I'm writing this. So I can share it use it to cover all the things.</p>
<p>Since March I've been watching <a href="https://sndevs.com/">slack</a> cautiously. Reading about lay offs and furloughs.</p>
<p>I encourage everyone in this space to listen to <a href="https://share.transistor.fm/s/bfec71fc">Robert Fedoruk and CJ Wesley's podcast featuring Kyle Carson</a>.</p>
<h2><a href="https://jace.pro/post/2020-07-30-opportunity-is-out-there/#thoughts-on-getting-a-job-working-on-servicenow">Thoughts on getting a job working on ServiceNow</a></h2>
<p>First you need to land an interview. To do that, make an amazing resume. Some say a resume isn't important, some say it is. I like my resume and trying to make it look good, but it's a weird thing. A piece of paper listing skills, history, accomplisments and why you want to work there.</p>
<h3><a href="https://jace.pro/post/2020-07-30-opportunity-is-out-there/#resumes-are-the-tickets-to-interviews">Resumes are the tickets to interviews</a></h3>
<p>There's lots of things online about resumes. I don't have concrete evidence on what works and what doesn't, so I'll share my thoughts from my experience.</p>
<p>I have a "Base" resume I keep up to date with all my experience and such, and I make copies of it tailored to companies needs.</p>
<table>
<thead>
<tr>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td>1. <strong>Keep it current.</strong></td>
<td>Update that resume anytime you get a job with the tasks or skills they list.</td>
</tr>
<tr>
<td>2. <strong>Don't lie.</strong></td>
<td>It's easy to lie, not so easy to get away with it. I wouldn't want to hire a liar.</td>
</tr>
<tr>
<td>3. <strong>Describe creatively.</strong></td>
<td>"Handled integrations." becomes, "Saved 5 hours per week per person automating ServiceNow to Payroll feeds."</td>
</tr>
<tr>
<td>4. <strong>Know your skills.</strong></td>
<td>An admin and a developer can look the same on paper.</td>
</tr>
<tr>
<td>5. <strong>Clean up your social media.</strong></td>
<td>If they look you up, you don't want controversial things coming up.</td>
</tr>
<tr>
<td>6. <strong>Know your resume.</strong></td>
<td>BE READY TO SPEAK ON EVERY THING YOU PUT ON THE RESUME.</td>
</tr>
<tr>
<td>7. <strong>Make it personal.</strong></td>
<td>Tailor the resume to the job. Use their lingo from their job posting.</td>
</tr>
<tr>
<td>8. <strong>Quantify your successes.</strong></td>
<td>Numbers will find attention.</td>
</tr>
<tr>
<td>9. <strong>Enlist your community.</strong></td>
<td>Share the details where you help others and they help you.</td>
</tr>
<tr>
<td>10. <strong>Pair your resume down.</strong></td>
<td>Be concise. This isn't an biography.</td>
</tr>
</tbody>
</table>
<p>You <em>should</em> update your resume per position applied. Show your best sides to the potential employer. I've done this but not every time.</p>
<h3><a href="https://jace.pro/post/2020-07-30-opportunity-is-out-there/#interviews-are-just-conversations-to-give-and-get-information">Interviews are just conversations to give and get information</a></h3>
<p>So since I'm still loving Hamilton I'm going to try something new;</p>
<p><strong>One</strong>, <strong>two</strong>, <strong>three</strong>, <strong>four</strong>, <strong>five</strong>, <strong>six</strong>, <strong>seven</strong>, <strong>eight</strong>, <strong>nine</strong>... It's the <strong>ten</strong> jobby commandments.</p>
<table>
<thead>
<tr>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td>1. <strong>Focus and elevate.</strong></td>
<td>Know your worth and expect it.(I read <a href="https://www.kalzumeus.com/2012/01/23/salary-negotiation">this</a> to get there. <strong>Every</strong>. <strong>Single</strong>. <strong>Time</strong>).</td>
</tr>
<tr>
<td>2. <strong>Ready questions for people.</strong></td>
<td>Screening call: benefits, culture, company expectations. Interview: team, and technical specifics.</td>
</tr>
<tr>
<td>3. <strong>Apply to at least three places.</strong></td>
<td>One you don't want work at, and the rest you do. Practice with the "don't" place.</td>
</tr>
<tr>
<td>4. <strong>Take notes.</strong></td>
<td>Write down notes during the all interview steps. You won't regret it, and then you'll have it to reference later.</td>
</tr>
<tr>
<td>5. <strong>Research. Research. Research.</strong></td>
<td>Understand the goals of each company. What their lines of business are, and consider would you fit in there.</td>
</tr>
<tr>
<td>6. <strong>Never give a number first.</strong></td>
<td>Goal: Verify you <strong>want</strong> to work here and if they <strong>want</strong> to hire you a lot. When that's true, numbers are flexible.</td>
</tr>
<tr>
<td>7. <strong>Listen and repeat.</strong></td>
<td>Use keywords from the job posting, and use them where appropriate.</td>
</tr>
<tr>
<td>8. <strong>Money isn't everything.</strong></td>
<td>It's important. Some places can't offer you what you need. Consider negotiating extra time off then.</td>
</tr>
<tr>
<td>9. <strong>"Interesting" is a great word.</strong></td>
<td>Them: We can offer you 80k. You: 80k is interesting. It's not quite where we need this.</td>
</tr>
<tr>
<td>10. <strong>Defer to a EXTERNAL_AUTHORTY.</strong></td>
<td>This gives you a scapegoat for refusing a request while not being guilty of the refusal yourself.</td>
</tr>
</tbody>
</table>
<!--EndFragment-->TechNow Ep77 | Review of Paris Features2020-07-28T06:09:17Zhttps://jace.pro/post/2020-07-28-technow-ep77-paris-features/Jace Benson<!--StartFragment-->
<h2><a href="https://jace.pro/post/2020-07-28-technow-ep77-paris-features/#the-topics-from-the-registration-page">The Topics from the Registration page;</a></h2>
<p>On the registration page they mention;</p>
<ul>
<li>OpenID SSO</li>
<li>Flow Designer</li>
<li>Integration Hub</li>
<li>Source Control</li>
<li>Instance Data Replication</li>
<li>Automated Test Framework</li>
</ul>
<p><img src="https://jace.pro/post/2020-07-28-technow-ep77-paris-features/register.png" alt="" /></p>
<p>So I watched the "TechNow Tuesday: Discover the Paris Platform features Review"</p>
<p>They hit a lot of things. Here's what I noted from the video.</p>
<h2><a href="https://jace.pro/post/2020-07-28-technow-ep77-paris-features/#atf">ATF</a></h2>
<p><strong><a href="https://docs.servicenow.com/bundle/paris-application-development/page/administer/auto-test-framework/concept/custom-ui-test-steps.html#d1612322e757">Custom UI versioning support</a></strong> <em>This is to version the Custom UI stuff like flows and workflows. You may want to update old tests for that version if you make tests</em><br />
<strong><a href="https://docs.servicenow.com/bundle/paris-application-development/page/administer/auto-test-framework/concept/atf-page-inspector.html#d1172595e127">Improved indexing</a></strong> <em>Similiar elements are not easily identified</em><br />
<strong><a href="https://docs.servicenow.com/bundle/paris-application-development/page/administer/auto-test-framework/concept/atf-page-inspector.html#d1172595e127">Page inspector enhancements</a></strong> <em>Better error messaging</em></p>
<h2><a href="https://jace.pro/post/2020-07-28-technow-ep77-paris-features/#authentication">Authentication</a></h2>
<p><strong><a href="https://docs.servicenow.com/bundle/paris-servicenow-platform/page/administer/integrationhub/concept/connections-dashboard.html">Connections tab on Flow designer</a></strong> <em>Very nice. Also, you can add child aliases.</em><br />
<strong><a href="https://docs.servicenow.com/bundle/paris-platform-administration/page/integrate/single-sign-on/concept/OIDC-SSO-overview.html">OpenID Connect SSO</a></strong> <em>Authenticate against Google, Facebook or whatever. To do that, <a href="https://docs.servicenow.com/bundle/paris-platform-administration/page/integrate/single-sign-on/task/create-OIDC-configuration-SSO.html">Create an OpenID Connect configuration</a>.</em><br />
<strong><a href="https://docs.servicenow.com/bundle/paris-servicenow-platform/page/build/service-portal/task/enable-self-registration.html">External self-user registration</a></strong> <em>This is great - lets user self register. All you need to do is <a href="https://docs.servicenow.com/bundle/paris-platform-administration/page/integrate/authentication/concept/external-user-self-registration.html">turn on the plugin</a></em>\</p>
<ul>
<li>
<p>Once enabled create a <a href="https://docs.servicenow.com/bundle/paris-platform-administration/page/integrate/authentication/task/external-user-configuration.html">User Registration Configuration</a> and you'll get to set up these if you want;</p>
<ul>
<li>Terms and conditions</li>
<li>ReCaptcha (requires <a href="https://docs.servicenow.com/bundle/paris-platform-administration/page/integrate/authentication/task/configure-recaptcha-sp.html">Configuring Google reCCAPTCHA</a>)</li>
<li>Multiple instances of this per portal</li>
</ul>
</li>
</ul>
<h2><a href="https://jace.pro/post/2020-07-28-technow-ep77-paris-features/#core-platform">Core Platform</a></h2>
<p><strong><a href="https://docs.servicenow.com/bundle/paris-platform-administration/page/administer/reference-pages/task/t_ScheduleAScriptExecution.html">Schedule Jobs - Business Calendar offset</a></strong> <em>If you need to run something on a recurring basis for business offsets</em><br />
<strong><a href="https://docs.servicenow.com/bundle/paris-platform-administration/page/administer/platform-performance/concept/instance-view.html">Performance dashboard - instance view</a></strong> <em>Now displays for entire instance and you can turn on and off for specific nodes</em><br />
<strong>Robust transform engine (RTE) wildcards</strong><br />
<strong><a href="https://docs.servicenow.com/bundle/paris-platform-administration/page/administer/import-sets/concept/robust-import-set-transformers.html">Robust transform engine (RTE) nested structure</a></strong> <em>Previously only support flat json structures</em></p>
<ul>
<li>Scoped data administration</li>
</ul>
<h2><a href="https://jace.pro/post/2020-07-28-technow-ep77-paris-features/#domain-separation">Domain separation</a></h2>
<p><strong><a href="https://docs.servicenow.com/bundle/paris-platform-administration/page/administer/company-and-domain-separation/concept/ds-application-properties.html">Application properties</a></strong> <em>Different value for different domains for specific applications</em><br />
<strong>Scheduled jobs - Domain iterator</strong></p>
<h2><a href="https://jace.pro/post/2020-07-28-technow-ep77-paris-features/#flow-designer">Flow Designer</a></h2>
<p><strong><a href="https://docs.servicenow.com/bundle/paris-servicenow-platform/page/administer/flow-designer/concept/flows.html#d1519792e190">Action instance order renaming</a></strong> <em>No longer nested. 3.2.1 => 8. Copy the flow if you're worried before you update the flow</em><br />
<strong><a href="https://docs.servicenow.com/bundle/paris-servicenow-platform/page/administer/flow-designer/task/duplicate-action-subflow.html">Duplicate actions instance</a></strong> <em>huge time saver</em><br />
<strong><a href="https://docs.servicenow.com/bundle/paris-application-development/page/app-store/dev_portal/API_reference/ScriptableFlowAPI/concept/ScriptableFlowAPI.html">FlowAPI enhancements</a></strong> <em>Older FlowAPI calls will work but please use the new stuff</em><br />
<strong><a href="https://docs.servicenow.com/bundle/paris-application-development/page/app-store/dev_portal/API_reference/FlowScript/concept/FlowScriptAPI.html">FlowScriptAPI</a></strong> <em>These are used within the flow</em><br />
<strong><a href="https://docs.servicenow.com/bundle/paris-servicenow-platform/page/administer/flow-designer/concept/flow-actions.html">Ghost actions</a></strong> <em>Have you ever noticed in production flows fail to open if referencing missing actions</em><br />
<strong><a href="https://docs.servicenow.com/bundle/paris-servicenow-platform/page/administer/flow-designer/concept/flow-logic-make-decision.html">Decision flow - Turn off branches</a></strong> _This is nice<br />
<strong>Decision flow - Avoid repetitive "Update record" actions by applying the answer data</strong><br />
<strong><a href="https://docs.servicenow.com/bundle/paris-servicenow-platform/page/administer/flow-designer/reference/get-cat-variables-flow-designer.html">Multi-row Variable Set (MVRS) support</a></strong><br />
<strong><a href="https://docs.servicenow.com/bundle/paris-servicenow-platform/page/administer/flow-designer/task/create-flow-roles.html">Run with roles</a></strong><br />
<strong><a href="https://docs.servicenow.com/bundle/paris-servicenow-platform/page/administer/flow-designer/reference/send-sms-action.html">Send SMS action</a></strong><br />
<strong><a href="https://docs.servicenow.com/bundle/paris-servicenow-platform/page/administer/flow-designer/reference/submit-catalog-item-request-flow-designer.html">Submit catalog item request action</a></strong> <em>Another nail in the order guide coffin</em><br />
<strong>Support multiple active connections</strong><br />
<strong><a href="https://docs.servicenow.com/bundle/paris-servicenow-platform/page/administer/flow-designer/reference/update-multiple-records-action-designer.html">Update and delete multiple step</a></strong> <em>Chuck uses it as a cleanup to delete the logs</em><br />
<strong><a href="https://docs.servicenow.com/bundle/paris-servicenow-platform/page/administer/flow-designer/concept/content-filtering-flow-designer.html">User access control criteria</a></strong> <em>Only show actions they can use</em></p>
<h2><a href="https://jace.pro/post/2020-07-28-technow-ep77-paris-features/#integrationhub">IntegrationHub</a></h2>
<p><strong><a href="https://docs.servicenow.com/bundle/paris-platform-administration/page/administer/import-sets/concept/data-stream-data-source.html">Data sources - data stream</a></strong> <em>Objects can be flattened into import table. Or nested in a field. Pre-import script needed for this.</em><br />
<strong>Dynamic object support and data stream output</strong> <em>This can be great to do introspection of other data</em><br />
<strong><a href="https://docs.servicenow.com/bundle/paris-servicenow-platform/page/administer/integrationhub/concept/data-stream-actions.html">Data stream</a></strong> <em>Support for outputs in script parser. You now have access to <code>action_inputs</code> and action scripts</em><br />
<strong><a href="https://docs.servicenow.com/bundle/paris-servicenow-platform/page/administer/flow-designer/reference/json-parser-step-action-designer.html">JSON Parser Flow Designer/IntegrationHub step</a></strong> <em>Used live on lchh week of 7/23</em><br />
<strong><a href="https://docs.servicenow.com/bundle/paris-application-development/page/app-store/dev_portal/API_reference/JSONStreamingBuilder/concept/JSONStreamingBuilderScopedAPI.html">JSON Payload Builder</a></strong> <em>Builds file contents for api calls</em><br />
<strong><a href="https://docs.servicenow.com/bundle/paris-application-development/page/app-store/dev_portal/API_reference/XMLStreamingBuilder/concept/XMLStreamingBuilderScopedAPI.html">XML Payload Builder</a></strong> <em>Builds file contents for api calls</em></p>
<h2><a href="https://jace.pro/post/2020-07-28-technow-ep77-paris-features/#integration-security">Integration Security</a></h2>
<p><strong><a href="https://docs.servicenow.com/bundle/paris-platform-administration/page/administer/login/task/t_AccessControl.html">Outbound IP access controls</a></strong> <em>A poor mans firewall - stops the instance and Midservers from hitting the IP.</em></p>
<h2><a href="https://jace.pro/post/2020-07-28-technow-ep77-paris-features/#platform">Platform</a></h2>
<p><strong><a href="https://docs.servicenow.com/bundle/paris-application-development/page/integrate/graphql/concept/scripted-graph-ql.html">GraphQL</a></strong><br />
<strong>Archiving Multi-consumer archiving</strong><br />
<strong><a href="https://docs.servicenow.com/bundle/paris-platform-administration/page/administer/database-rotation/task/t_CreateADestructionRule.html">Archiving - Destroy related records</a></strong><br />
<strong><a href="https://docs.servicenow.com/bundle/paris-platform-administration/page/administer/database-rotation/task/t_ViewArchivedData.html#t_RestoreArchivedData">Archiving - Restore related records</a></strong><br />
<strong><a href="https://docs.servicenow.com/bundle/paris-servicenow-platform/page/administer/metricbase/task/set-up-data-monitoring.html">MetricBase - Non <code>sys_id</code> based subjects for MetricBase</a></strong><br />
<strong><a href="https://docs.servicenow.com/bundle/paris-servicenow-platform/page/administer/instance-data-replication/concept/bidirectional-replication.html">Instance data replication - bidirectional</a></strong> <em>Now it's bidirection by one checkbox (Technow planned in December)</em><br />
<strong><a href="https://docs.servicenow.com/bundle/paris-servicenow-platform/page/administer/instance-data-replication/concept/discrete-producer-replication-sets.html">Instance data replication - discrete sets</a></strong></p>
<h2><a href="https://jace.pro/post/2020-07-28-technow-ep77-paris-features/#notifications">Notifications</a></h2>
<p><strong><a href="https://docs.servicenow.com/bundle/paris-servicenow-platform/page/administer/notification/task/set-email-address-filters.html">Inbound / outbound email address filters</a></strong></p>
<h2><a href="https://jace.pro/post/2020-07-28-technow-ep77-paris-features/#platform-security">Platform security</a></h2>
<p><strong><a href="https://docs.servicenow.com/bundle/paris-platform-administration/page/administer/contextual-security/concept/explicit-roles.html">Explicit roles</a></strong> <em><a href="https://docs.servicenow.com/bundle/paris-platform-administration/page/administer/security/reference/explicit-role-plugin.html">Requires HI to enable</a></em><br />
<strong>Mutual exclusive roles</strong></p>
<h2><a href="https://jace.pro/post/2020-07-28-technow-ep77-paris-features/#process-automation-designer">Process Automation Designer</a></h2>
<p><strong><a href="https://docs.servicenow.com/bundle/paris-servicenow-platform/page/administer/process-automation-designer/concept/process-automation-designer.html">Process Automation Designer</a></strong><br />
<strong><a href="https://docs.servicenow.com/bundle/paris-servicenow-platform/page/administer/process-automation-designer/concept/process-automation-designer-lanes-activities.html">Playbook experience</a></strong> <em>Visual experience for Process Automation Designer in workspace</em>\</p>
<h2><a href="https://jace.pro/post/2020-07-28-technow-ep77-paris-features/#service-portal">Service Portal</a></h2>
<p><strong><a href="https://docs.servicenow.com/bundle/paris-servicenow-platform/page/build/service-portal/concept/portal-analyzer.html">Portal Analyzer</a></strong></p>
<h2><a href="https://jace.pro/post/2020-07-28-technow-ep77-paris-features/#source-control">Source control</a></h2>
<p><strong><a href="https://docs.servicenow.com/bundle/paris-application-development/page/build/applications/concept/manage_global_application_files.html">Global support</a></strong> <em>Set <code>sn_g_app_creator.allow_global</code> property to <code>true</code> allow global apps in studio.</em><br />
<strong><a href="https://docs.servicenow.com/search?q=Incremental+loading">Delta loading - No good link</a></strong> <em>This is big. You don't need to worry about destroying the tables and such on branch switches.</em></p>
<h2><a href="https://jace.pro/post/2020-07-28-technow-ep77-paris-features/#script-debugging-enhanced">Script debugging enhanced</a></h2>
<p><strong><a href="https://docs.servicenow.com/bundle/paris-application-development/page/script/debugging/task/evaluate-expressions.html">Console debugger</a></strong> <em><a href="https://www.youtube.com/watch?v=7gHQPk5hSXc">Video by Brad Tilton</a> <a href="http://developer.servicenow.com/to.do?u=ScriptDebuggerTraining_Paris">Training</a></em></p>
<h2><a href="https://jace.pro/post/2020-07-28-technow-ep77-paris-features/#upgrades">Upgrades</a></h2>
<p><strong>Skipped update records resolution tracking</strong> <em>You just upgraded paris those changes are now captured in update sets.</em></p>
<h2><a href="https://jace.pro/post/2020-07-28-technow-ep77-paris-features/#upgrade-center">Upgrade Center</a></h2>
<p><strong><a href="https://docs.servicenow.com/bundle/paris-platform-administration/page/administer/upgrade-center/reference/uc-previewed-changes.html#d435143e37">Preview your upgrade</a></strong> <em>Video coming in September on Technow.</em><br />
<strong>Review completed upgrade</strong><br />
<strong>Manage skips with VTB</strong></p>
<h2><a href="https://jace.pro/post/2020-07-28-technow-ep77-paris-features/#workspace">Workspace</a></h2>
<p><strong>Agent email client</strong> <em>Recipient fields/picker. Attachments. Quick messages.</em><br />
<strong>Activity stream</strong> <em>Filter by conversation. Attachments. Single scrollbars - was double before.</em><br />
<strong>Condition Builder</strong><em>Was a angular thing now its now-exp thing</em><br />
<strong><a href="https://docs.servicenow.com/bundle/paris-servicenow-platform/page/administer/workspace/concept/domain-selection.html">Domain separation</a></strong> <em>Is asked when making new records.</em><br />
<strong>TinyMCE Updates</strong> <em><a href="https://docs.servicenow.com/bundle/paris-platform-administration/page/administer/workspace/concept/tinymce.html#set-dictionary-attributes-workspace">Default toolbar</a>. <a href="https://docs.servicenow.com/bundle/paris-platform-administration/page/administer/workspace/concept/tinymce.html#change-tinymce-toolbar-specific-table">Table specific attributes</a>. <a href="https://docs.servicenow.com/bundle/paris-platform-administration/page/administer/workspace/concept/tinymce.html#set-attributes-tinymce-dictionary">TinyMCE plugins for specific table</a>.</em><br />
<strong>Lists</strong> <em>Live badges with refresh icon. Column resizing.</em></p>
<h2><a href="https://jace.pro/post/2020-07-28-technow-ep77-paris-features/#question-and-answers">Question and Answers</a></h2>
<ul>
<li>Any recommendations for when to upgrade as a new customer? Right now, you don't have any data.</li>
<li>Flow designer rollback - up vote the idea it's coming</li>
<li>Lots of questions about IDR and e-bonding</li>
<li>Q's will be answered later on the <a href="https://community.servicenow.com/community?id=community_blog&sys_id=130bff98db7dd090feb1a851ca9619cd">community post for Technow ep77</a>.</li>
</ul>
<h2><a href="https://jace.pro/post/2020-07-28-technow-ep77-paris-features/#slides">Slides</a></h2>
<p><a href="https://jace.pro/post/2020-07-28-technow-ep77-paris-features/technowep77parisplatformfeatures202007151595891712984.pdf">Link to the deck</a></p>
<!--EndFragment-->Paris feature - Requested For variable2020-07-27T06:08:08Zhttps://jace.pro/post/2020-07-27-paris-requested-for/Jace Benson<!--StartFragment-->
<p>Does this sound familiar?</p>
<p>Customer: "I need a request form."<br />
Me: "Yea, what it's for?"<br />
Customer: "Access to MyAmazingApp"<br />
Me: "Okay. No problem. It'll have a field to say give access to this user, sound good?"<br />
Customer: "UGH, do I have to click 'Add to cart' for each user then?!"<br />
Me: "Sorry."</p>
<p>There's a fix for that. ServiceNow calls it a feature. I call it long over due. Requested For variable is the name of it.</p>
<p>I was reading <a href="https://news.jace.pro/?text=paris">/news for Paris</a>. This caught my attention. <a href="https://www.linkedin.com/in/jennytthu/">Jenny Hu</a>'s "<a href="https://community.servicenow.com/community?id=community_article&sys_id=52c3e490db569090d5c4d9d968961951">A Day in Paris Series: Exploring Delegated Request Experience</a>".</p>
<p>I started my work on ServiceNow in Service Catalog. This is actually one of the first problems I had to address. In this post I'm going to focus on how this works.</p>
<h2><a href="https://jace.pro/post/2020-07-27-paris-requested-for/#steps-to-set-up-requested-for-variable">Steps to set up "Requested For" variable</a></h2>
<ol>
<li>
<p>Add a "Requested For" variable to the catalog item.</p>
<ul>
<li>Decide who you want to be able to pick these values (they have a field for that control)</li>
<li>Set up the reference qualifier</li>
</ul>
</li>
<li>
<p>That's it.</p>
</li>
</ol>
<h2><a href="https://jace.pro/post/2020-07-27-paris-requested-for/#limitations">Limitations</a></h2>
<p>It does come with a few limitations.</p>
<ul>
<li>Selecting many users only appears to work in Service Portal</li>
<li>It is not available for record producers. (They added <code>requested_for</code> on <code>sc_req_item</code>. Generally, target table will not have that.)</li>
<li>It is not available for order guides. (features for these generally take an extra release. If you want this submit an idea.)</li>
<li>It is not available for Now Mobile.</li>
<li>It is not available for Workspaces. (This surprises me. I'd thought ServiceNow would only be making net new features with Workspace support.)</li>
</ul>
<h2><a href="https://jace.pro/post/2020-07-27-paris-requested-for/#thoughts">Thoughts</a></h2>
<p>This is amazing and here's why. This feature reduces complexites added by;</p>
<ul>
<li>List Collectors</li>
<li>Multi-Row Variable Sets (MRVS)</li>
<li>2-step checkout.</li>
</ul>
<p>How does this reduce that need?</p>
<ol>
<li>"Add to cart" is no longer needed as you can make the request and ServiceNow makes an item per "Requested For". That means workflow and flows are properly followed per person.</li>
<li><a href="https://jace.pro/post/2019-11-30-list-collectors-are-the-pits/">List collectors have their own problems</a>. Generally they decide who gets access. This removes that.</li>
<li>Multi Row Variable Sets also have problem (less than List collectors). Like List Collectors a lot of the time they decide the who. This removes that need.</li>
</ol>
<!--EndFragment-->TechNow Ep76 Review of Flow Designer2020-06-26T06:07:31Zhttps://jace.pro/post/2020-06-26-technow-ep76-review-of-flow-designer/Jace Benson<!--StartFragment-->
<p>Slabodnick is amazing. A long long time ago I had the opportunity to work with him. We did some great stuff there. I'm always happy to catch a session where he's excited about what he's working on. It seems that this is flow designer. I still don't use flow designer much. I should use it more.</p>
<p>Hopefully this is my turning point. This post isn't about me and how I will start using Flow Designer. It's about this video. They go over 5 powerful features in ServiceNow's Flow Designer system.</p>
<p>Here's the link to <a href="https://www.youtube.com/watch?v=4rewkjVa8PU">TechNow Ep 76</a>. I breakdown what is gone over below.</p>
<h2><a href="https://jace.pro/post/2020-06-26-technow-ep76-review-of-flow-designer/#decision-tables">Decision Tables</a></h2>
<p>When I first read about these I was really hoping they could solve a complicated problem I have and I think many share with me. How to handle the churn of groups in ServiceNow. Turns out they can probably do this but just not well with workflow. In this video Slabodnick highlights what needs to be set up and how to use them.</p>
<p>Here's a link to the <a href="https://youtu.be/4rewkjVa8PU?t=1178">decision tables</a> spot in the video.</p>
<h2><a href="https://jace.pro/post/2020-06-26-technow-ep76-review-of-flow-designer/#transform-data">Transform Data</a></h2>
<p>I didn't know there even was this feature. You can simply transform the data without writing any code. I don't have much else to say.</p>
<p>Again, link to the <a href="https://youtu.be/4rewkjVa8PU?t=1555">transform data</a> spot in the video.</p>
<h2><a href="https://jace.pro/post/2020-06-26-technow-ep76-review-of-flow-designer/#dynamic-inputs">Dynamic Inputs</a></h2>
<p>This is a really interesting feature. I'd like to know what have you used for dynamic inputs in flow designer that saved you amazing amount of work. Seriously. Comment below or send me a message on Twitter @jacebenson.</p>
<p>Link to the <a href="https://youtu.be/4rewkjVa8PU?t=1953">dynamic inputs</a> section of the video.</p>
<h2><a href="https://jace.pro/post/2020-06-26-technow-ep76-review-of-flow-designer/#power-of-sql">Power of SQL</a></h2>
<p>Doing SQL stuff without writing powershell or another local language for the midserver? Really?! Cool.</p>
<p>Check it out here: <a href="https://youtu.be/4rewkjVa8PU?t=2316">Power of SQL</a></p>
<h2><a href="https://jace.pro/post/2020-06-26-technow-ep76-review-of-flow-designer/#dynamic-subflows">Dynamic Subflows</a></h2>
<p><a href="https://youtu.be/4rewkjVa8PU?t=2572">Dynamic Subflows</a> - You just have to see them.</p>
<h2><a href="https://jace.pro/post/2020-06-26-technow-ep76-review-of-flow-designer/#q-a-had-some-great-questions">Q & A had some great questions</a></h2>
<ul>
<li><a href="https://youtu.be/4rewkjVa8PU?t=3093">We want a convert flow to subflow button</a></li>
<li><a href="https://youtu.be/4rewkjVa8PU?t=3162">Lookup Record and Lookup Records Question</a> - Flow designer stops if it fails to find Lookup Record</li>
<li><a href="https://youtu.be/4rewkjVa8PU?t=3264">Is there anyway to create a variable and update it in subsequent steps</a> - It's "in the pipeline" #fansOfScratchpad</li>
<li>On July 28th Paris Platform Features Technow Ep79. Don't miss it. If you miss it you wont see it until Sept for it on demand</li>
</ul>
<!--EndFragment-->Form Layout vs Form Designer2020-06-16T06:06:52Zhttps://jace.pro/post/2020-06-16-form-layout-vs-form-designer/Jace Benson<!--StartFragment-->
<table>
<thead>
<tr>
<th>Feature</th>
<th>Form Designer</th>
<th>Form Layout</th>
</tr>
</thead>
<tbody>
<tr>
<td>Creating Fields</td>
<td>✅</td>
<td>✅</td>
</tr>
<tr>
<td>Creating Sections</td>
<td>✅</td>
<td>✅</td>
</tr>
<tr>
<td>Creating Views</td>
<td>✅</td>
<td>✅</td>
</tr>
<tr>
<td>Removing Views</td>
<td>❌</td>
<td>❌</td>
</tr>
<tr>
<td>Adding Related Fields</td>
<td>❌</td>
<td>✅</td>
</tr>
<tr>
<td>Removing Fields</td>
<td>✅</td>
<td>✅</td>
</tr>
<tr>
<td>Removing Sections</td>
<td>✅</td>
<td>❌</td>
</tr>
<tr>
<td>Adding Annotations</td>
<td>✅</td>
<td>✅</td>
</tr>
<tr>
<td>Adding Scripted Annotations</td>
<td>❌</td>
<td>✅</td>
</tr>
<tr>
<td>Removing Annotations</td>
<td>✅</td>
<td>✅</td>
</tr>
<tr>
<td>Adding Embedded Lists</td>
<td>❌</td>
<td>✅</td>
</tr>
<tr>
<td>Removing Embedded Lists</td>
<td>❌</td>
<td>✅</td>
</tr>
<tr>
<td>Adding Related Lists</td>
<td>❌</td>
<td>❌</td>
</tr>
<tr>
<td>Removing Related lists</td>
<td>❌</td>
<td>❌</td>
</tr>
</tbody>
</table>
<!--EndFragment-->How to remove options from a select box2020-06-15T06:06:02Zhttps://jace.pro/post/2020-06-15-removing-options-from-choicelists-on-catalog/Jace Benson<!--StartFragment-->
<p>In the past people have asked How do I <a href="https://community.servicenow.com/community?id=community_question&sys_id=1f5fb2a9db58dbc01dcaf3231f96199a">Remove an option from select box variable in the catalog item form</a>? And you'd think it would be something as simple as a <code>active</code> flag. However if you look there is no <code>active</code> flag on select box options. That is truly unfortunate.</p>
<p>If you delete it, the values will still hold their <code>value</code> but if there was a display for the value it won't show that.</p>
<h2><a href="https://jace.pro/post/2020-06-15-removing-options-from-choicelists-on-catalog/#how-do-i-go-forward">How do I go forward?</a></h2>
<p>There's really only one way I know of. Client script and remove the option until you can safely delete it.</p>
<p>The client script would be really small</p>
<pre class="language-javascript"><code class="language-javascript"><span class="token keyword">function</span> <span class="token function">onLoad</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> g_form<span class="token punctuation">.</span><span class="token function">removeOption</span><span class="token punctuation">(</span><span class="token string">'duration'</span><span class="token punctuation">,</span><span class="token string">'twelve_months'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span></code></pre>
<p>Another way... that is really overkill but I think handles it the best, is to disable the item and make a new version of the item.</p>
<ul>
<li>Deactivate the item</li>
<li>Make a Copy - this ensures all past requests work as they were intended. It's a big change for a little bit of work I have seen this.</li>
<li>Delete the option on the new version of the item</li>
</ul>
<h2><a href="https://jace.pro/post/2020-06-15-removing-options-from-choicelists-on-catalog/#related-things">Related things</a></h2>
<ul>
<li>Related Question: <a href="https://community.servicenow.com/community?id=community_question&sys_id=1f5fb2a9db58dbc01dcaf3231f96199a">https://community.servicenow.com/community?id=community_question&sys_id=1f5fb2a9db58dbc01dcaf3231f96199a</a></li>
<li>Related Post: <a href="https://www.servicenowguru.com/scripting/client-scripts-scripting/removing-disabling-choice-list-options">https://www.servicenowguru.com/scripting/client-scripts-scripting/removing-disabling-choice-list-options</a></li>
</ul>
<!--EndFragment-->Own Your Content2020-06-15T06:05:22Zhttps://jace.pro/post/2020-06-15-own-your-content/Jace Benson<!--StartFragment-->
<p>Have you ever had a something you made and loved? Then did you ever look for it later and find it gone?</p>
<p>I have. It's a terrible, terrible feeling. For me it was my Geocities site. Thinking back on it now, it was my ten year old me writing my thoughts and feelings. But it was mine.</p>
<p>I know their was a project to save geocities content somehow, but for me, that site is long gone.</p>
<p>There's other things like this. A lot of my early work on ServiceNow also is gone. Not because the code is gone. I assume those solutions are still on those instances.<br />
But, my access to those are gone, my reasons for those solutions are gone. If I've learned anything about other peoples platforms, it's that you can't trust they will be there forever.</p>
<p>If you want that level of security, you need to <strong>always own your platform</strong>.</p>
<h2><a href="https://jace.pro/post/2020-06-15-own-your-content/#why-should-you-own-your-own-content">Why should you own your own content</a></h2>
<p>Simple. When it's yours, you have ultimate control of it's distribution.<br />
If you post it on Facebook, you are conceding to the fact that users have to also be on Facebook.<br />
If you post it on ServiceNow's community, you're giving up things like;</p>
<ul>
<li><a href="https://yoast.com/what-is-a-canonical-url/">canonical URL</a></li>
<li><a href="https://css-tricks.com/essential-meta-tags-social-media/">social media image control</a></li>
<li>the ability to see traffic via <a href="https://accounts.google.com/ServiceLogin?service=analytics">Google Analytics</a>, <a href="https://plausible.io/">Plausible</a>, or <a href="https://clicky.com/">Clicky</a></li>
</ul>
<p>Don't get me wrong. ServiceNow isn't going away anytime soon. Since I've worked with them their community has had at least three versions. With each one, some things were never saved when they moved.</p>
<p>If you blog about whatever, you should host it yourself.</p>
<p>The easiest way to do that is with the <a href="https://jamstack.org/">JAMStack</a>.</p>
<h2><a href="https://jace.pro/post/2020-06-15-own-your-content/#how-do-i-get-started">How do I get started</a></h2>
<p>Ok Jace, I'm in, how do I get started?</p>
<ul>
<li>Short answer: <a href="https://app.netlify.com/start/deploy?repository=https://github.com/philhawksworth/eleventyone">click this</a> link to deploy a site to Netlify for free.</li>
</ul>
<p>Longer answer;</p>
<p>So there is some set up, however if you've been doing any scoped app development, it's literally a click away. No joke. I'm a big fan of <a href="https://www.netlify.com/">Netlify</a>. They have a site with templates and everything to get started. This site, as it is now uses <a href="https://gohugo.io/">Hugo</a>. I'm working on moving to <a href="https://www.11ty.dev/">11ty</a>. If you're getting started, I'd go to Phil Hawksorth's github repository for <a href="https://github.com/philhawksworth/eleventyone">eventyone</a>, and click<img src="https://jace.pro/post/2020-06-15-own-your-content/deployToNetlify.png" alt="" /></p>
<h3><a href="https://jace.pro/post/2020-06-15-own-your-content/#jace-i-dont-like-javascript">Jace, I don't like Javascript!</a></h3>
<p>Okay, okay there's tons of generators.</p>
<ul>
<li><a href="https://gohugo.io/">Hugo</a> uses Go.</li>
<li><a href="https://www.gatsbyjs.org/">Gatsby</a> uses React.</li>
<li><a href="https://www.11ty.dev/">11ty</a> uses javascript.</li>
</ul>
<p>Each one has it's pros and cons. I've used all of these. Effectively they are the same.</p>
<h2><a href="https://jace.pro/post/2020-06-15-own-your-content/#what-else-can-i-do-with-one-of-these-sites">What else can I do with one of these sites</a></h2>
<p>Lots of things. You know that <a href="https://news.jace.pro/">news.jace.pro</a> site I have. Yep, that is actually built daily using this stuff. The code feels ugly but it works. I plan to move it around a bit, but that's a more complicated thing you can do. Phil Hawksworth has a site showing the same kinda of stuff called <a href="https://vlolly.net/">vlolly.net</a> working the same kind of stuff.</p>
<h2><a href="https://jace.pro/post/2020-06-15-own-your-content/#this-post-was-inspired-by-sean-blanda">This post was inspired by Sean Blanda</a></h2>
<p>Thank you Sean Blanda for <a href="https://www.alwaysownyourplatform.com/">www.alwaysownyourplatform.com</a></p>
<!--EndFragment-->K20 Weekly Review for the week ending on June 5th2020-06-05T06:04:43Zhttps://jace.pro/post/2020-06-05-k20-weekly-review/Jace Benson<!--StartFragment-->
<ul>
<li>
<p><a href="https://www.youtube.com/watch?v=pPszUiwLec4&feature=youtu.be">Success Meetup: Community MVP Paul Morris - Automated testing and the role of community as a guide</a></p>
<ul>
<li>@0:00 - 21:00 History</li>
<li>@22:40 demo of submitting an item -</li>
<li>@23:00 make atf test</li>
<li>@30:00 test atf test</li>
<li>@34:00 demo of atf recorder</li>
<li>Wow... in one minute it generated 27 steps and the steps you expected</li>
<li></li>
</ul>
</li>
<li>
<h2><a href="https://jace.pro/post/2020-06-05-k20-weekly-review/#theater-podcast-flow-designer-and-why-use-it-ths5022"></a><a href="https://static.rainfocus.com/servicenow/knowledge2020/sess/1590108630120001Ogae/relatedfiles/THS5022-%20Flow%20Designer%20and%20why%20use%20it_1590783422933001ahnF.mp3">Theater Podcast: Flow Designer and why use it? (THS5022)</a></h2>
</li>
<li>
<p><a href="https://static.rainfocus.com/servicenow/knowledge2020/sess/1590108811240001xQ1A/relatedfiles/THS5023%20What%27s%20New%20In%20Orlando_1590783523961001aQ68.mp3">Theater Podcast: What's new in Orlando (THS5023)</a></p>
</li>
</ul>
<!--EndFragment-->Always Negotiate2020-06-02T06:03:58Zhttps://jace.pro/post/2020-06-02-always-negotiate/Jace Benson<!--StartFragment-->
<p><a href="https://www.kalzumeus.com/2012/01/23/salary-negotiation/">Patrick McKenzie wrote a blog about this.</a> His post inspires this one. I am writing this down so those who follow me may see it.</p>
<p>For me this has always been "get my mind in the interviewing mindset" piece.</p>
<p>I'll start this with a quote from another older post of mine;</p>
<blockquote>
<p>So interviewing is exciting.<br />
It's a way to get uncomfortable and see what is available in job-land.<br />
Something to keep in mind, interviews are a way for you and your employer to find a great fit for this position.</p>
</blockquote>
<p>I enjoy interviewing, and some don't but this will help you navigate this time better.</p>
<p>If you read nothing else read this;</p>
<ul>
<li>Salary negotiations started as soon as you applied.</li>
<li>Salary isn't the only thing being negotiated.</li>
<li>If you don't ask, the answer is always no.</li>
<li>Never give the number first, if pressed, deflect, if you can't give a range.</li>
<li>Take notes when researching and interviewing.</li>
<li>Use your significant other or family to buy time and think about the offer.</li>
</ul>
<h1><a href="https://jace.pro/post/2020-06-02-always-negotiate/#when-does-the-salary-negotiation-start">When does the salary negotiation start?</a></h1>
<p>Salary negotiations <strong>start the moment you apply for a job</strong>. So don't submit a number on any form when you apply. That gives them a heads up where to start.</p>
<p>You might be thinking, "Jace, they need a number on the form. What do I put in there?" Yea, they generally have that. Put $1. They know that can't be right.<br />
This will start the dialog. That dialog is critical.</p>
<p>You should know about what your average pay range is. Be aware of the range of pay for your skills demand.</p>
<p>At this point you might also be wondering what can you expect that conversation to go like. For me I've always been able to use the line from Patrick's article, and I'm paraphrasing;</p>
<blockquote>
<p>I'm more concerned at the moment with talking to you about discovering whether we're a mutual fit.<br />
If we're a great fit, then I can be flexible on the numbers with you and you can be flexible on the numbers with me.</p>
</blockquote>
<h1><a href="https://jace.pro/post/2020-06-02-always-negotiate/#why-negotiating-matters">Why negotiating matters</a></h1>
<p>My first job into tech was help desk.<br />
They paid me a few dollars more an hour than I made as hospital clergy.<br />
Then I got a jump on to actual tech work. I didn't know then what I know now.<br />
I would tell myself, "Jace, you could ask for more.<br />
You might not want to, but if you don't you wont know unless you get another job after."</p>
<p>If you don't ask the answer is always no.<br />
That's something I've come to learn over time.<br />
This is true with negotiating.<br />
If the salary isn't up to your needs and you still want to spend more time checking out the offer.<br />
Take a few hours, or a few days and think about other benefits that are negotiable. Some ideas might be;</p>
<ul>
<li>Paid time off - Recurring expense</li>
<li>Signing Bonus - One time expense</li>
<li>Relocation Stipend - One time expense they can limit</li>
<li>Equity/Stock options - A future expense that could be reduced over time</li>
<li>Flexible work schedule - Costs nearly nothing</li>
</ul>
<p>I mean I never had any of success asking for these things but, you can't get those things if you don't ask.<br />
If you're walking away anyways, then ask.</p>
<h2><a href="https://jace.pro/post/2020-06-02-always-negotiate/#interesting-is-a-wonderful-word">"Interesting" is a wonderful word</a></h2>
<p>It's positive and non-commital. They give you a number you can tell them it's interesting without giving the wrong impression.</p>
<h2><a href="https://jace.pro/post/2020-06-02-always-negotiate/#using-a-significant-other-and-family-can-help-buy-time">Using a significant other and family can help buy time</a></h2>
<p>Saying things like "This sounds great. Let me talk it over with the wife/husband." will buy you time. Time to consider and after a call I'm generally<br />
excited willing to agree to most things.</p>
<h1><a href="https://jace.pro/post/2020-06-02-always-negotiate/#the-first-rule-is-what-everyone-has-told-you-never-give-a-number-first">The first rule is what everyone has told you: Never give a number first</a></h1>
<p>This is true. When forced deflect. If you can't deflect, give a range. I don't think I have much more to add here.</p>
<h1><a href="https://jace.pro/post/2020-06-02-always-negotiate/#listen-to-what-people-tell-you-repeat-it-back-to-them">Listen to what people tell you. Repeat it back to them.</a></h1>
<p>When you see the job posting there are key phrases they use. You should note and use them with the company. See if any of those phrases jive with things you did in the past or are remotely like it, own it.</p>
<h2><a href="https://jace.pro/post/2020-06-02-always-negotiate/#bring-a-notebook">Bring a notebook</a></h2>
<p>Nothing stops you from bringing in a notebook to take notes while interviewing. Taking notes is important. I know my memory is my worst enemy. This is literally why I write this stuff down to better remember. Point is, write down the things they say that stand out. Those notes are great things to follow up on, and think about.</p>
<h1><a href="https://jace.pro/post/2020-06-02-always-negotiate/#research-the-company">Research the company</a></h1>
<p>Look up the company, try to figure out how their lines of business. This helps frame what will be important to the business. I like to try to find who my co-workers might be ahead of time. Some sites offer past questions asked for the employer. I've never had success with those but it gives you an idea of what might be asked.</p>
<h1><a href="https://jace.pro/post/2020-06-02-always-negotiate/#thoughts-and-sources">Thoughts and sources</a></h1>
<p>I just found the author at some point updated his post with a link to this great book(<a href="https://amzn.to/302Czwx">Fearless Salary Negotiation</a>) and <a href="https://fearlesssalarynegotiation.com/salary-negotiation-guide/">resource</a>.</p>
<p>If you've found this helpful, let me know.</p>
<!--EndFragment-->K20 Session Review2020-05-29T06:03:24Zhttps://jace.pro/post/2020-05-29-k20-session-review/Jace Benson<!--StartFragment-->
<p>This is "Connect Week". Here's what I watched and my very rough notes.</p>
<ul>
<li>
<p><a href="https://players.brightcove.net/5703385908001/zKNjJ2k2DM_default/index.html?videoId=ref:K20-CCB3052">GlideQuery: A modern upgrade to GlideRecord</a></p>
</li>
<li>
<p><a href="http://players.brightcove.net/5703385908001/zKNjJ2k2DM_default/index.html?videoId=ref:K20-CCW2583">Lab/Workshop Advanced Scoped Development Techniques (CCW2583)</a></p>
<ul>
<li><a href="https://nowlearning.service-now.com/lxp?id=overview&sys_id=f89a140b1b74d4901759b8c11a4bcbd4&type=course">Lab</a></li>
<li>Guided Application Creator</li>
<li>Code Search</li>
<li>Source Control</li>
<li>Adding files to the studio project</li>
<li>Deployment Best Practices</li>
</ul>
</li>
<li>
<p><a href="http://players.brightcove.net/5703385908001/zKNjJ2k2DM_default/index.html?videoId=ref:K20-KEY4943">KEY4943</a></p>
<ul>
<li>
<p>Encourage networking</p>
</li>
<li>
<p>K20's whole event's objective is "focused on helping customers to achieve their business objects through digital transformation" - David Schneider</p>
<ul>
<li>What does that really mean?</li>
<li>I mean, does that mean showing customers how others have gotten there?</li>
<li>Or does that include ...</li>
</ul>
</li>
<li>
<p>85-90% of the content is given by customers</p>
</li>
<li>
<p>Themes for customers needs.</p>
<ul>
<li>
<p>Customers need to be able to help themselves via on-demand resources</p>
<ul>
<li>Customer Success Center is a curated list of the best content based on usage and customer's telling us.</li>
</ul>
</li>
<li>
<p>Customers want community-based success experiences</p>
<ul>
<li>ServiceNow User Groups (Globally available)</li>
<li>Knowledge</li>
<li>Now Community ... stats okay, its a big and busy community.</li>
<li>Success webinars</li>
<li>Success consultations</li>
<li>Genius Lounges</li>
<li>Meetups (this developer meetups?)</li>
</ul>
</li>
<li>
<p>Wants access to access to ServiceNow experts, blueprints for success that will help them</p>
<ul>
<li>
<p>Sept 2019 NowLearning was released. Over 600k courses completed.</p>
<ul>
<li>Catalog of NowLearning content is just getting added too, so the catalog is only going to get bigger and bigger as time continues.</li>
</ul>
</li>
<li>
<p>Other Sites to help</p>
<ul>
<li>Developer portal</li>
<li>Product docs</li>
<li>Now support portal</li>
<li>Now support mobile app</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>
<p>Calls to action</p>
<ul>
<li>Visit the Customer Success Center</li>
<li>Get involved of "Success experiences"</li>
<li>learn about success services</li>
</ul>
</li>
<li>
<p>Jace's take. Community is big, you can get a lot from local events like the ServiceNow User Groups, and meetups. You can encourage people to use NowLearning to up their skills. However, ultimately, they recommended to buy success services from ServiceNow.</p>
</li>
</ul>
</li>
<li>
<p><a href="http://players.brightcove.net/5703385908001/zKNjJ2k2DM_default/index.html?videoId=ref:K20-DEM1202">Knowledge Management</a></p>
<ul>
<li>Provide consistent resolutions for self-service</li>
<li>Encourage employees to create knowledge from their work</li>
<li>Identify gaps, curate new content, track usage, gov', and quality trends</li>
<li>This Shows how it can be used from desktop/mobile/chat apps</li>
</ul>
</li>
<li>
<p><a href="http://players.brightcove.net/5703385908001/zKNjJ2k2DM_default/index.html?videoId=ref:K20-BRE2961">Augmented Reality for Field Service Management via CareAR</a></p>
<ul>
<li>
<p>Primary user servicing expectations</p>
<ul>
<li>Fast</li>
<li>Personalized</li>
<li>Consistent</li>
</ul>
</li>
<li>
<p>So this is all about making video/collaborate, not using 3rd party consumer apps, aka FaceTime, Facebook messaging etc. It is pretty cool @ 18:20 you can see a demo of it.</p>
</li>
</ul>
</li>
<li>
<p><a href="http://players.brightcove.net/5703385908001/zKNjJ2k2DM_default/index.html?videoId=ref:K20-CCW2554">Lab/Workshop Story Testing Scripts - Scoped Application (CCW2554)</a></p>
<ul>
<li>
<p>This appears to be a lab to create a scoped app to build test scripts... Not sure how this is different than Test Management</p>
</li>
<li>
<p>Best Practices for this* (@55:16)</p>
<ul>
<li>Define involved users and roles of the story</li>
<li>Create a Test Script</li>
<li>Create Scenario for the Story</li>
</ul>
</li>
</ul>
</li>
<li>
<p><a href="http://players.brightcove.net/5703385908001/zKNjJ2k2DM_default/index.html?videoId=ref:K20-CCW1735">Lab/Workshop Working with Remote Tables (CCW1735)</a></p>
</li>
<li>
<p><a href="http://players.brightcove.net/5703385908001/zKNjJ2k2DM_default/index.html?videoId=ref:K20-THS3220">Theater Generating Ideas Fast with Crazy 8’s (THS3220)</a></p>
<ul>
<li>
<p>What are Crazy 8s</p>
<ul>
<li>Crazy 8's is a brainstorming exercise that challenges people to sketch 8 distinct ideas in 8 minutes. The goal is to push beyond your first idea, and generate a wide variety of solutions to any challenge.</li>
</ul>
</li>
<li>
<p>When you use these? Early on in the ideation process. Or anytime you are stuck on a problem.</p>
<ul>
<li>At ServiceNow they typically do it here;<img src="https://jace.pro/post/2020-05-29-k20-session-review/crazy8s.png" alt="" /></li>
</ul>
</li>
<li>
<p>Conducting Crazy 8's</p>
<ul>
<li>
<p>Pre session</p>
<ul>
<li>Gather Stakeholders. Anyone invested in the project. Crazy 8's session can dbe done alone, it's best with 3-4 people.</li>
<li>Review previous activities. A good way to get the team aligned is to review some of the projects past activities.</li>
<li>Understand the problem. Have key stakeholders deliver the problem.</li>
<li>Warm up. Allow the team to do some research and walk through existing solutions to similar problems.</li>
<li>Use Prompters. Share a few prompter ideas for people who have a hard time thinking through 8 variations.</li>
<li>Collate materials. Sheet of paper for each stake holder, pens, and a way to track time. Digitally, Video conf. with google slides.</li>
</ul>
</li>
<li>
<p>During the session</p>
<ul>
<li>Fold paper into 8 segments (first in 4 parts, then in half.)</li>
<li>Set the timer 60 seconds per segment (8 minutes total)</li>
<li>Participants sketch on the first segment until the timer dings. Then they move the next until all 8 segments have been filled.</li>
<li>Have participants Explain ideas individually.</li>
<li>Give participants a set number of votes on for things they like e.g. green dots.</li>
<li>Give participants a set number of votes on for things they dislike e.g. red dots.</li>
<li>As a team discuss where the ideas coalesced</li>
</ul>
</li>
<li>
<p>Post session</p>
<ul>
<li>Story board the workflows</li>
<li>Add more details to the better ideas</li>
<li>Build out prototypes</li>
<li>Consider a second crazy 8's session with a different group</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>
<p><a href="http://players.brightcove.net/5703385908001/zKNjJ2k2DM_default/index.html?videoId=ref:K20-BRE1066">Creating products on the Now Platform® to drive company growth</a></p>
</li>
</ul>
<p>Non SN stuff;</p>
<p><a href="https://www.youtube.com/watch?v=snAhsXyO3Ck">Lockdown Productivity: Spaceship You</a></p>
<!--EndFragment-->Glide Freaking Query Wow2020-05-24T06:00:15Zhttps://jace.pro/post/2020-05-24-glide-freaking-query-wow/Jace Benson<!--StartFragment-->
<p>A month ago I <a href="https://jace.pro/post/2020-04-28-what-is-glidequery">wrote about GlideQuery</a>, asking "... is GlideRecord going away? No. I don't think so. "</p>
<p>Well, I need to revise my thoughts on this. Before I go into why, lets first link to the sources and you can watch the 20+ minute video of the genius (Peter Bell) behind GlideQuery.</p>
<p>Link to that is here: <a href="https://events.servicenow.com/widget/servicenow/knowledge2020/myagenda/session/1581555110988001mNP1?sessionId=1581555110988001mNP1">GlideQuery: A modern upgrade to GlideRecord</a></p>
<p>Okay. Now that is out of the way lets talk about some of the major points here so if we lose the video we still have this <em>somewhere</em> since as of right now this is <a href="https://docs.servicenow.com/search?q=GlideQuery">not</a> <a href="https://developer.servicenow.com/dev.do#!/search/orlando/All/GlideQuery">documented</a> <strong>anywhere</strong>.</p>
<h1><a href="https://jace.pro/post/2020-05-24-glide-freaking-query-wow/#what-does-glidequery-do-that-gliderecord-fails">What does GlideQuery do that GlideRecord fails?</a></h1>
<p>GlideQuery is a <strong>server-side</strong> api for querying, updating, and deleting data. It's in Orlando, and Paris. Behind the scenes it uses GlideRecord but with smart defaults that often will cause generally problems.</p>
<p>This api follows three guiding principals;</p>
<ul>
<li>Fail Fast</li>
<li>Be JavaScript</li>
<li>Expressive</li>
</ul>
<p>Here's some considerations;</p>
<ul>
<li>Performance</li>
</ul>
<h2><a href="https://jace.pro/post/2020-05-24-glide-freaking-query-wow/#failing-fast">Failing Fast</a></h2>
<p>Improving the feedback loop</p>
<h3><a href="https://jace.pro/post/2020-05-24-glide-freaking-query-wow/#field-checking">Field Checking</a></h3>
<p>Here's a GlideRecord script with a problem<br />
By default if a field name is wrong in GlideRecord, it queries <strong>everything</strong>.</p>
<p>In GlideQuery, this will fail and not execute on error.</p>
<!--EndFragment-->
<!--StartFragment-->
<table>
<thead>
<tr>
<th>GlideRecord Example</th>
<th>GlideQuery Example</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://jace.pro/static/img/fieldcheckinggr.png"><img src="https://jace.pro/static/img/fieldcheckinggr.png" alt="" /></a></td>
<td><a href="https://jace.pro/static/img/fieldcheckinggq.png"><img src="https://jace.pro/static/img/fieldcheckinggq.png" alt="" /></a></td>
</tr>
</tbody>
</table>
<h3><a href="https://jace.pro/post/2020-05-24-glide-freaking-query-wow/#choice-checking">Choice checking</a></h3>
<p>Here's another example where unless you check your code you may miss it. This is because it returns no results.</p>
<p>If the api said, hey that value is not valid, that could help you faster.</p>
<table>
<thead>
<tr>
<th>GlideRecord Example</th>
<th>GlideQuery Example</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://jace.pro/static/img/choicecheckinggr.png"><img src="https://jace.pro/static/img/choicecheckinggr.png" alt="" /></a></td>
<td><a href="https://jace.pro/static/img/choicecheckinggq.png"><img src="https://jace.pro/static/img/choicecheckinggq.png" alt="" /></a></td>
</tr>
</tbody>
</table>
<h3><a href="https://jace.pro/post/2020-05-24-glide-freaking-query-wow/#type-checking">Type checking</a></h3>
<p>Travis Toulson wrote a whole post about <a href="https://codecreative.io/blog/is-gliderecord-getvalue-the-king-of-the-string/">Is GlideRecord GetValue the king of the string</a>... It's great but this <strong>SOLVES</strong> that whole issue.</p>
<table>
<thead>
<tr>
<th>GlideRecord Example</th>
<th>GlideQuery Example</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://jace.pro/static/img/typecheckinggr.png"><img src="https://jace.pro/static/img/typecheckinggr.png" alt="" /></a></td>
<td><a href="https://jace.pro/static/img/typecheckinggq.png"><img src="https://jace.pro/static/img/typecheckinggq.png" alt="" /></a></td>
</tr>
<tr>
<td><a href="https://jace.pro/static/img/typecheckinggrupdate.png"><img src="https://jace.pro/static/img/typecheckinggrupdate.png" alt="" /></a></td>
<td><a href="https://jace.pro/static/img/typecheckinggqupdate.png"><img src="https://jace.pro/static/img/typecheckinggqupdate.png" alt="" /></a></td>
</tr>
</tbody>
</table>
<h2><a href="https://jace.pro/post/2020-05-24-glide-freaking-query-wow/#be-javascript">Be JavaScript</a></h2>
<p>Isolation from Java</p>
<h3><a href="https://jace.pro/post/2020-05-24-glide-freaking-query-wow/#glidequery-should-behave-you-expect-a-regular-javascript-should-behave">GlideQuery should behave you expect a regular JavaScript should behave.</a></h3>
<p>Type assumptions in are a real headache in ServiceNow with GlideRecord. It seems you get back a string type when you should get a number type.</p>
<table>
<thead>
<tr>
<th>GlideRecord Example</th>
<th>GlideQuery Example</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://jace.pro/static/img/bejavascriptstringlytyped.png"><img src="https://jace.pro/static/img/bejavascriptstringlytyped.png" alt="" /></a></td>
<td><a href="https://jace.pro/static/img/bejavascriptstringlytypedgq.png"><img src="https://jace.pro/static/img/bejavascriptstringlytypedgq.png" alt="" /></a></td>
</tr>
<tr>
<td><a href="https://jace.pro/static/img/bejavascriptstringlytyped2.png"><img src="https://jace.pro/static/img/bejavascriptstringlytyped2.png" alt="" /></a></td>
<td></td>
</tr>
<tr>
<td><a href="https://jace.pro/static/img/bejavascriptstringlytyped3.png"><img src="https://jace.pro/static/img/bejavascriptstringlytyped3.png" alt="" /></a></td>
<td></td>
</tr>
</tbody>
</table>
<h3><a href="https://jace.pro/post/2020-05-24-glide-freaking-query-wow/#stacktraces">Stacktraces</a></h3>
<table>
<thead>
<tr>
<th>GlideRecord Example</th>
<th>GlideQuery Example</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://jace.pro/static/img/stacktracegr.png"><img src="https://jace.pro/static/img/stacktracegr.png" alt="" /></a></td>
<td><a href="https://jace.pro/static/img/stacktracegq.png"><img src="https://jace.pro/static/img/stacktracegq.png" alt="" /></a></td>
</tr>
</tbody>
</table>
<h3><a href="https://jace.pro/post/2020-05-24-glide-freaking-query-wow/#complex-queries-should-work-how-you-expect">Complex Queries should work how you expect</a></h3>
<p>Queries that use both "AND" and "OR" logic. How is this evaluated?</p>
<table>
<thead>
<tr>
<th>GlideRecord Example</th>
<th>GlideQuery Example</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://jace.pro/static/img/complexqueriesgr.png"><img src="https://jace.pro/static/img/complexqueriesgr.png" alt="" /></a></td>
<td><a href="https://jace.pro/static/img/complexqueriesgq.png"><img src="https://jace.pro/static/img/complexqueriesgq.png" alt="" /></a></td>
</tr>
</tbody>
</table>
<p>In SQL "AND" has priority over "OR". In GlideRecord, "OR" has priority over "AND" and this causes problems. In GlideQuery they solve this by being allowing nested GlideQuery methods.</p>
<h2><a href="https://jace.pro/post/2020-05-24-glide-freaking-query-wow/#expressive">Expressive</a></h2>
<p>Do more with less</p>
<h3><a href="https://jace.pro/post/2020-05-24-glide-freaking-query-wow/#returning-a-stream-or-optional">Returning a Stream or Optional</a></h3>
<p>When reading data with GlideQuery there are two classes used; Stream and Optional</p>
<table>
<thead>
<tr>
<th>Stream</th>
<th>Optional</th>
</tr>
</thead>
<tbody>
<tr>
<td>Used for reading records</td>
<td>Used for reading a single record</td>
</tr>
<tr>
<td>Returned by <code>select(1)</code></td>
<td>"Empty" if a record isn't found by a query</td>
</tr>
<tr>
<td>Lazily evaluated</td>
<td>Returned by <code>selectOne()</code>, <code>insert()</code>, and <code>update()</code></td>
</tr>
<tr>
<td>Common Stream methods: - map - flatMap - forEach - reduce - some - any</td>
<td>Common Optional methods: - get [throws if empty] - map - isEmpty - isPresent - ifPresent - orElse</td>
</tr>
</tbody>
</table>
<p>Examples;</p>
<p><a href="https://jace.pro/static/img/maponstream.png"><img src="https://jace.pro/static/img/maponstream.png" alt="" /></a><a href="https://jace.pro/static/img/someonstream.png"><img src="https://jace.pro/static/img/someonstream.png" alt="" /></a><a href="https://jace.pro/static/img/everyonstream.png"><img src="https://jace.pro/static/img/everyonstream.png" alt="" /></a></p>
<h3><a href="https://jace.pro/post/2020-05-24-glide-freaking-query-wow/#aggregation">Aggregation</a></h3>
<p>Examples;</p>
<p><a href="https://jace.pro/static/img/aggregate1.png"><img src="https://jace.pro/static/img/aggregate1.png" alt="" /></a><a href="https://jace.pro/static/img/aggregate2.png"><img src="https://jace.pro/static/img/aggregate2.png" alt="" /></a><a href="https://jace.pro/static/img/aggregate3.png"><img src="https://jace.pro/static/img/aggregate3.png" alt="" /></a></p>
<h3><a href="https://jace.pro/post/2020-05-24-glide-freaking-query-wow/#insert">Insert</a></h3>
<p><a href="https://jace.pro/static/img/insert.png"><img src="https://jace.pro/static/img/insert.png" alt="" /></a></p>
<h3><a href="https://jace.pro/post/2020-05-24-glide-freaking-query-wow/#delete">Delete</a></h3>
<p><a href="https://jace.pro/static/img/delete.png"><img src="https://jace.pro/static/img/delete.png" alt="" /></a></p>
<h3><a href="https://jace.pro/post/2020-05-24-glide-freaking-query-wow/#update">Update</a></h3>
<p><a href="https://jace.pro/static/img/updateone.png"><img src="https://jace.pro/static/img/updateone.png" alt="" /></a><a href="https://jace.pro/static/img/updatemultiple.png"><img src="https://jace.pro/static/img/updatemultiple.png" alt="" /></a></p>
<h3><a href="https://jace.pro/post/2020-05-24-glide-freaking-query-wow/#field-flags">Field Flags</a></h3>
<p>This is important for currency and display values.</p>
<p>Flags mentioned <code>$DISPLAY</code> and <code>$CURRENCY_CODE</code></p>
<p><a href="https://jace.pro/static/img/flagscurrency.png"><img src="https://jace.pro/static/img/flagscurrency.png" alt="" /></a></p>
<h2><a href="https://jace.pro/post/2020-05-24-glide-freaking-query-wow/#performance">Performance</a></h2>
<p>With business rules disabled here's how GlideQuery stacks up to GlideRecord.</p>
<table>
<thead>
<tr>
<th>Method</th>
<th>GlideRecord</th>
<th>GlideQuery</th>
</tr>
</thead>
<tbody>
<tr>
<td>Insert 100 records</td>
<td>829 ms median</td>
<td>850 ms median (+2.5%)</td>
</tr>
<tr>
<td>Reading 1 record</td>
<td>2ms median</td>
<td>3ms median (+1 ms)</td>
</tr>
<tr>
<td>Reading 1,000 record</td>
<td>86.5 ms median</td>
<td>90.5 ms median (+4.62%)</td>
</tr>
<tr>
<td>Reading 10,000 record</td>
<td>842.5 ms median</td>
<td>890 ms median (+5.64%)</td>
</tr>
</tbody>
</table>
<p>It's important to note that GlideQuery avoids common performance mistakes.</p>
<p><a href="https://jace.pro/static/img/commonperfmistakes.png"><img src="https://jace.pro/static/img/commonperfmistakes.png" alt="" /></a></p>
<p><a href="https://jace.pro/static/img/commonperfmistakes2.png"><img src="https://jace.pro/static/img/commonperfmistakes2.png" alt="" /></a></p>
<h2><a href="https://jace.pro/post/2020-05-24-glide-freaking-query-wow/#current-limitations-and-future-work">Current Limitations and Future work</a></h2>
<ul>
<li>Scoped table permission checking</li>
<li>Allow opting out of field/choice checking</li>
<li>Better join support</li>
<li>Field casting</li>
<li>Parsing encoded queries</li>
</ul>
<!--EndFragment-->What are all the shortcuts in ServiceNow?2020-05-22T05:55:52Zhttps://jace.pro/post/2020-05-22-all-the-shortcuts/Jace Benson<!--StartFragment-->
<p>I was watching the #til channel on <a href="https://jace.pro/post/2020-05-22-all-the-shortcuts/sndevs.com">SNDevs</a> slack. The navigation shortcut of <code>table.filter</code> came up. I didn't know about it. It's great. Instead of writing about just that, I include all the shortcuts.</p>
<p>ServiceNow has 3 sets of shortcuts. They have UI15 Keyboard shortcuts. I'm not covering those as no one uses UI15 anymore.</p>
<h1><a href="https://jace.pro/post/2020-05-22-all-the-shortcuts/#keyboard-shortcuts">Keyboard shortcuts</a></h1>
<p>There's only a few that ServieNow observes. Extensions add some too.</p>
<h2><a href="https://jace.pro/post/2020-05-22-all-the-shortcuts/#out-of-box-shortcuts">Out of box shortcuts</a></h2>
<p>A thing to note, <a href="https://docs.servicenow.com/bundle/orlando-platform-user-interface/page/use/navigation/task/configure-keyboard-shortcut-preferences.html">some of these are configurable</a></p>
<table>
<thead>
<tr>
<th>Action</th>
<th>Windows keyboard shortcut</th>
<th>Mac keyboard shortcut</th>
</tr>
</thead>
<tbody>
<tr>
<td>Activate global search field</td>
<td><code>Ctrl</code>+<code>Alt</code>+<code>G</code></td>
<td><code>Ctrl</code>+<code>Opt</code>+<code>G</code></td>
</tr>
<tr>
<td>Toggle application navigator</td>
<td><code>Ctrl</code>+<code>Alt</code>+<code>C</code></td>
<td><code>Ctrl</code>+<code>Opt</code>+<code>C</code></td>
</tr>
<tr>
<td>Activate navigation filter field</td>
<td><code>Ctrl</code>+<code>Alt</code>+<code>F</code></td>
<td><code>Ctrl</code>+<code>Opt</code>+<code>F</code></td>
</tr>
<tr>
<td>Impersonate user</td>
<td><code>Ctrl</code>+<code>Alt</code>+<code>I</code></td>
<td><code>Ctrl</code>+<code>Opt</code>+<code>I</code></td>
</tr>
<tr>
<td>Navigate to the main content on the page</td>
<td><code>Ctrl</code>+<code>Alt</code>+<code>P</code></td>
<td><code>Ctrl</code>+<code>Opt</code>+<code>P</code></td>
</tr>
<tr>
<td>Javascript Executor Window</td>
<td><code>Ctrl</code>+<code>Shift</code>+<code>J</code></td>
<td><code>Ctrl</code>+<code>Shift</code>+<code>J</code></td>
</tr>
<tr>
<td>On Service Portal id=form Save the form</td>
<td><code>Ctrl</code>+<code>S</code></td>
<td><code>Ctrl</code>+<code>S</code></td>
</tr>
<tr>
<td>On Service Portal widget editor, Save</td>
<td><code>Ctrl</code>+<code>S</code></td>
<td><code>Ctrl</code>+<code>S</code></td>
</tr>
<tr>
<td>On script editor fields, format code</td>
<td><code>Shift</code>+<code>Tab</code></td>
<td><code>Shift</code>+<code>Tab</code></td>
</tr>
</tbody>
</table>
<h2><a href="https://jace.pro/post/2020-05-22-all-the-shortcuts/#from-sn-utils">From SN Utils</a></h2>
<table>
<thead>
<tr>
<th>Action</th>
<th>Keyboard shortcut</th>
</tr>
</thead>
<tbody>
<tr>
<td>Save the current form</td>
<td><code>Ctrl</code>+<code>S</code></td>
</tr>
<tr>
<td>Create List filter</td>
<td><code>Ctrl</code>+<code>Left Click</code> on Field Label</td>
</tr>
<tr>
<td>Paste screenshots</td>
<td><code>Ctrl</code>+<code>V</code></td>
</tr>
<tr>
<td>Activate the extension</td>
<td>Configurable</td>
</tr>
<tr>
<td>Pop-In/Pop-Out of <code>nav_to.do</code></td>
<td>Configurable</td>
</tr>
<tr>
<td>Show Technical Names</td>
<td>Configurable</td>
</tr>
<tr>
<td>Open slashcommand popup</td>
<td>Configurable</td>
</tr>
<tr>
<td>Open VS Code ScriptSync tab</td>
<td>Configurable</td>
</tr>
</tbody>
</table>
<p>Source: <a href="https://twitter.com/sn_utils/status/1192913388906713088">https://twitter.com/sn_utils/status/1192913388906713088</a></p>
<h2><a href="https://jace.pro/post/2020-05-22-all-the-shortcuts/#navigation-shortcuts">Navigation shortcuts</a></h2>
<p>ServiceNow's docs on this are... well they say this same thing. I just wish there was more to this. <a href="https://docs.servicenow.com/bundle/orlando-platform-user-interface/page/administer/navigation-and-ui/task/t_NavigateDirectlyToATable.html">Source</a></p>
<table>
<thead>
<tr>
<th>Shortcut</th>
<th>Do I Use This</th>
<th>What does it do</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>table.config</code></td>
<td>No</td>
<td>Opens a list of all things related to a table</td>
</tr>
<tr>
<td><code>table.list</code></td>
<td>Yes</td>
<td>Opens the list of all records on said table in the current frame</td>
</tr>
<tr>
<td><code>table.LIST</code></td>
<td>Yes</td>
<td>Opens the list of all records on said table in a new tab</td>
</tr>
<tr>
<td><code>table.do</code></td>
<td>Yes</td>
<td>Opens a empty form for said table in the current frame</td>
</tr>
<tr>
<td><code>table.form</code></td>
<td>Yes</td>
<td>Opens a empty form for said table in the current frame</td>
</tr>
<tr>
<td><code>table.FORM</code></td>
<td>Yes</td>
<td>Opens a empty form for said table in a new tab</td>
</tr>
<tr>
<td><code>table.filter</code></td>
<td>No</td>
<td>Opens the list for a table with no records in the current frame</td>
</tr>
<tr>
<td><code>table.FILTER</code></td>
<td>No</td>
<td>Opens the list for a table with no records in a new tab</td>
</tr>
</tbody>
</table>
<p>I looked for where these are configured/built, and they are hardcoded in <a href="https://hi.service-now.com/scripts/app.magellan/directive.magellanNavigationFilter.js"><code>/scripts/app.magellan/directive.magellanNavigationFilter.js</code></a>.</p>
<!--EndFragment-->
<!--StartFragment-->
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">/*! RESOURCE: /scripts/app.magellan/directive.magellanNavigationFilter.js */</span><br />angular<span class="token punctuation">.</span><span class="token function">module</span><span class="token punctuation">(</span><span class="token string">'Magellan'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">directive</span><span class="token punctuation">(</span><span class="token string">'magellanNavigationFilter'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><br /> <span class="token parameter">$rootScope<span class="token punctuation">,</span><br /> glideUrlBuilder<span class="token punctuation">,</span><br /> $window<span class="token punctuation">,</span><br /> snCustomEvent<span class="token punctuation">,</span><br /> $timeout<span class="token punctuation">,</span><br /> concourseNavigatorService</span><br /><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">return</span> <span class="token punctuation">{</span><br /> <span class="token literal-property property">restrict</span><span class="token operator">:</span> <span class="token string">'A'</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">template</span><span class="token operator">:</span> <span class="token string">''</span><span class="token punctuation">,</span><br /> <span class="token function-variable function">link</span><span class="token operator">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">scope<span class="token punctuation">,</span> element</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> selectedIndex <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> selectedElement <span class="token operator">=</span> <span class="token keyword">null</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> shortcutCallback <span class="token operator">=</span> <span class="token keyword">null</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> collection <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> nav <span class="token operator">=</span> <span class="token function">$j</span><span class="token punctuation">(</span><span class="token string">'#nav_west_center'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> element<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'focus'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token function">$timeout</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> element<span class="token punctuation">.</span><span class="token function">select</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> scope<span class="token punctuation">.</span><span class="token function-variable function">clearHighlight</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> angular<span class="token punctuation">.</span><span class="token function">element</span><span class="token punctuation">(</span><span class="token string">'#gsft_nav a.state-active'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">removeClass</span><span class="token punctuation">(</span><span class="token string">'state-active'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> _$navRoot<span class="token punctuation">;</span><br /><br /> <span class="token keyword">function</span> <span class="token function">_focusFirstItem</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>_$navRoot<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> _$navRoot <span class="token operator">=</span> $window<span class="token punctuation">.</span><span class="token function">jQuery</span><span class="token punctuation">(</span><span class="token string">'#gsft_nav'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token function">$timeout</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> $window<span class="token punctuation">.</span><span class="token function">requestAnimationFrame</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> _$navRoot<span class="token punctuation">.</span><span class="token function">find</span><span class="token punctuation">(</span><span class="token string">'.state-active'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">removeClass</span><span class="token punctuation">(</span><span class="token string">'state-active'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> $visibleItems <span class="token operator">=</span> _$navRoot<span class="token punctuation">.</span><span class="token function">find</span><span class="token punctuation">(</span><span class="token string">'a.sn-widget-list-item:visible'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>$visibleItems<span class="token punctuation">.</span>length<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> $visibleItems<span class="token punctuation">.</span><span class="token function">eq</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">addClass</span><span class="token punctuation">(</span><span class="token string">'state-active'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> scope<span class="token punctuation">.</span>filterText <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">;</span><br /> scope<span class="token punctuation">.</span><span class="token function-variable function">filterTextValue</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">newValue<span class="token punctuation">,</span> highlightFirstItem</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>angular<span class="token punctuation">.</span><span class="token function">isDefined</span><span class="token punctuation">(</span>newValue<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> concourseNavigatorService<span class="token punctuation">.</span>filterTerm <span class="token operator">=</span> newValue<span class="token punctuation">;</span><br /> scope<span class="token punctuation">.</span>filterText <span class="token operator">=</span> newValue<span class="token punctuation">;</span><br /> <span class="token function">clearShortcutPreview</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">handleNavFilterExtension</span><span class="token punctuation">(</span>scope<span class="token punctuation">.</span>filterText<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">return</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token function">handleShortcuts</span><span class="token punctuation">(</span>scope<span class="token punctuation">.</span>filterText<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>highlightFirstItem <span class="token operator">===</span> <span class="token keyword">undefined</span> <span class="token operator">||</span> highlightFirstItem<span class="token punctuation">)</span><br /> <span class="token function">_focusFirstItem</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">return</span> scope<span class="token punctuation">.</span>filterText<span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><span class="token punctuation">;</span><br /> scope<span class="token punctuation">.</span><span class="token function-variable function">handleEnterKeypress</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">$event</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>selectedElement<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> $selected <span class="token operator">=</span> $window<span class="token punctuation">.</span><span class="token function">jQuery</span><span class="token punctuation">(</span><span class="token string">'#gsft_nav'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">find</span><span class="token punctuation">(</span><span class="token string">'.state-active'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>$selected<span class="token punctuation">.</span>length<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> selectedElement <span class="token operator">=</span> $selected<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">handleEnterKeypressEvent</span><span class="token punctuation">(</span>$event<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token function">reset</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token function">handleShortcutCallback</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> <span class="token constant">DETECT_JAVASCRIPT</span> <span class="token operator">=</span> <span class="token regex"><span class="token regex-delimiter">/</span><span class="token regex-source language-regex">^javascript:</span><span class="token regex-delimiter">/</span></span><span class="token punctuation">;</span><br /><br /> <span class="token keyword">function</span> <span class="token function">handleEnterKeypressEvent</span><span class="token punctuation">(</span><span class="token parameter">$event</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>selectedElement <span class="token operator">||</span> <span class="token operator">!</span>selectedElement<span class="token punctuation">.</span>href<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">return</span> <span class="token boolean">false</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant">DETECT_JAVASCRIPT</span><span class="token punctuation">.</span><span class="token function">test</span><span class="token punctuation">(</span>selectedElement<span class="token punctuation">.</span>href<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> $window<span class="token punctuation">.</span>location<span class="token punctuation">.</span>href <span class="token operator">=</span> selectedElement<span class="token punctuation">.</span>href<span class="token punctuation">;</span><br /> <span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><br /> scope<span class="token punctuation">.</span><span class="token function">navigate</span><span class="token punctuation">(</span>selectedElement<span class="token punctuation">.</span>href<span class="token punctuation">,</span> selectedElement<span class="token punctuation">.</span><span class="token function">getAttribute</span><span class="token punctuation">(</span><span class="token string">'target'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> $event<span class="token punctuation">.</span><span class="token function">preventDefault</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /><br /> <span class="token keyword">function</span> <span class="token function">handleShortcutCallback</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>shortcutCallback<span class="token punctuation">)</span><br /> <span class="token keyword">return</span><span class="token punctuation">;</span><br /> <span class="token function">shortcutCallback</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> scope<span class="token punctuation">.</span><span class="token function">filterTextValue</span><span class="token punctuation">(</span><span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token function">clearShortcutPreview</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /><br /> <span class="token keyword">function</span> <span class="token function">handleNavFilterExtension</span><span class="token punctuation">(</span><span class="token parameter">val</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">try</span> <span class="token punctuation">{</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">typeof</span> $window<span class="token punctuation">.</span>navFilterExtension <span class="token operator">===</span> <span class="token string">"function"</span> <span class="token operator">&&</span> $window<span class="token punctuation">.</span><span class="token function">navFilterExtension</span><span class="token punctuation">(</span>val<span class="token punctuation">,</span> msg<span class="token punctuation">)</span><span class="token punctuation">)</span><br /> <span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>e<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token function">jslog</span><span class="token punctuation">(</span><span class="token string">"Error in UI Script navFilterExtension - "</span> <span class="token operator">+</span> e<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /><br /> <span class="token keyword">function</span> <span class="token function">handleShortcuts</span><span class="token punctuation">(</span><span class="token parameter">filterText</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> tooltip <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> table <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">;</span><br /> shortcutCallback <span class="token operator">=</span> <span class="token keyword">null</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>filterText<span class="token punctuation">.</span>length <span class="token operator"><</span> <span class="token number">5</span><span class="token punctuation">)</span><br /> <span class="token keyword">return</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>filterText<span class="token punctuation">.</span><span class="token function">endsWith</span><span class="token punctuation">(</span><span class="token string">'.form'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> table <span class="token operator">=</span> filterText<span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span><span class="token string">'.form'</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toLowerCase</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span><span class="token regex"><span class="token regex-delimiter">/</span><span class="token regex-source language-regex"> </span><span class="token regex-delimiter">/</span><span class="token regex-flags">g</span></span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> tooltip <span class="token operator">=</span> <span class="token string">'Press enter to open the '</span> <span class="token operator">+</span> table <span class="token operator">+</span> <span class="token string">' form'</span><span class="token punctuation">;</span><br /> <span class="token function-variable function">shortcutCallback</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> scope<span class="token punctuation">.</span><span class="token function">navigate</span><span class="token punctuation">(</span>glideUrlBuilder<span class="token punctuation">.</span><span class="token function">getCancelableLink</span><span class="token punctuation">(</span>table <span class="token operator">+</span> <span class="token string">'.do?sys_id=-1'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>filterText<span class="token punctuation">.</span><span class="token function">endsWith</span><span class="token punctuation">(</span><span class="token string">'.list'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> table <span class="token operator">=</span> filterText<span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span><span class="token string">'.list'</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toLowerCase</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span><span class="token regex"><span class="token regex-delimiter">/</span><span class="token regex-source language-regex"> </span><span class="token regex-delimiter">/</span><span class="token regex-flags">g</span></span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> tooltip <span class="token operator">=</span> <span class="token string">'Press enter to open the '</span> <span class="token operator">+</span> table <span class="token operator">+</span> <span class="token string">' list'</span><span class="token punctuation">;</span><br /> <span class="token function-variable function">shortcutCallback</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> scope<span class="token punctuation">.</span><span class="token function">navigate</span><span class="token punctuation">(</span>glideUrlBuilder<span class="token punctuation">.</span><span class="token function">getCancelableLink</span><span class="token punctuation">(</span>table <span class="token operator">+</span> <span class="token string">'_list.do'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>filterText<span class="token punctuation">.</span><span class="token function">endsWith</span><span class="token punctuation">(</span><span class="token string">'.config'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> table <span class="token operator">=</span> filterText<span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span><span class="token string">'.config'</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toLowerCase</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span><span class="token regex"><span class="token regex-delimiter">/</span><span class="token regex-source language-regex"> </span><span class="token regex-delimiter">/</span><span class="token regex-flags">g</span></span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> tooltip <span class="token operator">=</span> <span class="token string">'Press enter to open the '</span> <span class="token operator">+</span> table <span class="token operator">+</span> <span class="token string">' configuration'</span><span class="token punctuation">;</span><br /> <span class="token function-variable function">shortcutCallback</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> scope<span class="token punctuation">.</span><span class="token function">navigate</span><span class="token punctuation">(</span>glideUrlBuilder<span class="token punctuation">.</span><span class="token function">getCancelableLink</span><span class="token punctuation">(</span><span class="token function">buildTableConfigURL</span><span class="token punctuation">(</span>table<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>filterText<span class="token punctuation">.</span><span class="token function">endsWith</span><span class="token punctuation">(</span><span class="token string">'.filter'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> table <span class="token operator">=</span> filterText<span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span><span class="token string">'.filter'</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toLowerCase</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span><span class="token regex"><span class="token regex-delimiter">/</span><span class="token regex-source language-regex"> </span><span class="token regex-delimiter">/</span><span class="token regex-flags">g</span></span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> tooltip <span class="token operator">=</span> <span class="token string">'Press enter to open an empty '</span> <span class="token operator">+</span> table <span class="token operator">+</span> <span class="token string">' list'</span><span class="token punctuation">;</span><br /> <span class="token function-variable function">shortcutCallback</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> scope<span class="token punctuation">.</span><span class="token function">navigate</span><span class="token punctuation">(</span>glideUrlBuilder<span class="token punctuation">.</span><span class="token function">getCancelableLink</span><span class="token punctuation">(</span>table <span class="token operator">+</span> <span class="token string">'_list.do?sysparm_filter_only=true'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>filterText<span class="token punctuation">.</span><span class="token function">endsWith</span><span class="token punctuation">(</span><span class="token string">'.FORM'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> table <span class="token operator">=</span> filterText<span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span><span class="token string">'.FORM'</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toLowerCase</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span><span class="token regex"><span class="token regex-delimiter">/</span><span class="token regex-source language-regex"> </span><span class="token regex-delimiter">/</span><span class="token regex-flags">g</span></span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> tooltip <span class="token operator">=</span> <span class="token string">'Press enter to open the '</span> <span class="token operator">+</span> table <span class="token operator">+</span> <span class="token string">' form in a new window'</span><span class="token punctuation">;</span><br /> <span class="token function-variable function">shortcutCallback</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> $window<span class="token punctuation">.</span><span class="token function">open</span><span class="token punctuation">(</span>glideUrlBuilder<span class="token punctuation">.</span><span class="token function">newGlideUrl</span><span class="token punctuation">(</span>table <span class="token operator">+</span> <span class="token string">'.do?sys_id=-1'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getURL</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>filterText<span class="token punctuation">.</span><span class="token function">endsWith</span><span class="token punctuation">(</span><span class="token string">'.LIST'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> table <span class="token operator">=</span> filterText<span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span><span class="token string">'.LIST'</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toLowerCase</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span><span class="token regex"><span class="token regex-delimiter">/</span><span class="token regex-source language-regex"> </span><span class="token regex-delimiter">/</span><span class="token regex-flags">g</span></span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> tooltip <span class="token operator">=</span> <span class="token string">'Press enter to open the '</span> <span class="token operator">+</span> table <span class="token operator">+</span> <span class="token string">' list in a new window'</span><span class="token punctuation">;</span><br /> <span class="token function-variable function">shortcutCallback</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> $window<span class="token punctuation">.</span><span class="token function">open</span><span class="token punctuation">(</span>glideUrlBuilder<span class="token punctuation">.</span><span class="token function">newGlideUrl</span><span class="token punctuation">(</span>table <span class="token operator">+</span> <span class="token string">'_list.do'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getURL</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>filterText<span class="token punctuation">.</span><span class="token function">endsWith</span><span class="token punctuation">(</span><span class="token string">'.CONFIG'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> table <span class="token operator">=</span> filterText<span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span><span class="token string">'.CONFIG'</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toLowerCase</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span><span class="token regex"><span class="token regex-delimiter">/</span><span class="token regex-source language-regex"> </span><span class="token regex-delimiter">/</span><span class="token regex-flags">g</span></span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> tooltip <span class="token operator">=</span> <span class="token string">'Press enter to open the '</span> <span class="token operator">+</span> table <span class="token operator">+</span> <span class="token string">' configuration in a new window'</span><span class="token punctuation">;</span><br /> <span class="token function-variable function">shortcutCallback</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> $window<span class="token punctuation">.</span><span class="token function">open</span><span class="token punctuation">(</span><span class="token function">buildTableConfigURL</span><span class="token punctuation">(</span>table<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>filterText<span class="token punctuation">.</span><span class="token function">endsWith</span><span class="token punctuation">(</span><span class="token string">'.FILTER'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> table <span class="token operator">=</span> filterText<span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span><span class="token string">'.FILTER'</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toLowerCase</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span><span class="token regex"><span class="token regex-delimiter">/</span><span class="token regex-source language-regex"> </span><span class="token regex-delimiter">/</span><span class="token regex-flags">g</span></span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> tooltip <span class="token operator">=</span> <span class="token string">'Press enter to open an empty '</span> <span class="token operator">+</span> table <span class="token operator">+</span> <span class="token string">' list in a new window'</span><span class="token punctuation">;</span><br /> <span class="token function-variable function">shortcutCallback</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> $window<span class="token punctuation">.</span><span class="token function">open</span><span class="token punctuation">(</span>glideUrlBuilder<span class="token punctuation">.</span><span class="token function">newGlideUrl</span><span class="token punctuation">(</span>table <span class="token operator">+</span> <span class="token string">'_list.do?sysparm_filter_only=true'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getURL</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>filterText<span class="token punctuation">.</span><span class="token function">endsWith</span><span class="token punctuation">(</span><span class="token string">'_list.do'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> table <span class="token operator">=</span> filterText<span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span><span class="token string">'_list.do'</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toLowerCase</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span><span class="token regex"><span class="token regex-delimiter">/</span><span class="token regex-source language-regex"> </span><span class="token regex-delimiter">/</span><span class="token regex-flags">g</span></span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> tooltip <span class="token operator">=</span> <span class="token string">'Press enter to open the '</span> <span class="token operator">+</span> table <span class="token operator">+</span> <span class="token string">' list'</span><span class="token punctuation">;</span><br /> <span class="token function-variable function">shortcutCallback</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> scope<span class="token punctuation">.</span><span class="token function">navigate</span><span class="token punctuation">(</span>table <span class="token operator">+</span> <span class="token string">'_list.do'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>filterText<span class="token punctuation">.</span><span class="token function">endsWith</span><span class="token punctuation">(</span><span class="token string">'.do'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> path <span class="token operator">=</span> filterText<span class="token punctuation">.</span><span class="token function">toLowerCase</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span><span class="token regex"><span class="token regex-delimiter">/</span><span class="token regex-source language-regex"> </span><span class="token regex-delimiter">/</span><span class="token regex-flags">g</span></span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> tooltip <span class="token operator">=</span> <span class="token string">'Press enter to open '</span> <span class="token operator">+</span> path<span class="token punctuation">;</span><br /> <span class="token function-variable function">shortcutCallback</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> scope<span class="token punctuation">.</span><span class="token function">navigate</span><span class="token punctuation">(</span>path<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> top<span class="token punctuation">.</span><span class="token constant">NOW</span><span class="token punctuation">.</span>magellan <span class="token operator">&&</span> top<span class="token punctuation">.</span><span class="token constant">NOW</span><span class="token punctuation">.</span>magellan<span class="token punctuation">.</span>setNavigatingState <span class="token operator">&&</span> top<span class="token punctuation">.</span><span class="token constant">NOW</span><span class="token punctuation">.</span>magellan<span class="token punctuation">.</span><span class="token function">setNavigatingState</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>tooltip <span class="token operator">!=</span> <span class="token string">''</span><span class="token punctuation">)</span><br /> <span class="token function">previewShortcut</span><span class="token punctuation">(</span>tooltip<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /><br /> <span class="token keyword">function</span> <span class="token function">buildTableConfigURL</span><span class="token punctuation">(</span><span class="token parameter">table</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> url <span class="token operator">=</span> glideUrlBuilder<span class="token punctuation">.</span><span class="token function">newGlideUrl</span><span class="token punctuation">(</span><span class="token string">'personalize_all.do'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> url<span class="token punctuation">.</span><span class="token function">addParam</span><span class="token punctuation">(</span><span class="token string">'sysparm_rules_table'</span><span class="token punctuation">,</span> table<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> url<span class="token punctuation">.</span><span class="token function">addParam</span><span class="token punctuation">(</span><span class="token string">'sysparm_rules_label'</span><span class="token punctuation">,</span> table<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">return</span> url<span class="token punctuation">.</span><span class="token function">getURL</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /><br /> <span class="token keyword">function</span> <span class="token function">previewShortcut</span><span class="token punctuation">(</span><span class="token parameter">title</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> placement <span class="token operator">=</span> document<span class="token punctuation">.</span>documentElement<span class="token punctuation">.</span><span class="token function">getAttribute</span><span class="token punctuation">(</span><span class="token string">'dir'</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token string">'rtl'</span> <span class="token operator">?</span> <span class="token string">'left'</span> <span class="token operator">:</span> <span class="token string">'right'</span><span class="token punctuation">;</span><br /> <span class="token function">jQuery</span><span class="token punctuation">(</span>element<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">tooltip</span><span class="token punctuation">(</span><span class="token punctuation">{</span><br /> <span class="token literal-property property">placement</span><span class="token operator">:</span> placement<span class="token punctuation">,</span><br /> <span class="token literal-property property">container</span><span class="token operator">:</span> <span class="token string">'body'</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">trigger</span><span class="token operator">:</span> <span class="token string">'manual'</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">title</span><span class="token operator">:</span> title<br /> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">tooltip</span><span class="token punctuation">(</span><span class="token string">'show'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> scope<span class="token punctuation">.</span>isPreviewOpen <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /><br /> <span class="token keyword">function</span> <span class="token function">clearShortcutPreview</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>scope<span class="token punctuation">.</span>isPreviewOpen<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token function">jQuery</span><span class="token punctuation">(</span>element<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">tooltip</span><span class="token punctuation">(</span><span class="token string">'destroy'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> scope<span class="token punctuation">.</span>isPreviewOpen <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span><br /> shortcutCallback <span class="token operator">=</span> <span class="token keyword">null</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /><br /> <span class="token keyword">function</span> <span class="token function">setSelected</span><span class="token punctuation">(</span><span class="token parameter">index</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> element<span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>index <span class="token operator">!=</span> selectedIndex<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token function">jQuery</span><span class="token punctuation">(</span>selectedElement<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">removeClass</span><span class="token punctuation">(</span><span class="token string">'state-active'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> selectedIndex <span class="token operator">=</span> index<span class="token punctuation">;</span><br /> selectedElement <span class="token operator">=</span> collection<span class="token punctuation">[</span>index<span class="token punctuation">]</span><span class="token punctuation">;</span><br /> element <span class="token operator">=</span> <span class="token function">jQuery</span><span class="token punctuation">(</span>selectedElement<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> element<span class="token punctuation">.</span><span class="token function">addClass</span><span class="token punctuation">(</span><span class="token string">'state-active'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /><br /> <span class="token keyword">function</span> <span class="token function">reset</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> selectedIndex <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>selectedElement<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token function">jQuery</span><span class="token punctuation">(</span>selectedElement<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">removeClass</span><span class="token punctuation">(</span><span class="token string">'state-active'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> selectedElement <span class="token operator">=</span> <span class="token keyword">null</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> collection <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> $rootScope<span class="token punctuation">.</span><span class="token function">$on</span><span class="token punctuation">(</span><span class="token string">'applicationTree.rendered'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token function">reset</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>scope<span class="token punctuation">.</span>data<span class="token punctuation">.</span>filteredApplications <span class="token operator">&&</span> scope<span class="token punctuation">.</span>data<span class="token punctuation">.</span>filteredApplications<span class="token punctuation">.</span>length <span class="token operator">></span> <span class="token number">0</span> <span class="token operator">&&</span> scope<span class="token punctuation">.</span>filterText<span class="token punctuation">.</span>length <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token function">setTimeout</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> collection <span class="token operator">=</span> <span class="token function">jQuery</span><span class="token punctuation">(</span><span class="token string">'#gsft_nav'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">find</span><span class="token punctuation">(</span><span class="token string">'a.sn-widget-list-item'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>collection<span class="token punctuation">.</span>length <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">)</span><br /> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">var</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> collection<span class="token punctuation">.</span>length<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>collection<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>href <span class="token operator">&&</span> collection<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>href <span class="token operator">!=</span> <span class="token string">'javascript:void(0)'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token function">setSelected</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> nav<span class="token punctuation">.</span><span class="token function">scrollTop</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">break</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>scope<span class="token punctuation">.</span>filterText <span class="token operator">===</span> <span class="token string">''</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token function">clearShortcutPreview</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token function">jQuery</span><span class="token punctuation">(</span><span class="token string">'.nav-body'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'click'</span><span class="token punctuation">,</span> <span class="token string">'a'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">jQuery</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'href'</span><span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token string">'#'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token function">reset</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">;</span></code></pre>
<!--EndFragment-->How to Save Knowledge Sessions Locally2020-05-14T05:54:48Zhttps://jace.pro/post/2020-05-14-how-to-save-k20-sessions-locally/Jace Benson<!--StartFragment-->
<p>So I was in the "Automate ServiceNow CI/CD" lab and the question came up, "How long will this session be online for me to view?". I'd link to it but the links are terrible because they change, hence this post.</p>
<p>If you don't trust you will get to the lab/video soon, I'd encourage you to save the video locally so you KNOW you'll have it to watch later.</p>
<p>I can hear you now, Jace, how can you do that? Well it seems the K19 and K20 both used this Brightcove video delivery system. Brightcove videos are not the simpliest to download but, you can save a video in about 5 clicks.</p>
<ol>
<li>Right click the video being presented, open "Player Information"</li>
<li>Copy the "Video ID" into this string replacing YourVideoID <code>http://players.brightcove.net/5703385908001/zKNjJ2k2DM_default/index.html?videoId=YourVideoID</code></li>
</ol>
<ul>
<li>http://players.brightcove.net/5703385908001/zKNjJ2k2DM_default/index.html?videoId=YourVideoID</li>
</ul>
<ol start="3">
<li>Take that string and paste it into <a href="https://bitdownloader.com/">bitdownloader.com</a> and click the "Download".</li>
<li>Now at the bottom is a list of videos with resolutions, Right click the video download button at the bottom, and click Save as, give it an apt name and you're set.</li>
</ol>
<!--EndFragment-->What is GlideQuery2020-04-28T05:50:46Zhttps://jace.pro/post/2020-04-28-what-is-glidequery/Jace Benson<!--StartFragment-->
<p>So this is a new thing that may change how code is written for some.</p>
<p>Let me show you an example of the code and output. Then I'll write my thoughts.</p>
<!--EndFragment-->
<!--StartFragment-->
<pre class="language-javascript"><code class="language-javascript"><span class="token keyword">var</span> testGlideQuery <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideQuery</span><span class="token punctuation">(</span><span class="token string">'sys_user'</span><span class="token punctuation">)</span><br /> <span class="token punctuation">.</span><span class="token function">where</span><span class="token punctuation">(</span><span class="token string">'active'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><br /> <span class="token punctuation">.</span><span class="token function">select</span><span class="token punctuation">(</span><span class="token string">'first_name'</span><span class="token punctuation">,</span> <span class="token string">'last_name'</span><span class="token punctuation">,</span> <span class="token string">'active'</span><span class="token punctuation">)</span><br /> <span class="token punctuation">.</span><span class="token function">toArray</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br />gs<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span><span class="token string">'testGlideQuery: '</span> <span class="token operator">+</span> <span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">stringify</span><span class="token punctuation">(</span>testGlideQuery<span class="token punctuation">,</span><span class="token string">''</span><span class="token punctuation">,</span><span class="token string">' '</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><br /><span class="token comment">/*<br />*** Script: testGlideQuery: [<br /> {<br /> "first_name": "a",<br /> "last_name": "b",<br /> "active": true,<br /> "sys_id": "9033c10d2f674c10bd54d5f62799b666"<br /> },<br /> {<br /> "first_name": "Aada",<br /> "last_name": "Keranen",<br /> "active": true,<br /> "sys_id": "15a849d32fd34810bd54d5f62799b6be"<br /> },<br /> ...<br />*/</span></code></pre>
<!--EndFragment-->
<!--StartFragment-->
<p>So, yea. That's interesting. Before you go and look if you can use this in your instance, you probably don't have it yet. To get it, enable the SAM and SAAS plugins.</p>
<p>The methods are exposed and is written in a interesting way. I suggest you check it out.</p>
<p>This brings up the big question, is GlideRecord going away? No. I don't think so. This seems to be just a wrapper to allow chain-able calls to query the data. Maybe as the Now Experience comes up this will be used more in that but I don't think so. I think this is just a wrapper some team made to make their code look one way.</p>
<p>In any case, I wanted to write this down so if anyone looks for it something comes up, because as of now, it's not written down anywhere.</p>
<!--EndFragment-->
<h2>Comments</h2>
<blockquote>
<p><strong><a href="https://github.com/crash180">crash180</a></strong> commented <a href="https://github.com/jacebenson/jace.pro/issues/179#issuecomment-621436055">on Apr 29, 2020</a></p>
<p>Interesting the things you can find when you dig a little bit. I have not heard of GlideQuery either</p>
<p><strong><a href="https://github.com/nikhilkumarsrs">nikhilkumarsrs</a></strong> commented <a href="https://github.com/jacebenson/jace.pro/issues/179#issuecomment-623983081">on May 5, 2020</a></p>
<p>Hi Jace, It says<br />
Evaluator: org.mozilla.javascript.EcmaError: "GlideQuery" is not defined.<br />
Caused by error in script at line</p>
<p><strong><a href="https://github.com/jacebenson">jacebenson</a></strong> commented <a href="https://github.com/jacebenson/jace.pro/issues/179#issuecomment-624658335">on May 6, 2020</a></p>
<p><a href="https://github.com/nikhilkumarsrs">@nikhilkumarsrs</a> You'll need to enable the SAM Pro plugins to use this it seems</p>
<p><strong><a href="https://github.com/nikhilkumarsrs">nikhilkumarsrs</a></strong> commented <a href="https://github.com/jacebenson/jace.pro/issues/179#issuecomment-624748568">on May 6, 2020</a></p>
<p><a href="https://github.com/jacebenson">@jacebenson</a> Hi Jace, SAM pro plugin is already active and still same error.</p>
<p><strong><a href="https://github.com/jacebenson">jacebenson</a></strong> commented <a href="https://github.com/jacebenson/jace.pro/issues/179#issuecomment-624893272">on May 6, 2020</a></p>
<p>I must have some more things on... com.sn_glidequery is what it says it's a part of;</p>
<p><a href="https://user-images.githubusercontent.com/638764/81228723-2e2fef00-8fb4-11ea-87b2-c843c78fdc82.png"><img src="https://user-images.githubusercontent.com/638764/81228723-2e2fef00-8fb4-11ea-87b2-c843c78fdc82.png" alt="image" /></a></p>
<p><strong><a href="https://github.com/jacebenson">jacebenson</a></strong> commented <a href="https://github.com/jacebenson/jace.pro/issues/179#issuecomment-624894680">on May 6, 2020</a></p>
<p>Maybe it's installed as part of this, but this isn't on the production instance I have access to.<br />
<a href="https://user-images.githubusercontent.com/638764/81228899-823ad380-8fb4-11ea-9dcb-26a39e7cf15a.png"><img src="https://user-images.githubusercontent.com/638764/81228899-823ad380-8fb4-11ea-9dcb-26a39e7cf15a.png" alt="image" /></a></p>
<p>I know I have this on all the environments it exists;<br />
<a href="https://user-images.githubusercontent.com/638764/81228944-a26a9280-8fb4-11ea-8245-64f6e2f56595.png"><img src="https://user-images.githubusercontent.com/638764/81228944-a26a9280-8fb4-11ea-8245-64f6e2f56595.png" alt="image" /></a></p>
<p>sn_sam_saa</p>
<p><strong><a href="https://github.com/nthumma">nthumma</a></strong> commented <a href="https://github.com/jacebenson/jace.pro/issues/179#issuecomment-633751111">on May 25, 2020</a></p>
<p>Nice article Jace!</p>
</blockquote>
Regress - ATF Recorder Share Review2020-04-28T05:50:11Zhttps://jace.pro/post/2020-04-28-atf-recorder-by-paul-morris/Jace Benson<!--StartFragment-->
<p>The other day I was looking at something when I saw this post by Paul Morris called, "<a href="https://community.servicenow.com/community?id=community_blog&sys_id=a4398aea1bb20c18fff162c4bd4bcbc8">Automating ATF - My Journey Building a Test Recorder</a>". I had to try it out. It's a work in progress but it is so very promising.</p>
<p>A few things to note. As of right now it is only written to work on UI16, and there are some things that are still being worked on. Other projects like it are Jared Laethem's <a href="https://dotwalk.io/bootstrap">Dotwalk.io Bootstrap</a></p>
<p>When I tried Paul share out it created the steps, but a few steps weren't created. But it got a lot of the things. I may end up installing this on a sub=prod to generate the tests and then tweak as needed.</p>
<p>In any case you all should check out this tool and give your feedback on the <a href="https://developer.servicenow.com/connect.do#!/share/contents/5672333_regress_atf_service_catalog_test_generator">share page</a>.</p>
<!--EndFragment-->How do you refer to ServiceNow?2020-04-27T05:49:15Zhttps://jace.pro/post/2020-04-27-why-do-some-call-servicenow-snow-and-sn/Jace Benson<!--StartFragment-->
<blockquote>
<p>Abbreviations and acronyms are shortened forms of words or phrases. An abbreviation is typically a shortened form of words used to represent the whole (such as Dr. or Prof.) while an acronym contains a set of initial letters from a phrase that usually form another word (such as radar or scuba).</p>
</blockquote>
<p>Like me, you probably have seen many refer to ServiceNow as "Snow" or "SN".</p>
<p>Is there a right way to shorten ServiceNow?</p>
<p>As much as I want to say one way is right, and the other is wrong, by the results of the survey, really we should just use the full name.</p>
<p>What do you use when referring to ServiceNow, let me know in the comments or reply to the <a href="https://twitter.com/jacebenson/status/1254853140551069702">survey</a> and why.</p>
<h2><a href="https://jace.pro/post/2020-04-27-why-do-some-call-servicenow-snow-and-sn/#further-reading">Further Reading</a></h2>
<ul>
<li><a href="https://abbreviations.yourdictionary.com/articles/what-is-the-difference-between-an-abbreviation-and-an-acroynm.html">https://abbreviations.yourdictionary.com/articles/what-is-the-difference-between-an-abbreviation-and-an-acroynm.html</a></li>
</ul>
<!--EndFragment-->How Virtual Task Boards Broke Labels / Tags2020-04-23T05:48:40Zhttps://jace.pro/post/2020-04-23-how-vtb-broke-labels-tags/Jace Benson<!--StartFragment-->
<p>You might know about this <a href="https://www.youtube.com/watch?v=dhqkmbMX68I">old feature called "labels"</a>. Well, now their called "Tags" but back then they were labels. In the New York release ServiceNow broke them. Here's the short version. Instead of giving the right users visibility to the tags, everyone can see any tag on a Virtual Task Board (VTB).</p>
<p>How can you see this problem? Take these steps;</p>
<p>Steps to reproduce</p>
<ol>
<li>Log in to Dev</li>
<li>Create a visual task board.</li>
<li>Add a new Label</li>
<li>Apply the label to a record on your VTB</li>
<li>Add a user on the VTB</li>
<li>Impersonate some other user (not the user in 5)</li>
<li>Go to a list and show the tags column</li>
<li>Start typing the tag name in the tag column, you'll see the tag created in 3.</li>
</ol>
<p>ServiceNow did the right thing moving to a central place to deal with label/tags.<br />
But, they should have used permissions to control who can see them based on the task board.<br />
I opened a HI ticket ally was able for them to give me a work around.</p>
<p>I didn't write this code, it worked for me in my tests. It's saved some other work too, but read the code and ensure it's doing what you think it should.</p>
<ul>
<li><a href="https://jace.pro/post/2020-04-23-how-vtb-broke-labels-tags/sys_script_fix_make_vtb_labels_inactive.xml">Fix Script "Make VTB Labels Inactive</a></li>
<li><a href="https://jace.pro/post/2020-04-23-how-vtb-broke-labels-tags/sys_script_make_vtb_labels_inactive.xml">Business Rule "Make VTB Labels Inactive</a></li>
<li><a href="https://jace.pro/post/2020-04-23-how-vtb-broke-labels-tags/sys_script_make_non_vtb_labels_active.xml">Business Rule "Make non-VTB Labels Active</a></li>
</ul>
<h2><a href="https://jace.pro/post/2020-04-23-how-vtb-broke-labels-tags/#further-reading">Further Reading</a></h2>
<ul>
<li><a href="https://hi.service-now.com/kb_view.do?sysparm_article=KB0788952">HI KB0788952 - VTB Working as designed</a></li>
<li><a href="https://community.servicenow.com/community?id=view_idea&sysparm_idea_id=00d61985db960c501cd8a345ca961948&sysparm_idea_table=x_snc_com_ideation_idea&sysparm_module_id=enhancement_requests">VTB Idea to improve tables</a></li>
</ul>
<!--EndFragment-->Fix Scripts Can Rollback Now2020-04-23T05:48:03Zhttps://jace.pro/post/2020-04-23-fix-scripts-can-rollback-now/Jace Benson<!--StartFragment-->
<p>If you've come to here looking to undo a fix script, I have bad news for you. I cannot fix the problem you currently have, but I can show you how to save yourself in the future.</p>
<p>So the other day people were talking about what to use to fix some data in their instance. The choices were Background Scripts, and Fix Scripts.</p>
<p>So I took note about why would you ever use a background script in favor of a fix script. One thing that stood out was background scripts can "rollback" the updates.<br />
Fix scripts don't show a way to do that. Then a few days later 0x111 shared on Discord that in fact they can be rolled back for fix scripts, but you have to set it up.</p>
<p>What do I mean? Well according to <a href="https://hi.service-now.com/kb_view.do?sysparm_article=KB0761248">this hi article(KB0761248)</a>. You have to show the "Record for rollback" field, and check it if you intend to "rollback" the updates.</p>
<h2><a href="https://jace.pro/post/2020-04-23-fix-scripts-can-rollback-now/#heres-what-i-saw">Here's what I saw</a></h2>
<table>
<thead>
<tr>
<th>Feature</th>
<th>Background Script</th>
<th>Fix Script</th>
</tr>
</thead>
<tbody>
<tr>
<td>Can choose your scope at execution</td>
<td>:white_check_mark:</td>
<td>:no_entry:</td>
</tr>
<tr>
<td><a href="https://community.servicenow.com/community?id=community_question&sys_id=67610b29db98dbc01dcaf3231f9619a0">Can run on application install</a></td>
<td>:no_entry:</td>
<td>:white_check_mark:</td>
</tr>
<tr>
<td>Audit</td>
<td>System Log only</td>
<td>:white_check_mark:</td>
</tr>
<tr>
<td>Instant Return</td>
<td>:white_check_mark:</td>
<td>When run in foreground</td>
</tr>
<tr>
<td>Can run in the background</td>
<td>:no_entry:</td>
<td>:white_check_mark:</td>
</tr>
<tr>
<td>Syntax Highlighting</td>
<td>:no_entry:</td>
<td>:white_check_mark:</td>
</tr>
<tr>
<td>Intellisense</td>
<td>:no_entry:</td>
<td>:white_check_mark:</td>
</tr>
<tr>
<td>Versioning</td>
<td>:no_entry:</td>
<td>:white_check_mark:</td>
</tr>
<tr>
<td>Can be cancelled</td>
<td>:white_check_mark:</td>
<td>:white_check_mark:</td>
</tr>
<tr>
<td>Updates can be rolled back</td>
<td>:white_check_mark:</td>
<td>If you tell it</td>
</tr>
</tbody>
</table>
<p>This feature is great, but why is it default unchecked? I know it's new as of London but come on. This makes using Fix Scripts the way to do things.</p>
<h2><a href="https://jace.pro/post/2020-04-23-fix-scripts-can-rollback-now/#further-reading">Further Reading</a></h2>
<ul>
<li>Steven Bell has a post titled, "<a href="https://community.servicenow.com/community?id=community_blog&sys_id=e81eae2ddbd0dbc01dcaf3231f96194f">Two Methods for Code Development</a>"</li>
<li>John Roberts writes about Fix Scripts in "<a href="http://www.cavucode.com/blog/2015/4/12/fujiforty-get-your-fix">FujiForty - Get Your Fix</a>"</li>
</ul>
<p>How long do these rollbacks last? Well that depends on the value of the property, <code>glide.rollback.expiration_days</code>. More about that here on this <a href="https://docs.servicenow.com/bundle/orlando-platform-administration/page/administer/table-administration/concept/rollback-contexts.html">rollback contexts doc</a>.</p>
<p>Thanks Kalai for the information on the rollback contexts.</p>
<!--EndFragment-->K20's Hackathon2020-04-23T05:47:21Zhttps://jace.pro/post/2020-04-23-k20-hackathon-see-you-there/Jace Benson<!--StartFragment-->
<p>Last year I was pretty bitter about the hackathon. This year, I think the event will be better. Andrew Barnes and Brad Tilton are running this event. As I understand it these are the details;</p>
<p>First lets go over what you'll get out of this.</p>
<ul>
<li>You will learn how to build whatever it is you're building. So if you want to try out the new now-experience, here's your time to shine.</li>
<li>You will likely form a team and make better bonds with those on it.</li>
<li>You might win one the five categories, if you do you'll get $500 USD, or $5,000 USD for your team.</li>
<li>ServiceNow may feature your work in some content sent out to people who want that kind of stuff.</li>
</ul>
<p>Now let's go over the specifics.</p>
<table>
<thead>
<tr>
<th>Questions</th>
<th>Answers</th>
</tr>
</thead>
<tbody>
<tr>
<td>How big can the teams be?</td>
<td>1-8 people.</td>
</tr>
<tr>
<td>When does it start?</td>
<td>May 1st.</td>
</tr>
<tr>
<td>When does it end?</td>
<td>May 3rd.</td>
</tr>
<tr>
<td>How many teams will be named winners?</td>
<td>5</td>
</tr>
<tr>
<td>What criteria will things be judged by?</td>
<td></td>
</tr>
</tbody>
</table>
<p>Last year <a href="https://jace.pro/post/2019-04-22-knowledge-hackathon-past/">I wrote up a detailed blog about winning hackathons</a> and reviewed all the past hackathons I could find (2013-2018).</p>
<p>May the odds be ever in your favor.</p>
<h2><a href="https://jace.pro/post/2020-04-23-k20-hackathon-see-you-there/#further-reading">Further reading</a></h2>
<ul>
<li><a href="https://finite-partners.com/preparing-for-the-k20-hackathon/">Preparing for K20 hackathon by Jarod Mundt</a></li>
<li><a href="https://jace.pro/post/2019-04-22-knowledge-hackathon-past/">2013-2018 Hackathon winners</a></li>
<li><a href="https://www.youtube.com/watch?v=ctzX-ANG_Sk&feature=youtu.be">Robert Fedoruk's amazing Hackathon video</a></li>
<li><a href="https://hacknow.service-now.com/creatorcon">Official site</a></li>
</ul>
<!--EndFragment-->Now Experience Notes2020-03-28T05:46:39Zhttps://jace.pro/post/2020-03-27-now-experience-notes/Jace Benson<!--StartFragment-->
<p>I was following along with <a href="https://andrew.alburydor.com/posts/2020-03-20-nowui-part1/">Upside-down Andrew's posts</a> and taking notes trying to get a now-expierence component to work.</p>
<p>Here's my notes;</p>
<ol>
<li>
<p>Checked version of node; <code>node --version</code> it's at 12.16.1</p>
</li>
<li>
<p>Checked version of npm; <code>npm --version</code> it's at 6.13.4 (howver there's a upgrade to 6.14.4)</p>
</li>
<li>
<p>Checked version of now-cli; <code>now-cli --version</code> it's at 17.0.2</p>
</li>
<li>
<p>Created folder/repository to render a joke from <a href="http://joke.jace.pro/">joke.jace.pro</a></p>
</li>
<li>
<p>Created <a href="http://readme.md/">README.md</a> file with aweseome contnet (thanks AAD)</p>
</li>
<li>
<p>Staged my commit of the update to <a href="http://readme.md/">README.md</a></p>
</li>
<li>
<p>Created Repository on Github <a href="https://github.com/jacebenson/now-joke">https://github.com/jacebenson/now-joke</a></p>
</li>
<li>
<p>Added SSH Repository link</p>
</li>
<li>
<p>Ensured <code>git@github.com:jacebenson/now-joke.git</code> is returned when <code>git remote show origin</code></p>
<ul>
<li>If you don't have SSH configured with Git, you'll want to undo the git url and use https instead... really set up SSH</li>
<li><a href="https://help.github.com/en/github/authenticating-to-github/connecting-to-github-with-ssh">Github's docs to do this</a></li>
</ul>
</li>
<li>
<p>Push your either by <code>git push -u origin remote</code> or with buttons in VS Code. You should see the file on <a href="http://github.com/">github.com</a> with it's contents</p>
</li>
<li>
<p>You need an empty to build the project, so lets delete that <a href="http://readme.md/">README.md</a>.... you can do that by typing <code>rm README.md</code></p>
</li>
<li>
<p>Now we can create the project, I ran <code>now-cli project --name "@jace/now-joke" --description "It's what it says on the lid"</code></p>
</li>
<li>
<p>It created the scaffolding, you'll need to do a <code>npm install</code> or <code>npm i</code> to install the package.json dependencies</p>
</li>
<li>
<p>We can finally Start rendering something.... run <code>now-cli develop --open</code></p>
</li>
<li>
<p>Edit the <code>./src/x-1234-your-component/index.js</code> line 7 to say something, your browser should update</p>
</li>
</ol>
<!--EndFragment-->Using a SP Widget on Ui162020-03-25T05:44:09Zhttps://jace.pro/post/2020-03-25-SP-widget-on-ui16/Jace Benson<!--StartFragment-->
<p>A while ago <a href="https://medium.com/@pishchulin">Andrew Pishchulin</a> shared a <a href="https://medium.com/@pishchulin/advanced-attachment-management-in-servicenow-f15246e7f785">post on Medium</a> where he put a Service Portal widget on UI16. My mind was blown. How did he do it.</p>
<p>His post doesn't go over the specifics but here's what he said;</p>
<blockquote>
<p>Service Portal widget can also be used in ServiceNow native UI, all you need to do is just to create a UI Macro/formatter which loads a service portal page with that widget</p>
</blockquote>
<p>The way to do this (again thanks to Andrew) is this;</p>
<ol>
<li>Create an empty Service Portal (I'll name mine "widgetOnly")</li>
<li>Create a Portal Page (I'll name mine "pageForHelloWorld")</li>
<li>Add your widget to the Portal Page</li>
<li>Create a UI Macro (I'll name mine "spHelloWorld") with this code, change height as needed</li>
</ol>
<pre class="language-xml"><code class="language-xml"><span class="token prolog"><?xml version="1.0" encoding="utf-8" ?></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">j:</span>jelly</span> <span class="token attr-name">trim</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>false<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xmlns:</span>j</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>jelly:core<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xmlns:</span>g</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>glide<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xmlns:</span>j2</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>null<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xmlns:</span>g2</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>null<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>iframe</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>widgetOnly?id=pageForHelloWorld<span class="token punctuation">"</span></span> <span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>100%<span class="token punctuation">"</span></span> <span class="token attr-name">scrolling</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>no<span class="token punctuation">"</span></span> <span class="token special-attr"><span class="token attr-name">style</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token value css language-css"><span class="token property">border</span><span class="token punctuation">:</span>none<span class="token punctuation">;</span><span class="token property">min-height</span><span class="token punctuation">:</span>400px<span class="token punctuation">;</span></span><span class="token punctuation">"</span></span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>iframe</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"></</span><span class="token namespace">j:</span>jelly</span><span class="token punctuation">></span></span></code></pre>
<ol start="5">
<li>Create a UI Formatter with the formatter called "spHelloWorld.xml" and set the table you want.</li>
<li>Add the formatter on the form (same way you'd add a field, via form layout)</li>
</ol>
<!--EndFragment-->
<h2>Comments</h2>
<!--StartFragment-->
<blockquote>
<p><strong><a href="https://github.com/artemis15">artemis15</a></strong> commented <a href="https://github.com/jacebenson/jace.pro/issues/170#issuecomment-624578049">on May 6, 2020</a></p>
<p>Instead to creating portal for this, you can alos use $sp.do?id=pag</p>
</blockquote>
<blockquote>
<p><strong><a href="https://github.com/jacebenson">jacebenson</a></strong> commented <a href="https://github.com/jacebenson/jace.pro/issues/170#issuecomment-624658706">on May 6, 2020</a></p>
<p>That's a great call out. Thanks <a href="https://github.com/artemis15">@artemis15</a> .</p>
</blockquote>
<blockquote>
<p><strong><a href="https://github.com/nsierraj">nsierraj</a></strong> commented <a href="https://github.com/jacebenson/jace.pro/issues/170#issuecomment-627990515">on May 13, 2020</a></p>
<p>And you can use "RP.getParameterValue('sys_id');" to pass values to the widget to make it sensitive to the record in the form.</p>
</blockquote>
<blockquote>
<p><strong><a href="https://github.com/meatsac">meatsac</a></strong> commented <a href="https://github.com/jacebenson/jace.pro/issues/170#issuecomment-720107278">on Nov 1, 2020</a></p>
<p>This post suggests you can call the widget directly. I haven't had success with this myself but would be interested to hear if this is indeed possible.</p>
<p><a href="https://snhackery.com/2019/04/10/portal-widgets-on-ui-pages/">https://snhackery.com/2019/04/10/portal-widgets-on-ui-pages/</a></p>
</blockquote>
<!--EndFragment-->Knowledge 20 (K20) Turned Virtual2020-03-16T05:42:46Zhttps://jace.pro/post/2020-03-16-k20-turned-virtual/Jace Benson<!--StartFragment-->
<h1>K20 has gone digital</h1>
<p>ServiceNow just announced it has gone digital for this event. Below is the statement from <a href="https://knowledge.servicenow.com/faq.html#more_1">https://knowledge.servicenow.com/faq.html#more_1</a></p>
<blockquote>
<p>Over the past few weeks, we have been closely monitoring the evolving COVID-19 pandemic. In order to protect the health and safety of our Knowledge 2020 attendees, partners, and community, we have made the decision to make Knowledge 2020 a digital community event that will launch on May 5 in place of the in-person event in Orlando, FL.</p>
<p><s>As a Knowledge 2020 registrant, you will receive a full refund of your pass to the original form of payment. This will take 5-7 business days to complete and an email confirmation will be sent to you.</s></p>
<p>The Knowledge 2020 digital experience will showcase all the ways you can unlock productivity through modern digital workflows, highlight the latest customer and platform innovations, and inspire the ServiceNow community to continue to create great experiences for businesses.</p>
<p>In the coming days and weeks, we will provide details about the Knowledge 2020 digital experience. We are committed to creating a phenomenal digital experience that will engage, inspire, and connect you to the best practices from our customers around the world.</p>
<p>The global health crisis is creating new realities for all of us. Thank you for your patience as we evaluated this fluid situation and assessed the best way forward to bring the ServiceNow community together in a safe and healthy manner. We regret we won’t see you in Orlando this year, but we are excited to stay connected digitally to share and learn from each other. That’s always been the power of the ServiceNow community.</p>
<p>See you online!</p>
</blockquote>
<p>Which has a lot of details.</p>
<h2>My take aways</h2>
<p>It seems that ServiceNow has taken a page from Google's book here. That's fine. Great even. No reason to rethink some of these decisions.</p>
<table>
<thead>
<tr>
<th>Item</th>
<th>Google Cloud Next <a href="https://cloud.withgoogle.com/next/sf/faq">FAQ</a></th>
<th>ServiceNow <a href="https://knowledge.servicenow.com/faq.html#hotel_1">FAQ</a></th>
</tr>
</thead>
<tbody>
<tr>
<td>Price</td>
<td>Refunded, and waived</td>
<td><s>Refunded</s> Rolled to K21</td>
</tr>
<tr>
<td>Hotel</td>
<td>Cancelled automatically</td>
<td>Cancelled automatically</td>
</tr>
<tr>
<td>Keynotes</td>
<td>Still happening</td>
<td>Not addressed, but I imagine they will show this like they have previously</td>
</tr>
<tr>
<td>Sessions</td>
<td>Listed, not scheduled (Maybe they were scheduled, but I wasn't watching then)</td>
<td>They were listed, not anymore, and not scheduled</td>
</tr>
<tr>
<td>Attendance</td>
<td>Everyone can join for free</td>
<td><s>Not addressed</s> Everyone can join for free</td>
</tr>
<tr>
<td>Swag?</td>
<td>There will not be swag</td>
<td>Not addressed</td>
</tr>
<tr>
<td>Flight</td>
<td>You are on your own</td>
<td><s>Not addressed</s> You are on your own</td>
</tr>
</tbody>
</table>
<ul>
<li>Full refunds of your pass. If you booked a hotel through Knowledge 2020 website, the reservation will be cancelled.</li>
<li>A "digital experience" was mentioned three times in this short FAQ. It should engage, inspire, and connect individuals.</li>
</ul>
<h2>What can we expect for a "digital experience"?</h2>
<p>Here we get into what could be. If we look at other conferences that went digital, and ones that have always have been there seems to be some competing agendas.</p>
<ol>
<li>Disseminating information. I assume will be done via Zoom Meetings or some other screensharing tool.</li>
<li>Connecting individuals. I assume this will be either not available, or some digital way, but in either case, it will be new and different. It will take getting used to.</li>
<li>Expo floor. I assume this will be either not available, or some digital way, but in either case, it will be new and different. It will take getting used to.</li>
</ol>
<h2>How can we capitalize on this change?</h2>
<p>Since everything will be digital, all streaming of ServiceNow stuff is nearly equal. If you're a small partner, spinning up YouTube Live or Twitch, you are not much different than however ServiceNow official will handle it in my opinion. With that being said I expect to see a lot of steaming video coming up out of this.</p>
<h1>Changes</h1>
<table>
<thead>
<tr>
<th>Date</th>
<th>Changed</th>
</tr>
</thead>
<tbody>
<tr>
<td>2020-03-17</td>
<td>Passes are now stated to be rolled to K21 and not refunded unless asked.</td>
</tr>
<tr>
<td>2020-03-17</td>
<td>Digital event will be free. <a href="https://knowledge.servicenow.com/faq.html#reg_1">https://knowledge.servicenow.com/faq.html#reg_1</a> Will there be a cost for digital participation? We will not be charging for attending the Knowledge 2020 digital experience. Stay tuned for more information on how to register.</td>
</tr>
<tr>
<td>2020-03-17</td>
<td>Airfare will not be reimbursed. <a href="https://knowledge.servicenow.com/faq.html#speaker_1">https://knowledge.servicenow.com/faq.html#speaker_1</a> Will I receive reimbursement for airfare? Airfare and hotel is the sole responsibility of the individual and will not be reimbursed.</td>
</tr>
<tr>
<td>2020-03-17</td>
<td>"Learn More" FAQ removed block of text regarding refunds.</td>
</tr>
</tbody>
</table>
<!--EndFragment-->Ok Orlando - Automated Testing Framework changes2020-02-29T06:41:30Zhttps://jace.pro/post/2020-02-29-ok-orlando-atf/Jace Benson<!--StartFragment-->
<h1>OK Orlando - A series of features worth note</h1>
<p>In Orlando there's a bunch of <a href="https://docs.servicenow.com/bundle/orlando-release-notes/page/release-notes/summary/rn-summary-new-features.html">Automated Test Framework(ATF) updates</a>.</p>
<p>Lets go over them and see what we think;</p>
<h2>Copy an automated test suite</h2>
<p>In the past copying a test suite kept the past scope.<br />
Lets see how good this works.</p>
<ul>
<li>If a suite spans multiple scopes, copying scopes doesn't copy anything out of the current scope.</li>
<li>Copying a test suite isn't available unless you're in the suite's scope.</li>
</ul>
<h2>Custom UI test steps - misleading</h2>
<p>So in the new section there's a "Custom UI test steps" but it goes on to say;</p>
<blockquote>
<p>Test workspaces using the Form category test steps. The Custom UI category steps don't support available workspace.</p>
</blockquote>
<p>So it's just a heads up, to test workspaces goto the form category, not custom ui.</p>
<h2>List and related list steps</h2>
<ul>
<li>Validate related list visibility - tested</li>
<li>Apply filter to list - tested</li>
<li>Validate record present in list - tested - no way to validate list is empty or test that</li>
<li>Validate ui actions in lists</li>
<li>Open a record in list</li>
</ul>
<h2>Email</h2>
<ul>
<li>Validate outbound email</li>
<li>Generate inbound reply email</li>
</ul>
<h2>Other</h2>
<ul>
<li>Generate Random String - only input is how long to make the input...</li>
</ul>
<!--EndFragment-->Ok Orlando - Data Source Custom Load by Script2020-02-29T06:39:43Zhttps://jace.pro/post/2020-02-29-ok-orlando-import-export-script-type-source/Jace Benson<!--StartFragment-->
<p>So this looks pretty neat, a way to simply load a set of data from script. This has been done previously by me with scheduled jobs and the like but now that isn't necessary.</p>
<p>Lets look at the example provided on the <a href="https://docs.servicenow.com/bundle/orlando-platform-administration/page/administer/import-sets/task/create-custom-type-data-source.html">docs</a></p>
<p>The data loader script has one input parameter, import_set_table, and the following methods:</p>
<table>
<thead>
<tr>
<th>Method</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>addColumn</code></td>
<td>Adds a string type column to the import set table.</td>
</tr>
<tr>
<td><code>addJSONColumn</code></td>
<td>Adds a JSON type column to the import set table.</td>
</tr>
<tr>
<td><code>addXMLColumn</code></td>
<td>Adds an XML type column to the import set table.</td>
</tr>
<tr>
<td><code>insert</code></td>
<td>Inserts a map (key = column name, value = column value) in the import set table.</td>
</tr>
</tbody>
</table>
<h2>The example randomuser.me</h2>
<pre class="language-javascript"><code class="language-javascript"><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token function">loadData</span><span class="token punctuation">(</span><span class="token parameter">import_set_table</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token comment">// Add your code here to insert data to import_set_table</span><br /> <span class="token keyword">var</span> requestBody <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> restMessage <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">sn_ws<span class="token punctuation">.</span>RESTMessageV2</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> restMessage<span class="token punctuation">.</span><span class="token function">setHttpMethod</span><span class="token punctuation">(</span><span class="token string">"get"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> restMessage<span class="token punctuation">.</span><span class="token function">setEndpoint</span><span class="token punctuation">(</span><span class="token string">"https://randomuser.me/api/?results=100"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> restMessage<span class="token punctuation">.</span><span class="token function">setRequestBody</span><span class="token punctuation">(</span><span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">stringify</span><span class="token punctuation">(</span>requestBody<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> response <span class="token operator">=</span> restMessage<span class="token punctuation">.</span><span class="token function">execute</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> error <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">haveError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span><span class="token punctuation">(</span>error<span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">var</span> errorCode <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">getErrorCode</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> errorMsg <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">getErrorMessage</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">var</span> headerVal <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">getHeader</span><span class="token punctuation">(</span><span class="token string">"Content-Type"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> headers <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">getHeaders</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> queryString <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">getQueryString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> statusCode <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">getStatusCode</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> responseBody <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">getBody</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> responseObj <span class="token operator">=</span> <span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">parse</span><span class="token punctuation">(</span>responseBody<span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token comment">// gs.info(statusCode);</span><br /><span class="token comment">// gs.info(responseBody);</span><br /> responseObj<span class="token punctuation">.</span>results<span class="token punctuation">.</span><span class="token function">forEach</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">user</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">var</span> map <span class="token operator">=</span> <span class="token punctuation">{</span><br /> <span class="token literal-property property">u_first</span><span class="token operator">:</span> user<span class="token punctuation">.</span>name<span class="token punctuation">.</span>first<span class="token punctuation">,</span><br /> <span class="token literal-property property">u_last</span><span class="token operator">:</span> user<span class="token punctuation">.</span>name<span class="token punctuation">.</span>last<span class="token punctuation">,</span><br /> <span class="token literal-property property">u_email</span><span class="token operator">:</span> user<span class="token punctuation">.</span>email<span class="token punctuation">,</span><br /> <span class="token literal-property property">u_phone</span><span class="token operator">:</span> user<span class="token punctuation">.</span>phone<br /> <span class="token punctuation">}</span><span class="token punctuation">;</span><br /> import_set_table<span class="token punctuation">.</span><span class="token function">insert</span><span class="token punctuation">(</span>map<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">(</span>import_set_table<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p>So this didn't wrok right away, but it was only because the import set table has be exist before things can work it seems. Once that table was made it worked exactly like I thought it would.</p>
<!--EndFragment-->
<h2>Comments</h2>
Ok Orlando - CSV Line Parser2020-02-28T06:37:18Zhttps://jace.pro/post/2020-02-28-ok-orlando-import-export-csv-line-parser/Jace Benson<!--StartFragment-->
<p>As part of my getting familiar with some of the new features of Orlando, I wanted to dive into the new CSVParser class.</p>
<h2>Why might I use this?</h2>
<p>So in looking for use-case I found a community post by [Vinod]. He has a csv file that he needs to parse. Good enough for me. [Ankur Bawiskar] proposed a solution, but it's using some Packages call, that is not supported in scopes. With that lets dig in.</p>
<p>I am using the <a href="https://catalog.data.gov/dataset/fy-2011-public-libraries-survey">Library survey from 2011</a> data and I'm planning to write that to an import table, then to that could be used to update Locations.</p>
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">// Original solution</span><br /><span class="token keyword">var</span> sa <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideSysAttachment</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token keyword">var</span> bytesContent <span class="token operator">=</span> sa<span class="token punctuation">.</span><span class="token function">getBytes</span><span class="token punctuation">(</span><span class="token string">"incident"</span><span class="token punctuation">,</span> <span class="token string">"bdd212d04fbf7340fc11fa218110c7d5"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token keyword">var</span> strData <span class="token operator">=</span> <span class="token function">String</span><span class="token punctuation">(</span>Packages<span class="token punctuation">.</span>java<span class="token punctuation">.</span>lang<span class="token punctuation">.</span><span class="token function">String</span><span class="token punctuation">(</span>bytesContent<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br />gs<span class="token punctuation">.</span><span class="token function">print</span><span class="token punctuation">(</span>strData<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p>Lets try this with CSVParser.</p>
<p>Oofta. So Below is my "working" example. A few important notes;</p>
<ol>
<li><code>parseLineToObject</code> needs the array for the headers.</li>
<li>If your CSV is mixed with quotes and without, you're going to have to correct that, like I did.</li>
</ol>
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">// to object</span><br /><span class="token keyword">var</span> attachment <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideSysAttachment</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token keyword">var</span> agr <span class="token operator">=</span> attachment<span class="token punctuation">.</span><span class="token function">getAttachments</span><span class="token punctuation">(</span><span class="token string">'incident'</span><span class="token punctuation">,</span> <span class="token string">'552c48888c033300964f4932b03eb092'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token keyword">while</span> <span class="token punctuation">(</span>agr<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> gs<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span>agr<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token string">'file_name'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> content <span class="token operator">=</span> attachment<span class="token punctuation">.</span><span class="token function">getContent</span><span class="token punctuation">(</span>agr<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> contentb64 <span class="token operator">=</span> attachment<span class="token punctuation">.</span><span class="token function">getContentBase64</span><span class="token punctuation">(</span>agr<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> gs<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span><span class="token string">'content.length: '</span> <span class="token operator">+</span> content<span class="token punctuation">.</span>length<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token comment">// CSV Parser splits the data up</span><br /> <span class="token keyword">var</span> contentArr <span class="token operator">=</span> content<span class="token punctuation">.</span><span class="token function">split</span><span class="token punctuation">(</span><span class="token string">'\n'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> headers <span class="token operator">=</span> <span class="token punctuation">[</span><br /> <span class="token string">"STABR"</span><span class="token punctuation">,</span> <span class="token string">"FSCSKEY"</span><span class="token punctuation">,</span> <span class="token string">"FSCS_SEQ"</span><span class="token punctuation">,</span> <span class="token string">"LIBID"</span><span class="token punctuation">,</span> <span class="token string">"LIBNAME"</span><span class="token punctuation">,</span> <span class="token string">"ADDRESS"</span><span class="token punctuation">,</span> <span class="token string">"CITY"</span><span class="token punctuation">,</span> <span class="token string">"ZIP"</span><span class="token punctuation">,</span> <span class="token string">"ZIP4"</span><span class="token punctuation">,</span> <span class="token string">"CNTY"</span><span class="token punctuation">,</span> <span class="token string">"PHONE"</span><span class="token punctuation">,</span> <span class="token string">"C_OUT_TY"</span><span class="token punctuation">,</span> <span class="token string">"C_MSA"</span><span class="token punctuation">,</span> <span class="token string">"SQ_FEET"</span><span class="token punctuation">,</span> <span class="token string">"F_SQ_FT"</span><span class="token punctuation">,</span> <span class="token string">"L_NUM_BM"</span><span class="token punctuation">,</span> <span class="token string">"F_BKMOB"</span><span class="token punctuation">,</span> <span class="token string">"HOURS"</span><span class="token punctuation">,</span> <span class="token string">"F_HOURS"</span><span class="token punctuation">,</span> <span class="token string">"WKS_OPEN"</span><span class="token punctuation">,</span> <span class="token string">"F_WKSOPN"</span><span class="token punctuation">,</span> <span class="token string">"YR_SUB"</span><span class="token punctuation">,</span> <span class="token string">"STATSTRU"</span><span class="token punctuation">,</span> <span class="token string">"STATNAME"</span><span class="token punctuation">,</span> <span class="token string">"STATADDR"</span><span class="token punctuation">,</span> <span class="token string">"LONGITUD"</span><span class="token punctuation">,</span> <span class="token string">"LATITUDE"</span><span class="token punctuation">,</span> <span class="token string">"FIPSST"</span><span class="token punctuation">,</span> <span class="token string">"FIPSCO"</span><span class="token punctuation">,</span> <span class="token string">"FIPSPLAC"</span><span class="token punctuation">,</span> <span class="token string">"CNTYPOP"</span><span class="token punctuation">,</span> <span class="token string">"LOCALE"</span><span class="token punctuation">,</span> <span class="token string">"CENTRACT"</span><span class="token punctuation">,</span> <span class="token string">"CENBLOCK"</span><span class="token punctuation">,</span> <span class="token string">"CDCODE"</span><span class="token punctuation">,</span> <span class="token string">"MAT_CENT"</span><span class="token punctuation">,</span> <span class="token string">"MAT_TYPE"</span><span class="token punctuation">,</span> <span class="token string">"CBSA"</span><span class="token punctuation">,</span> <span class="token string">"MICROF"</span><br /> <span class="token punctuation">]</span><span class="token punctuation">;</span><br /> <span class="token comment">// with out this, the call fails;</span><br /> <span class="token comment">// now if you csv is not formed consistentlt yhis still fails.... so im just going to remove ,'s in quotes, then quotes.</span><br /> contentArr<span class="token punctuation">.</span><span class="token function">forEach</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">line</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token comment">// regex to remove commas from within `"` parts e.g. a,b,"test,test./#&"</span><br /> <span class="token keyword">var</span> regex <span class="token operator">=</span> <span class="token regex"><span class="token regex-delimiter">/</span><span class="token regex-source language-regex">"([A-Z0-9\s\.#-\/&]+),([A-Z0-9\s\.#-\/&]+)"</span><span class="token regex-delimiter">/</span><span class="token regex-flags">gm</span></span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> subst <span class="token operator">=</span> <span class="token string">"$1$2"</span><span class="token punctuation">;</span><br /> line <span class="token operator">=</span> line<span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span>regex<span class="token punctuation">,</span> subst<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token comment">// regex to remove comma from within " at the end e.g. a,b,"test,"</span><br /> <span class="token keyword">var</span> regex2 <span class="token operator">=</span> <span class="token regex"><span class="token regex-delimiter">/</span><span class="token regex-source language-regex">"([A-Z0-9\s\.#-\/&]+),"</span><span class="token regex-delimiter">/</span><span class="token regex-flags">gm</span></span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> subst2 <span class="token operator">=</span> <span class="token string">"$1"</span><span class="token punctuation">;</span><br /> line <span class="token operator">=</span> line<span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span>regex2<span class="token punctuation">,</span> subst2<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> delimiter <span class="token operator">=</span> <span class="token string">','</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> quoteCharacter <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">;</span><br /> <span class="token keyword">try</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> lineObj <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">sn_impex<span class="token punctuation">.</span>CSVParser</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">parseLineToObject</span><span class="token punctuation">(</span>line<span class="token punctuation">,</span> headers<span class="token punctuation">,</span> delimiter<span class="token punctuation">,</span> quoteCharacter<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>lineObj<span class="token punctuation">.</span><span class="token constant">STABR</span> <span class="token operator">==</span> <span class="token string">"MN"</span> <span class="token operator">&&</span> lineObj<span class="token punctuation">.</span><span class="token constant">CITY</span> <span class="token operator">==</span> <span class="token string">"MINNEAPOLIS"</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> gs<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span><span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">stringify</span><span class="token punctuation">(</span>lineObj<span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">,</span> <span class="token string">' '</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token comment">/*do what you want here... like make a record or whatever*/</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>e<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /><br /> <span class="token punctuation">}</span><br /><br /> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span></code></pre>
<p>Here's what the output looks like;</p>
<!--EndFragment-->
<p><img src="https://jace.pro/static/img/ok-orlando-csv-parser.png" alt="" /></p>
<!--StartFragment-->
<p>Source: <a href="https://docs.servicenow.com/bundle/orlando-application-development/page/app-store/dev_portal/API_reference/CSVParserScoped/concept/CSVParserScopedAPI.html">https://docs.servicenow.com/bundle/orlando-application-development/page/app-store/dev_portal/API_reference/CSVParserScoped/concept/CSVParserScopedAPI.html</a></p>
<!--EndFragment-->Ok Orlando - Studio Git Outside Files2020-01-27T06:34:54Zhttps://jace.pro/post/2020-01-27-ok-orlando-studio-outside-files/Jace Benson<!--StartFragment-->
<h2><a href="https://jace.pro/post/2020-01-27-ok-orlando-studio-outside-files/#edit-source-control-integration-files-outside-of-studio">Edit source control integration files outside of Studio</a></h2>
<blockquote>
<p>Edit application files linked to a source control integration using an editor other than Studio. To ensure that the application files remain usable, the instance validates and sanitizes application files edited by other editing applications. Application files that fail XML schema validation either abort the current source control operation or are skipped. The instance generates an upgrade log entry for each sanitization action taken.</p>
</blockquote>
<p><a href="https://docs.servicenow.com/bundle/orlando-application-development/page/build/applications/concept/c_SourceControlIntegration.html">Edit source control integration files outside of Studio</a></p>
<p>This works great. You can see the file structure there. The now app path is defined by root file <code>sn_source_control.properties</code>.</p>
<p>I edited an application file on Github. That does work. There is some sanitation process (which I don't understand) allows for editing of application files out of ServiceNow.</p>
<!--EndFragment-->
<p><img src="https://jace.pro/static/img/ok-orlando-studio-git.png" alt="" /></p>
Ok Orlando: Serivce Portal Conversation widget2020-01-27T06:33:43Zhttps://jace.pro/post/2020-01-27-ok-orlando-sp-conversation-widget/Jace Benson<!--StartFragment-->
<p>This didn't make the release notes but the enter key used to do nothing. If you wanted to add line breaks to the comments to make a multi-line comment you had to customize the widget. Now you don't have to.</p>
<!--EndFragment-->
<p><img src="https://jace.pro/static/img/ok-orlando-serviceportal-conversation-widget.png" alt="" /></p>
Backing Out an Update Set From a Batch2020-01-14T06:33:10Zhttps://jace.pro/post/2020-01-14-backing-out-update-set-from-a-batch/Jace Benson<!--StartFragment-->
<p>Author's Note: I know backing out isn't the right term but it's how I think of it.</p>
<h2><a href="https://jace.pro/post/2020-01-14-backing-out-update-set-from-a-batch/#backing-out-update-sets-can-be-a-pain">Backing out update sets can be a pain.</a></h2>
<p>Here's the thing. Update Set Batches are <strong>amazing</strong>, until you have a problem.</p>
<p>One problem I've experienced with batching work in development is;<br />
Handling errors on update set batches.<br />
Sometimes this is due to a missing plugin or some other update set that needs to wait. How do you correct this? With help from @paige and @ajb I will answer this;</p>
<p>Quotes;</p>
<blockquote>
<p>... delete the previewed update sets (all of them, including parent). Remove it from the parent in the source instance and bring it all back over. - @paige</p>
<p>... un-parent it, or as Paige said - delete the whole thing - and re-parent in development - @ajb</p>
</blockquote>
<p>When I've done the delete way in the past I've had issues and now reading through these comments I can guess why. You need to ensure you "... have to ensure you get ALL the update sets." as @paige said. I suspect I didn't get all the update sets.</p>
<p>Going forward now that I've had success doing this are these steps;</p>
<ol>
<li>Delete the Target Instance Update Sets, & Batch Update set</li>
<li>Un-parent in source</li>
<li>Re-import</li>
</ol>
<p>Can issues still arise? Sure, keep this in mind;</p>
<p>So update sets can fail two ways in regards to batching;</p>
<ul>
<li>An update set completed can be pulled before it's associated with a batch. If you want that to be included in the batch it needs to be removed from the target instance.</li>
<li>An update set was included but before applying it you want to exclude it. To do this, delete batch's related update sets, then the parent(batch) update set. Change the source update set batch and re-import.</li>
</ul>
<!--EndFragment-->Step Away From Emails2020-01-09T06:05:06Zhttps://jace.pro/post/2020-01-09-step-away-from-emails-guide/Jace Benson<!--StartFragment-->
<p>I started making notes on this a long time ago. I'm going to update this as needed but this is what I have so far.</p>
<p>Email is an amazing system, however, it is also easy to lose so much work there. ServiceNow wants you to make work you do from email into structured data that can easily worked.</p>
<p>That's great Jace, but where's the steps. What do I do?</p>
<h1><a href="https://jace.pro/post/2020-01-09-step-away-from-emails-guide/#the-guide">The guide</a></h1>
<p>This is all theory for me as I have not implemented this.</p>
<h2><a href="https://jace.pro/post/2020-01-09-step-away-from-emails-guide/#step-1">Step 1</a></h2>
<p>Identify what <strong>is going to be allowed now</strong> to create work.</p>
<p>Go over you're current Inbound Actions and make a list of inbound emails you intend to still process immediately, initially I'd guess that is just the "Update Approval Request" inbound action.</p>
<p>The rest of them, ensure they set "Contact Source" to email for inserts.</p>
<h2><a href="https://jace.pro/post/2020-01-09-step-away-from-emails-guide/#step-2">Step 2</a></h2>
<p>Identify what outbound Notifications can be disabled right now.<br />
The less you email people, the less they have to respond to.<br />
You have many notifications that are not actionable.<br />
Anything that the user receiving the message is only informational should be disabled.</p>
<p>Disable any notification that is strictly informational.</p>
<p>Examples;</p>
<ul>
<li>Item Requested</li>
<li>Incident Created</li>
<li>Something was approved</li>
</ul>
<h2><a href="https://jace.pro/post/2020-01-09-step-away-from-emails-guide/#step-3">Step 3</a></h2>
<p>Now it will get hard.<br />
Change processes on how people find work.<br />
Instead of going to their mailbox, they will need to go to their assignments.</p>
<p>I'd recommend doing this all at once.</p>
<h1><a href="https://jace.pro/post/2020-01-09-step-away-from-emails-guide/#notes">Notes</a></h1>
<p>TL; DR Record Producers created specific to your most commonly reported incidents that gather the data needed to resolve those incidents (including optional data based on answers in the RP) can greatly reduce your TTR and cause overall greater customer satisfaction despite the bigger hurdle to incident submission.<br />
careful pushing of folks to these Structured Record Producers can be handled in many ways, including closing incidents submitted improperly and pointing them to the new RP</p>
<p>Emails & SP:<br />
Emails created entries cost more, introduce delay for most interactions, initial send is quicker for user to send, slower to help them in general case<br />
Structured data and clear services via SP are a large difference - cuts down on back and forth, aids in automation, helps routing and fulfillment expectations, transparency and prioritization. Better expectations and up front data collection leads to happier users quickly.</p>
<blockquote>
<p>Phased Approach is recommended Show incentive to go to no inbound email with Time to resolved Time to resolved is lessened by less categorizing, less back and forth to/from the customer.</p>
<p>Some organizations saw a 25%-75% better resolution time after disallowing email.</p>
<p>Ensure you offer specific services that handle most the calls to allow the faster resolution.</p>
</blockquote>
<!--EndFragment-->Quick Guide: Orlando2020-01-06T06:00:51Zhttps://jace.pro/post/2020-01-06-orlando/Jace Benson<!--StartFragment-->
<p>Here's my take of what's new with Orlando. To me this seems like the release of "The Workspace". Sure there are other updates but unless you subscribe to those specific SKUs, you won't see meaningful updates for your customers. The improvements to me seem to be mostly on the workspaces.</p>
<h2>Deprecated things</h2>
<ul>
<li>Service Desk Call plugin now requires subscription (didn't before)</li>
<li>Discovery - Help the help desk plugin no longer available</li>
<li>Enterprise Release Management plugin no longer available</li>
<li>Facilities Service Management plugin no longer available</li>
</ul>
<h2>Updated things</h2>
<ul>
<li>Agent Workspace: CMDB</li>
<li>Agent Workspace: Form annotation supported</li>
<li>Agent Workspace: Field Styles not supported</li>
<li>Agent Workspace: Faster list loading by not showing count of all rows</li>
<li>Agent Workspace: Variable editor in Agent Workspace inline</li>
<li>ATF: Quick Start Tests for many things</li>
<li>ATF: Copy automated test suite, copies all nested tests</li>
<li>ATF: Emails can now be tested</li>
<li>ATF: Workspaces can now be tested</li>
<li>VTB: Compact cards, now more compact (thinner columns)</li>
<li>VTB: Can show attachment preview on board</li>
<li>Flow Designer: Service Catalog - Plugin now active by default</li>
<li>Virtual Agent: Loads of updates</li>
<li>Mobile Platform: Loads of updates</li>
<li>Customer Service Management: Loads of updates</li>
<li>Field Service Management: Loads of updates</li>
<li>Human Resources Service Delivery: Loads of updates</li>
<li>Project Portfolio Management: Loads of updates</li>
<li>Mid Servers require JRE 1.8.0_161 or greater</li>
<li>Mid Servers for discovery require Powershell 5.1 (was 3.0)</li>
<li>Mid Servers no longer need an admin account, just read/write to the /agent folder</li>
<li>MID Servers now support Microsoft JEA authentication in order to run basic Discovery.</li>
</ul>
<h2>New things</h2>
<ul>
<li>Now Components available for development see NDS</li>
<li>Studio: Edit source control files outside of ServiceNow</li>
<li>Studio: Can use Mid connect to source control</li>
<li>Studio: Set the GIT repository default branch</li>
<li>System Clone: Presever Update Sets - no longer need to export/import from target instance</li>
<li>Service Portal: Widget Diagnostics</li>
<li>Import and Export: REST (IntegrationHub) type data source</li>
<li>Import and Export: Custom (Load by Script) type data source</li>
<li>Import and Export: Robust Import Set Transformers</li>
<li>Import and Export: Custom (Parse by Script) format</li>
<li>Import and Export: CSV line parser</li>
<li>Import and Export: Scoped scriptable Import Set APIs</li>
<li>Investment Funding - This sounds new</li>
<li>Discovery: ServiceNow Certificate Inventory and Management application</li>
<li>Dynamic Translation - Translates stuff on the fly</li>
</ul>
<h2>Further Reading</h2>
<ul>
<li><a href="http://andrew.alburydor.com/blog/2020/01/06/orlandofeatures/">Andrew Albury's blog post</a></li>
</ul>
<!--EndFragment-->
<h2>Comments</h2>
<!--StartFragment-->
<blockquote>
<p><strong><a href="https://github.com/macmorning">macmorning</a></strong> commented <a href="https://github.com/jacebenson/jace.pro/issues/164#issuecomment-579846342">on Jan 29, 2020</a></p>
<p>Thanks Jace.<br />
I can still see no way to create or edit the new UX components (like ribbons).<br />
Frustrating</p>
</blockquote>
<blockquote>
<p><strong><a href="https://github.com/jacebenson">jacebenson</a></strong> commented <a href="https://github.com/jacebenson/jace.pro/issues/164#issuecomment-579848339">on Jan 29, 2020</a></p>
<p>I've heard that is coming out with General Availability. See <a href="https://docs.servicenow.com/bundle/orlando-servicenow-platform/page/administer/workspace/concept/record-view.html#d1269810e56">https://docs.servicenow.com/bundle/orlando-servicenow-platform/page/administer/workspace/concept/record-view.html#d1269810e56</a></p>
</blockquote>
<blockquote>
<p><strong><a href="https://github.com/macmorning">macmorning</a></strong> commented <a href="https://github.com/jacebenson/jace.pro/issues/164#issuecomment-579865071">on Jan 29, 2020</a></p>
<p>You just warmed my heart. The documentation stays vague though, giving hints about "adding custom components" but not actually giving details about it.<br />
This page reads "Register your Now component with Tectonic" =><br />
<a href="https://docs.servicenow.com/bundle/orlando-servicenow-platform/page/administer/workspace/task/set-up-ui-action-render-custom-component.html">https://docs.servicenow.com/bundle/orlando-servicenow-platform/page/administer/workspace/task/set-up-ui-action-render-custom-component.html</a><br />
Mood shifted from frustrated to excited. Thanks</p>
</blockquote>
<blockquote>
<p><strong><a href="https://github.com/jacebenson">jacebenson</a></strong> commented <a href="https://github.com/jacebenson/jace.pro/issues/164#issuecomment-579902897">on Jan 29, 2020</a></p>
<p>I'm excited about it.</p>
</blockquote>
<!--EndFragment-->Browser Extensions for ServiceNow2019-12-02T05:14:36Zhttps://jace.pro/post/2019-11-30-browser-extensions-review/Jace Benson<!--StartFragment-->
<p>This post is brought to you because of Kevin. Thanks Kevin!</p>
<!--EndFragment-->
<!--StartFragment-->
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Just read your great code search blog post <a href="https://twitter.com/jacebenson?ref_src=twsrc%5Etfw">@jacebenson</a>... you probably already know about this, but the an-Utils browser extension has an “install-less” code search feature in beta. <a href="https://t.co/qXXadNxpDz">https://t.co/qXXadNxpDz</a></p>— 🍹🍸Kev 🍸🍹 (@milligna) <a href="https://twitter.com/milligna/status/1200668500597055489?ref_src=twsrc%5Etfw">November 30, 2019</a></blockquote> <script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<!--EndFragment-->
<!--StartFragment-->
<p>Browser extensions are scary in my opinion when it comes to work. Some workplaces have rules (not really enforceable) where you are allowed to only download extensions used by hundreds of thousands of users.</p>
<p>There are <a href="https://www.kaspersky.com/blog/browser-extensions-security/20886/">legitimate</a> <a href="https://www.digitaltrends.com/news/popular-browser-extensions-are-selling-your-data/">reasons</a> <a href="https://www.washingtonpost.com/technology/2019/07/18/i-found-your-data-its-sale/">for</a> <a href="https://www.howtogeek.com/188346/why-browser-extensions-can-be-dangerous-and-how-to-protect-yourself/">this</a>.</p>
<p>Now that I have that out of the way, let's talk about the extensions for Firefox and Chrome to help work in ServiceNow.</p>
<table>
<thead>
<tr>
<th>Extension</th>
<th>Firefox</th>
<th>Chrome</th>
<th>Github</th>
<th>Author</th>
</tr>
</thead>
<tbody>
<tr>
<td>SN Utils</td>
<td>Yes<a href="https://addons.mozilla.org/en-US/firefox/addon/servicenow-utils2/">1</a></td>
<td>Yes<a href="https://chrome.google.com/webstore/detail/sn-utils-tools-for-servic/jgaodbdddndbaijmcljdbglhpdhnjobg">2</a></td>
<td>Yes<a href="https://github.com/arnoudkooi/ServiceNow-Utils">3</a></td>
<td>Arnoud Kooi</td>
</tr>
<tr>
<td>SN Toolbelt</td>
<td>Yes<a href="https://addons.mozilla.org/en-US/firefox/addon/snow-tool-belt">4</a></td>
<td>Yes<a href="https://chrome.google.com/webstore/detail/servicenow-tool-belt/jflcifhpkilfaomlnikfaaccmpidkmln">5</a></td>
<td>Yes<a href="https://github.com/macmorning/snowtools-webext">6</a></td>
<td>Mac Morning</td>
</tr>
<tr>
<td>SwissNow</td>
<td>No</td>
<td>Yes<a href="https://chrome.google.com/webstore/detail/swissnow-servicenow-toolb/jneeammdkdmlfgidcacmjmbijdmkdbjm">7</a></td>
<td>No</td>
<td>Łukasz Krzaczkowski</td>
</tr>
</tbody>
</table>
<h2><a href="https://jace.pro/post/2019-11-30-browser-extensions-review/#features-were-comparing">Features we're comparing</a></h2>
<p>There extensions have a <strong>lot</strong> of features so I'll be comparing all of them I can find;</p>
<p>Legend;<br />
✅ = Yes<br />
❌ = No</p>
<table>
<thead>
<tr>
<th>Feature</th>
<th>SN Toolbelt</th>
<th>SN Utils</th>
<th>SwissNow</th>
</tr>
</thead>
<tbody>
<tr>
<td>Chrome</td>
<td>✅</td>
<td>✅</td>
<td>✅</td>
</tr>
<tr>
<td>FireFox</td>
<td>✅</td>
<td>✅</td>
<td>❌</td>
</tr>
<tr>
<td>Open Source</td>
<td>✅</td>
<td>✅</td>
<td>❌</td>
</tr>
<tr>
<td>Tabs customizations</td>
<td>✅</td>
<td>❌</td>
<td>❌</td>
</tr>
<tr>
<td>Docs and API searches</td>
<td>✅</td>
<td>✅</td>
<td>❌</td>
</tr>
<tr>
<td>Node Switching</td>
<td>✅</td>
<td>✅</td>
<td>✅</td>
</tr>
<tr>
<td>Links to many instances</td>
<td>✅</td>
<td>Configurable</td>
<td>✅</td>
</tr>
<tr>
<td>Export Settings</td>
<td>✅</td>
<td>❌</td>
<td>❌</td>
</tr>
<tr>
<td>Slash commands</td>
<td>❌</td>
<td>✅</td>
<td>❌</td>
</tr>
<tr>
<td>Edit scripts in VS Code</td>
<td>❌</td>
<td>✅</td>
<td>❌</td>
</tr>
<tr>
<td>Edit widgets in VS Code</td>
<td>❌</td>
<td>✅</td>
<td>❌</td>
</tr>
<tr>
<td>Show technical names</td>
<td>❌</td>
<td>✅</td>
<td>❌</td>
</tr>
<tr>
<td>Update set search</td>
<td>❌</td>
<td>✅</td>
<td>❌</td>
</tr>
<tr>
<td>Updates List</td>
<td>❌</td>
<td>✅</td>
<td>❌</td>
</tr>
<tr>
<td>Search tables</td>
<td>❌</td>
<td>✅</td>
<td>❌</td>
</tr>
<tr>
<td>View Data</td>
<td>❌</td>
<td>✅</td>
<td>❌</td>
</tr>
<tr>
<td>Search User by Id</td>
<td>❌</td>
<td>✅</td>
<td>❌</td>
</tr>
<tr>
<td>Code Templates</td>
<td>❌</td>
<td>✅</td>
<td>❌</td>
</tr>
<tr>
<td>CTRL-S / CMD-S</td>
<td>❌</td>
<td>✅</td>
<td>❌</td>
</tr>
<tr>
<td>CTRL-V / CMD-V</td>
<td>❌</td>
<td>✅</td>
<td>❌</td>
</tr>
<tr>
<td>Compare Records</td>
<td>❌</td>
<td>❌</td>
<td>✅</td>
</tr>
</tbody>
</table>
<h2>SN Utils</h2>
<p>Unfortunately I've never looked at this extension in depth until I started writing this post. With that being said, holy cow.</p>
<p>Arnoud, good job.</p>
<p><s>Some of the things I don't think should be in the extension but others, man I wish they were part of the platform.</s></p>
<p>I think the CTRL-S / CMD-S and CTRL-V / CMD-V should be something Servicenow Proper should add to the platform making them unneeded.</p>
<p>After comments added to this post it's clear to see slash commands can add any search including docs/api stuff. So I changed that to Sort of as they need to be configured.</p>
<h2>SN Tool belt</h2>
<p>I've been a fan of this repository for years now. It isn't the biggest project but was the only one I found to be open source when I first looked.</p>
<p>With that being said, it's all about giving you links to quickly jump around instances. I assume we all do that because I do that.</p>
<h2>SwissNow</h2>
<p>This is the only other extension I could find was this one.</p>
<p><a href="https://servicenowgems.com/2017/09/11/swissnow-chrome-extension/">https://servicenowgems.com/2017/09/11/swissnow-chrome-extension/</a></p>
<p>This one is also about jumping around instances and as such has some nice links around them including a very handy compare function, however, I can't find the source. So I downloaded the <code>.crx</code> file and unzipped it. Looked around at the code for any odd calls but I didn't find any. So thats great.</p>
<h1>Change Log</h1>
<table>
<thead>
<tr>
<th>Date</th>
<th>Action</th>
</tr>
</thead>
<tbody>
<tr>
<td>2019-12-01</td>
<td>Changed SN Utils - Docs and API searches to yes (via <code>/dev searchterm</code>) was no.</td>
</tr>
<tr>
<td>2019-12-01</td>
<td>Changed SN Utils - Links to many instances to configurable was no.</td>
</tr>
</tbody>
</table>
<!--EndFragment-->
<h2>Comments</h2>
<blockquote>
<!--StartFragment-->
<p><strong><a href="https://github.com/arnoudkooi">arnoudkooi</a></strong> commented <a href="https://github.com/jacebenson/jace.pro/issues/145#issuecomment-560152659">on Dec 1, 2019</a></p>
<p>Great article Jace!</p>
<p>In SNU some of the features are accessible via slashcommands, like:<br />
<code>/docs <query></code> or <code>/dev <query></code> for docs and api search.<br />
You (or I) can add a own search source like :<br />
<code>jace;https://sn.jace.pro/docs/?q=$0 Search Jace's documentation</code></p>
<p>Via <code>/env acmedev</code> you can open current page in instance acmedev.<br />
(I need to look at the nested function, creating a slashcommand <code>/acmedev</code> doesn't work now)</p>
<p>Most of the features are explained in the <a href="https://developer.servicenow.com/app.do#!/event/knowledge19/CCW0844">K19 labguide</a> or the newer in my <a href="https://twitter.com/sn_utils">Tweets</a><br />
And of course the <a href="https://www.youtube.com/channel/UCtr-9_HAEAPmcDRQSyKNzxg">videos</a>!</p>
<p>Regarding the risks of Extension, always good to be aware of this and make your own assessment. I'm keeping the permissions as tight as possible, resulting in rather low <a href="https://crxcavator.io/report/jgaodbdddndbaijmcljdbglhpdhnjobg/3.5.8.0/">score</a> at <a href="https://crxcavator.io/">crxcavator</a>.<br />
The permissions I do ask are explained in the <a href="https://github.com/arnoudkooi/ServiceNow-Utils/blob/master/PRIVACY.md">Privacy Disclaimer</a></p>
<!--EndFragment-->
</blockquote>
<blockquote>
<!--StartFragment-->
<p><strong><a href="https://github.com/jacebenson">jacebenson</a></strong> commented <a href="https://github.com/jacebenson/jace.pro/issues/145#issuecomment-560163606">on Dec 1, 2019</a></p>
<p>Seems great, looking into this now makes me wish I did it more earlier.</p>
<!--EndFragment-->
</blockquote>
<blockquote>
<!--StartFragment-->
<!--StartFragment-->
<p><strong><a href="https://github.com/macmorning">macmorning</a></strong> commented <a href="https://github.com/jacebenson/jace.pro/issues/145#issuecomment-579850847">on Jan 29, 2020</a></p>
<!--EndFragment-->
<p>Hey Jace, thanks for the shout out.<br />
As you can guess, with the Toolbelt extension I'm not trying to compete with Arnoud & team (tremendous work there!). It's mostly a navigation helper. I'm adding small features when I get the idea and the time, limiting them to what is doable without script injection, external framework nor update sets because we should avoid doing this on our clients [live] environments.<br />
Anyhow, the project is on github and sndevs are most welcome to contribute with ideas, defects, and pull requests.</p>
<!--EndFragment--></blockquote>
List Collectors Are the Pits2019-12-01T05:09:25Zhttps://jace.pro/post/2019-11-30-list-collectors-are-the-pits/Jace Benson<p>List collectors try so very hard to be helpful.</p>
<p><img src="https://jace.pro/static/img/list-collector-ui-16.png" alt="" /></p>
<p>I have used them, but I don't like them and here's why;</p>
<ul>
<li>
<p>Impossible to report on</p>
</li>
<li>
<p>SP display of extra columns is... not helpful (see screenshot)</p>
<p><img src="https://jace.pro/static/img/list-collector-sp.png" alt="" /></p>
</li>
<li>
<p>Display values are tied to the table, not the instance of the variable</p>
</li>
<li>
<p>Generally complex logic is required to handle if you ever automate around them</p>
</li>
<li>
<p>They are moot with "add to cart"</p>
</li>
<li>
<p>In SP it's not clear what columns are when you add them via <code>ref_ac_columns</code><a href="https://hi.service-now.com/kb_view.do?sysparm_article=KB0696884">1</a></p>
</li>
<li>
<p>They were not made mobile friendly, so now they have a very different look/feel in SP<a href="https://hi.service-now.com/kb_view.do?sysparm_article=KB0635149">2</a></p>
</li>
<li>
<p><s>You have to have a table made for it's purpose which is overkill</s> Covestic posted a workaround</p>
</li>
</ul>
<p>The list isn't that long, but it merits a conversation about <strong>what</strong> you're trying to collect.</p>
<p>Before London, there was no good out of box alternative. With London we got the Multi-Row Variable Sets, and sure they also have their flaws, they are not as bad as List collectors.</p>
<p>In my past the most common use for List collectors is to grant access or to modify a number of things in different ways. The problem with that is, you can't specify after you've selected all the things what you want to do <strong>individually</strong>. So in practice, it would be a User Access form. You pick the users you want to change access for, but then you are only allowed to add one role, or group.</p>
<h2>Covestic's workaround</h2>
<p>This is a great way to do the options without a whole table.. but then someone still has to manage these options.<a href="https://www.covestic.com/servicenow-tips-making-list-collectors-useful/">3</a></p>
<ol>
<li>On your catalog item, create a new multiple choice or select box variable (either will work, we are after the "Choices" related list here), give it a name and some question text and then submit.</li>
<li>Add any choices your variable needs.</li>
<li>Switch the variable type over to a list collector. You will notice that we cannot save until we give ServiceNow a table to reference so pick Question Choice [<code>question_choice</code>]</li>
<li>Add a reference qualifier of "question=XXXX" where XXXX is the question’s sys_id.</li>
<li>(Optional) You may want to deactivate the "Question Choice Related List" client script or modify the if statement in the script to be if (newValue == "3" || newValue == "5" || newValue == "21") to show the Question Choice related list on list collector variables.</li>
<li>You now have a list collector variable without having to create a whole new table.</li>
<li>(Optional) You can now think about adding variable attributes such as <code>no_filter</code> or <code>glide_list</code> to alter the variable’s appearance on the form.</li>
</ol>
<!--EndFragment-->
<h2>Comments</h2>
<blockquote>
<!--StartFragment-->
<p><strong><a href="https://github.com/CheriEmm">CheriEmm</a></strong> commented <a href="https://github.com/jacebenson/jace.pro/issues/157#issuecomment-570314215">on Jan 2, 2020</a></p>
<!--EndFragment-->
<!--StartFragment-->
<p>Only admins can see question_choice so this is useless for your end users. You could create an ACL but would have to think on the reason question_choice is only available to admin, etc.</p>
<!--EndFragment-->
</blockquote>
<blockquote>
<!--StartFragment-->
<p><strong><a href="https://github.com/jacebenson">jacebenson</a></strong> commented <a href="https://github.com/jacebenson/jace.pro/issues/157#issuecomment-570446546">on Jan 2, 2020</a></p>
<!--EndFragment--><!--StartFragment-->
<p>It is a workaround. It does make them a little better.</p>
<!--EndFragment--></blockquote>
Access Control Lists (ACLs) VS Query Business Rules (QBR)2019-12-01T05:05:51Zhttps://jace.pro/post/2019-11-30-qbr-vs-acl/Jace Benson<!--StartFragment-->
<p>This is an issue as old as the "<a href="https://docs.servicenow.com/bundle/geneva-servicenow-platform/page/administer/security/task/t_ActivateHighSecuritySettings.html">HI security plugin</a>". Before that, I'm not sure how ServiceNow secured their tables as it was before my time.</p>
<p>I've been asked in the past to remove the message "n records removed by security..." and it <strong>can</strong> be done, but <strong>shouldn't</strong>.</p>
<p>Here's my take on it.</p>
<p>Access Control Lists (aka ACLs) are there for two reasons;</p>
<ul>
<li>maintainability</li>
<li>second is field level control</li>
</ul>
<p>You could replace every tables Access Control Lists with Query Business Rules. That is not the normal place security is generally configured.</p>
<p>Here's some very insightful quotes from people I respect on the topic and links to the resources;</p>
<p>gflewis asked in 2011</p>
<blockquote>
<p>What are the pros and cons of using an Access Control verses a Before Query Business Rule to block certain users from reading certain records? As far as I can tell, the functionality appears to be identical.</p>
</blockquote>
<p>CapaJC responded in 2011</p>
<blockquote>
<p>Before query is highly preferable if you can use one. It makes the database do the work by modify the query itself. With Contextual Security, your instance has to decide per record what a user can see after fetching them from the database.</p>
<p>With a before query rule, unavailable records are simply not there as far as the user is concerned. With Contextual Security they might get a list of 4 visible records, and the list might say 1 to 100 of 546 with a message at the bottom saying "96 records removed due to security constraints".<a href="https://community.servicenow.com/community?id=community_question&sys_id=11a68365db1cdbc01dcaf3231f961976">1</a></p>
</blockquote>
<p>More recently Tim W. wrote in 2018</p>
<blockquote>
<p>ACLs Vs Query Business Rules: <strong>ACLs</strong>, but also sometimes query business rules; but usually for performance reasons more than security.<a href="https://snprotips.com/blog/2018/9/18/broken-queries-and-query-rules">2</a></p>
</blockquote>
<p>Further Reading;</p>
<ul>
<li>1 - [<a href="https://community.servicenow.com/community?id=community_question&sys_id=11a68365db1cdbc01dcaf3231f961976">https://community.servicenow.com/community?id=community_question&sys_id=11a68365db1cdbc01dcaf3231f961976</a>](Community Post from 2011)</li>
<li>2 - [<a href="https://snprotips.com/blog/2018/9/18/broken-queries-and-query-rules">https://snprotips.com/blog/2018/9/18/broken-queries-and-query-rules</a>](Tim W's Post from 2018)</li>
<li><a href="https://www.servicenowguru.com/scripting/business-rules-scripting/controlling-record-access-before-query-business-rules/">https://www.servicenowguru.com/scripting/business-rules-scripting/controlling-record-access-before-query-business-rules/</a></li>
<li><a href="https://www.servicenowguru.com/showcase/servicenow-security-tips/">https://www.servicenowguru.com/showcase/servicenow-security-tips/</a> <code>#4</code></li>
</ul>
<!--EndFragment-->
<p>Comments;</p>
<blockquote>
<p><a href="https://github.com/jgr1ffin">@jgr1ffin</a> commented on Dec 3, 2019</p>
<p>One other thing worth nothing between the two is that QBR's can't perform top-level OR queries (^NQ).</p>
</blockquote>
<blockquote>
<p><strong><a href="https://github.com/jacebenson">jacebenson</a></strong> commented <a href="https://github.com/jacebenson/jace.pro/issues/146#issuecomment-561228947">on Dec 3, 2019</a></p>
<p><a href="https://github.com/jgr1ffin">@jgr1ffin</a> that is something I did not know. Thank you for sharing!</p>
</blockquote>
<blockquote>
<p><strong><a href="https://github.com/mikebski">mikebski</a></strong> commented <a href="https://github.com/jacebenson/jace.pro/issues/146#issuecomment-627403921">on May 12, 2020</a></p>
<p>Also if you have lots of records you are filtering with ACLs you end up with empty pages in the UI - For example, I have 500 records and the user only has perms to see 5. If I use ACL for view they see 500 records worth of pages in the UI - in this case a BR is a must.</p>
</blockquote>
<blockquote>
<p><strong><a href="https://github.com/jared-laethem">jared-laethem</a></strong> commented <a href="https://github.com/jacebenson/jace.pro/issues/146#issuecomment-633167407">on May 23, 2020</a></p>
<p>Another difference is that ACL's can specify scripted conditions that may not be able to be expressed as a query. Prior to the introduction of contextual security (sys_security_acl), security was specified on dictionary records.</p>
</blockquote>
Custom Table Guide: What is this?!2019-11-27T05:00:06Zhttps://jace.pro/post/2019-11-26-custom-table-guide-what/Jace Benson<!--StartFragment-->
<p>The other day I was looking at the <a href="https://nowlearning.service-now.com/lxp?id=overview&sys_id=a2cad4fcdb9e7300760a71043996193e&type=course">licensing training</a> and thinking about the <a href="https://www.servicenow.com/content/dam/servicenow-assets/public/en-us/doc-type/legal/custom-table-guide.pdf">custom table guide</a>.<br />
To me it's very bizarre why these are the tables selected so in this post I want to talk through each of them.<br />
If you have any thoughts to the reasoning I'd love to have some back and forth on it. Here's my thoughts so far.</p>
<table>
<thead>
<tr>
<th>Table</th>
<th>Label</th>
<th>Reason</th>
<th>Extensible OOTB</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>cmdb_*</code></td>
<td>Configuration Items</td>
<td>Design Choice - has a Class field and it's in use</td>
<td>Many No</td>
</tr>
<tr>
<td><code>cmn_location</code></td>
<td>Location</td>
<td>See notes below</td>
<td>No</td>
</tr>
<tr>
<td><code>cmn_schedule_condition</code> <strong>new</strong></td>
<td></td>
<td></td>
<td>Yes</td>
</tr>
<tr>
<td><code>dl_definition</code></td>
<td>Data Lookup Definition</td>
<td>Design Choice - has a Class field and it's not used</td>
<td>Yes</td>
</tr>
<tr>
<td><code>dl_matcher</code></td>
<td>Data Lookup Matcher Rules</td>
<td>Design Choice - has a Class field and it's in use</td>
<td>Yes</td>
</tr>
<tr>
<td><code>kb_knowlege</code></td>
<td>Knowledge</td>
<td></td>
<td>No</td>
</tr>
<tr>
<td><code>sc_cat_item_delivery_task</code></td>
<td>Exection Plan Task []</td>
<td>Design Choice - has a Class field and it's in use</td>
<td>Yes</td>
</tr>
<tr>
<td><code>scheduled_data_import</code> <strong>new</strong></td>
<td></td>
<td></td>
<td>Yes</td>
</tr>
<tr>
<td><code>sf_state_flow</code></td>
<td>State Flow</td>
<td>Design Choice - has a Class field and it's not used</td>
<td>Yes</td>
</tr>
<tr>
<td><code>sys_auth_profile</code></td>
<td>Authentication Profile</td>
<td>Design Choice - has a Class field and it's not used</td>
<td>Yes</td>
</tr>
<tr>
<td><code>sys_choice</code></td>
<td>Choice</td>
<td>I cannot find a reason this is included</td>
<td>No</td>
</tr>
<tr>
<td><code>sys_dictionary</code></td>
<td>Dictionary</td>
<td>Design Choice - has a Class field and it's in use</td>
<td>Yes</td>
</tr>
<tr>
<td><code>sys_filter</code></td>
<td>Filter</td>
<td>Design Choice - has a Class field and it's in use</td>
<td>Yes</td>
</tr>
<tr>
<td><code>sys_hub_action_type_base</code></td>
<td>Action Type Base</td>
<td>Design Choice - has a Class field and it's in use</td>
<td>Yes</td>
</tr>
<tr>
<td><code>sys_import_set_row</code></td>
<td>Import Set Row</td>
<td>Design Choice - has a Class field and it's in use</td>
<td>Yes</td>
</tr>
<tr>
<td><code>sys_portal_page</code></td>
<td>Portal Page</td>
<td>Design Choice - has a Class field and it's not used</td>
<td>No</td>
</tr>
<tr>
<td><code>sys_report_import_table_parent</code></td>
<td>Report Import Table</td>
<td>What does this table even do?</td>
<td>No</td>
</tr>
<tr>
<td><code>sys_transform_map</code></td>
<td>Transform Map</td>
<td>I cannot find a reason this is included</td>
<td>No</td>
</tr>
<tr>
<td><code>sys_transform_script</code></td>
<td>Transform Map Script</td>
<td>I cannot find a reason this is included</td>
<td>No</td>
</tr>
<tr>
<td><code>sys_user_preference</code></td>
<td>User Preference</td>
<td>I cannot find a reason this is included</td>
<td>No</td>
</tr>
<tr>
<td><code>sysauto</code></td>
<td>Scheduled Job</td>
<td>Design Choice - has a Class field and it's in use</td>
<td>Yes</td>
</tr>
<tr>
<td><code>syslog</code></td>
<td>System Log</td>
<td>I cannot find a reason this is included</td>
<td>Yes</td>
</tr>
</tbody>
</table>
<h2>My thoughts on extending tables</h2>
<p>I can categorize my opinions about when and why to extend a table into three reasons.</p>
<p>Edit: At the time I wrote this, there were two things I had not considered. One. Extending tables is really complicated.</p>
<table>
<thead>
<tr>
<th>Pros</th>
<th>Cons</th>
</tr>
</thead>
<tbody>
<tr>
<td>You get all the fields from the parent</td>
<td>You get all the fields from the parent</td>
</tr>
<tr>
<td></td>
<td>You could add fields that may hit the limit of the technical length in SQL</td>
</tr>
<tr>
<td></td>
<td>Reporting on it can be difficult</td>
</tr>
<tr>
<td></td>
<td>If you need two records with the same unique value in the two tables, the system will not allow this</td>
</tr>
<tr>
<td></td>
<td>To extend some of these tables is uncharted waters and may not work well see <a href="https://support.servicenow.com/kb?id=kb_article_view&sysparm_article=KB0538947">sys_choice</a></td>
</tr>
</tbody>
</table>
<h3>Usability</h3>
<p>Assuming you have a table in mind;<br />
Does it make sense to have/modify a "type" or "class" field and have one the table?<br />
Also, does the new type inherently change the the record that it is very different?</p>
<p>If yes to both, extend, if not make new.</p>
<h3>Scoped Access</h3>
<p>Sometimes you cannot create or read records that you might want to use in a scoped app, see <code>sys_user_group</code>.<br />
In this case it may make sense to extend that table if you want to create/modify those records. This is a<br />
technical reason, and I feel they likely should not be extended still but must be.</p>
<h3>Design Choice</h3>
<p>Generally, something will automatically extend a table, like Import Set Row.<br />
Anytime you upload a new file as a data source that is extended.</p>
<p>This is done by adding a class field to indicate the class of record.<br />
Some records with this only ever have one class, like <code>sys_auth_profile</code>.<br />
Some have many like <code>cmdb_ci</code>, <code>sys_user</code>, and <code>task</code>.</p>
<h2>Configuration items</h2>
<p>Sometimes you gotta extend this to track things your work considers as a CI but ServiceNow has not. E.g. Rooms</p>
<p>In the example of Rooms, out-of-box there is a "Computer Room" CI class, but you may want to track conference rooms,<br />
data closets, supply rooms, etc. In these cases in my opinion extending cmdb_ci makes sense.</p>
<h2>Knowledge</h2>
<p>Knowledge is an interesting table to have here.<br />
On one hand you could argue some Knowledge articles should be typed/classd differently.<br />
I believe Knowledge already has this.</p>
<!--EndFragment-->
<!--StartFragment-->
<blockquote class="twitter-tweet"><p lang="en" dir="ltr"><a href="https://twitter.com/hashtag/ServiceNowDev?src=hash&ref_src=twsrc%5Etfw">#ServiceNowDev</a> <a href="https://twitter.com/hashtag/blog?src=hash&ref_src=twsrc%5Etfw">#blog</a> What is with the Custom Table Guide <a href="https://t.co/b2Gecq8WOW">https://t.co/b2Gecq8WOW</a></p>— Jace Benson 👨💻⚙️ (@jacebenson) <a href="https://twitter.com/jacebenson/status/1199780073559203842?ref_src=twsrc%5Etfw">November 27, 2019</a></blockquote> <script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<!--EndFragment-->
<!--StartFragment-->
<p>Further Reading: <a href="https://docs.servicenow.com/bundle/newyork-servicenow-platform/page/product/knowledge-management/concept/knowledge-article-templates.html">https://docs.servicenow.com/bundle/newyork-servicenow-platform/page/product/knowledge-management/concept/knowledge-article-templates.html</a></p>
<h2>Location</h2>
<p>Location is an odd table to me to have on this list.</p>
<p>I'm trying to imagine a situation where you might have different location types, e.g. Offices, Kiosks, and Datacenters</p>
<p>In these cases I can't imagine a situation you would need this extended. Now scoped apps cannot write to some common tables,<br />
if that is the reason this is here that may make sense. If a scoped app needs a place to write to that is like location, but different<br />
extend it and write to the extension. If that is the case though then I'd expect the same for Group Memberships</p>
<blockquote>
<p>With all that being said, on initial look of the table, it does not sport a <code>sys_class_name</code> field.<br />
However it also has "Extensible" as <code>false</code>.<br />
If you change "Extensible" to <code>true</code>, then BOOM, now there's a <code>sys_class_name</code> field.<br />
I'm still not sure I agree with the all the ideas of this.<br />
That being said it seems like a <strong>Design Descision</strong> now. - Jace 2019-12-16</p>
</blockquote>
<h2>Import Set Row</h2>
<p>This is extended for each data source you upload, so I feel this is understandable.</p>
<h2>Transform Map Script</h2>
<p>I don't think this makes any sense. I can't imagine why this would be extended.</p>
<h2>Transform Map</h2>
<p>I don't think this makes any sense. I can't imagine why this would be extended.</p>
<h2>Authentication Profile</h2>
<h2>Action Type Base</h2>
<h2>Report Import Table</h2>
<h2>Dictionary</h2>
<p>I don't think this makes any sense. I can't imagine why this would be extended.</p>
<p>It has a class and it's used but unless I can make a new field type (I thought that wasn't possible.)</p>
<p>I dont see why this is a thing unless that <strong>is</strong> possible.</p>
<!--EndFragment-->
<!--image-->
<p><img src="https://jace.pro/static/img/sys_dictionary_list.png" alt="" /></p>
<!--StartFragment-->
<h2>Choice</h2>
<h2>System Log</h2>
<p>I don't think this makes any sense. I can't imagine why this would be extended.</p>
<h2>User Preference</h2>
<h2>Filter</h2>
<p>I don't think this makes any sense. I can't imagine why this would be extended.</p>
<!--EndFragment-->
<p><img src="https://jace.pro/static/img/sys_filter_list.png" alt="" /></p>
<!--StartFragment-->
<h2>Portal Page</h2>
<p>I don't think this makes any sense. I can't imagine why this would be extended.</p>
<!--EndFragment-->
<p><img src="https://jace.pro/static/img/sys_portal_page.png" alt="" /></p>
<!--StartFragment-->
<h2>Scheduled Job</h2>
<p>These are already extended to a number of types of jobs, but I'm not sure why I'd extend it.</p>
<blockquote>
<p>Sysauto I extended all the time. Specifically <code>sysauto_script</code> for many integrations.<br />
Including the SCCM integration that is close to what we have today.<br />
And I used that same design for the all the integrations for security vulnerability. - @killswitch</p>
</blockquote>
<h2>Data Lookup Definition</h2>
<h2>Data Lookup Matcher Rules</h2>
<h2>State Flow</h2>
<p>This has a class, but just one. I'm not sure why this would be extended.</p>
<h2>Execution Plan Task</h2>
<p>These are old as dirt. It has two classes today but beyond those I'm not sure why I'd extend it more.</p>
<!--EndFragment-->Comparing Code Searchers2019-11-26T04:47:03Zhttps://jace.pro/post/2019-11-25-comparing-code-searches/Jace Benson<!--StartFragment-->
<p>I am biased. I like <em>my</em> code search cause <em>I know</em> how it works as <em>I</em> wrote it. However, there are a few options for code searchers out there. But let me stat this first;</p>
<p>ServiceNow should have this OOB in their system not buried behind their Studio application.</p>
<p>Now that I've said my peace about it I'm going to compare all the code searcher's I know about.</p>
<h2>Global Code Search by Rick Marsha</h2>
<blockquote>
<p>A portable search utility that leverages the 'sn_codesearch' application (App Studio) for performing string searches across multiple tables and fields. Based on the out-of-box sample page 'CodeSearchExampleUse', but rather than only searching within custom application scopes, this page performs a system-wide search across all scopes, including GLOBAL.</p>
</blockquote>
<p>Downloads as of 2019-11-25: 196</p>
<p>This includes 2 files;</p>
<ul>
<li>UI action that is available on sys_* forms</li>
<li>UI page that does the search using the <code>/api/sn_codesearch/</code> apis</li>
</ul>
<p>Download: <a href="https://developer.servicenow.com/connect.do#!/share/contents/8451237_global_code_search?v=1.01&t=PRODUCT_DETAILS">Share</a></p>
<!--EndFragment-->
<!--Two RGM images here-->
<p><img src="https://jace.pro/static/img/global-rgm-search-1.png" alt="" /></p>
<p><img src="https://jace.pro/static/img/global-rgm-search-2.png" alt="" /></p>
<!--StartFragment-->
<p>This is a very pretty search that uses that <code>/api/sn_codesearch/</code> apis. It is installed in the global application. This also adds a left hand navigation Menu called, "Code Search" with a links to;</p>
<ul>
<li>Code Search</li>
<li>Search Groups</li>
<li>REST API Explorer</li>
<li>Scripted REST API</li>
<li>Properties</li>
</ul>
<h2>MS CodeSearch by Sebastian Reinmann</h2>
<blockquote>
<p>This is a Code Search application based on the sn_codesearch REST API and provides a quick and easy way to lookup code in the entirety ServiceNow instance.</p>
</blockquote>
<p>Downloads as of 2019-11-25: 188</p>
<p>This include 3 files;</p>
<ul>
<li>Script Include, "MS_CodeSearch", which has functions to add tables to the codesearch</li>
<li>UI Page, "MS_CodeSearch" which appears to only use <code>/api/sn_codesearch/</code> apis</li>
<li>UI Script prism.js for syntax highlighting</li>
</ul>
<p>Download:</p>
<ul>
<li><a href="https://developer.servicenow.com/connect.do#!/share/contents/4888545_ms_codesearch?v=0.1&t=PRODUCT_DETAILS">Share</a></li>
<li><a href="https://github.com/TechAdvis0r/NowDevelopment">Git</a></li>
</ul>
<!--EndFragment-->
<!-- ms code search here -->
<p><img src="https://jace.pro/static/img/ms-codesearch-1.png" alt="" /></p>
<!--StartFragment-->
<p>This is in a scoped app so it can be removed entirely, has a nice UI. A satisfying progress bar, collapsible search results, and syntax highlighted results.</p>
<h2>FetchCode by Brent Llewellyn</h2>
<blockquote>
<p>FetchCode is a handy utility for finding mysterious updaters, logging, wonkiness, and any other code snippets you could need to find throughout your instance. Just provide the terms to search for and FetchCode searches all script, xml, html, condition, calculation, system properties and default values as well as specific fields added in the config for the terms supplied in the dashboard.</p>
</blockquote>
<p>Downloads as of 2019-11-25: 113</p>
<p>This includes 321 Updates, on Share it lists these;</p>
<ul>
<li>6 Business Rules</li>
<li>3 Client Scripts</li>
<li>9 Data transformers</li>
<li>11 Key Definitions</li>
<li>1 Magic Key</li>
<li>1 Processor</li>
<li>3 Script Includes</li>
<li>2 Scripted Rest APIs</li>
<li>3 UI Actions</li>
<li>3 UI Pages</li>
<li>8 UI Scripts</li>
</ul>
<p>Download: <a href="https://developer.servicenow.com/connect.do#!/share/contents/1176688_fetchcode_an_instance_code_search_utility?v=1.03&t=PRODUCT_DETAILS">Share</a></p>
<!--EndFragment-->
<!--fetchcode image -->
<p><img src="https://jace.pro/static/img/fetchcode-1.png" alt="" /></p>
<p><img src="https://jace.pro/static/img/fetchcode-2.png" alt="" /></p>
<!--StartFragment-->
<p>This has a unique look and feel. It is installed in global and has a number of custom tables but without the <code>u_</code> prefix which forces me to raise my left eyebrow. If they are mucking with tables like that I have to wonder what else they are doing.</p>
<h2>Code Tools by Jace Benson</h2>
<blockquote>
<p>This is a scoped application for Service-now to allow easier searching all code sources.</p>
</blockquote>
<p>This includes 8 files;</p>
<ul>
<li>4 business rules</li>
<li>1 script include</li>
<li>1 service portal widget</li>
<li>1 service portal (<code>/code</code>)</li>
<li>1 scripted rest api</li>
</ul>
<p>This does the standard search api, but then also does a lookup on the workflow activity to update results for workflow activities that are only active and marking old ones "Inactive"</p>
<p>This also has an opt-in feature to tell you about bad code.</p>
<p>Download:</p>
<ul>
<li><a href="https://developer.servicenow.com/connect.do#!/share/contents/7596230_code_share_for_sp?v=2.4&t=PRODUCT_DETAILS">Share</a></li>
<li><a href="https://github.com/jacebenson/servicenow-code.git">Git</a></li>
</ul>
<p>Downloads as of 2019-11-25: 115</p>
<!--EndFragment-->
<!-- jace code searchimages -->
<p><img src="https://jace.pro/static/img/jace-code-search-1.png" alt="" /></p>
<p><img src="https://jace.pro/static/img/jace-code-search-2.png" alt="" /></p>
<!--StartFragment-->
<h2>Developer Search by Garrett Griffin</h2>
<blockquote>
<p>Introducing Developer Search 2.0, the comprehensive utility to search every script field in the system for that troublesome piece of code.</p>
</blockquote>
<p>This includes 6 files;</p>
<ul>
<li>2 Application Module Links</li>
<li>1 script include</li>
<li>2 UI Pages</li>
</ul>
<p>I love the short url for this, <code>/ds.do</code></p>
<p>I also love that you can share the link to the results.</p>
<p>It searches custom tables and fields normally which is great. The UI is a little difficult to read but is very functional.</p>
<p>It also features a "Deep Search" which appears to search other fields not traditionally scripting fields.</p>
<p>One thing it does really well is find Workflow Activity results.</p>
<!--EndFragment-->
<!--garrett search images -->
<p><img src="https://jace.pro/static/img/garrett-search.png" alt="" /></p>
<!--StartFragment-->
<p>Download:</p>
<ul>
<li><a href="https://developer.servicenow.com/connect.do#!/share/contents/9326002_developer_search?t=PRODUCT_DETAILS">Share</a></li>
</ul>
<p>Downloads as of 2019-11-25: 47</p>
<h2>Studio Search by ServiceNow</h2>
<blockquote>
<p>Studio allows application developers to search within application files for matching record values.</p>
</blockquote>
<p>Source: <a href="https://docs.servicenow.com/bundle/newyork-application-development/page/build/applications/task/t_SearchWithinApplicationFiles.html">https://docs.servicenow.com/bundle/newyork-application-development/page/build/applications/task/t_SearchWithinApplicationFiles.html</a></p>
<p>Downloads as of 2019-11-25: ♾️</p>
<!--EndFragment-->
<!-- studio search images-->
<p><img src="https://jace.pro/static/img/studio-search-1.png" alt="" /></p>
<p><img src="https://jace.pro/static/img/studio-search-2.png" alt="" /></p>
<!--StartFragment-->
<h2><a href="https://jace.pro/post/2019-11-25-comparing-code-searches/#summary">Summary</a></h2>
<table>
<thead>
<tr>
<th></th>
<th>Global Code Search</th>
<th>MS CodeSearch</th>
<th>FetchCode</th>
<th>Code Tools</th>
<th>Developer Search</th>
<th>Studio Search</th>
</tr>
</thead>
<tbody>
<tr>
<td>Installed OOB</td>
<td>🚫</td>
<td>🚫</td>
<td>🚫</td>
<td>🚫</td>
<td>🚫</td>
<td>✅</td>
</tr>
<tr>
<td>Scoped App</td>
<td>🚫</td>
<td>✅</td>
<td>🚫</td>
<td>✅</td>
<td>🚫</td>
<td>🚫</td>
</tr>
<tr>
<td>UI16 navigator links</td>
<td>✅</td>
<td>✅</td>
<td>✅</td>
<td>🚫</td>
<td>✅</td>
<td>🚫</td>
</tr>
<tr>
<td>UI Action to open Search</td>
<td>✅</td>
<td>🚫</td>
<td>🚫</td>
<td>🚫</td>
<td>🚫</td>
<td>🚫</td>
</tr>
<tr>
<td>Install-able from Git</td>
<td>🚫</td>
<td>✅</td>
<td>🚫</td>
<td>✅</td>
<td>🚫</td>
<td>🚫</td>
</tr>
<tr>
<td>Advanced Query function</td>
<td>🚫</td>
<td>🚫</td>
<td>✅</td>
<td>🚫</td>
<td>🚫</td>
<td>🚫</td>
</tr>
<tr>
<td>Code Analysis</td>
<td>🚫</td>
<td>🚫</td>
<td>🚫</td>
<td>✅</td>
<td>🚫</td>
<td>🚫</td>
</tr>
<tr>
<td>Searches extra tables</td>
<td>🚫</td>
<td>✅</td>
<td>✅</td>
<td>✅</td>
<td>✅</td>
<td>🚫</td>
</tr>
<tr>
<td>Looks up Active WF activities</td>
<td>🚫</td>
<td>🚫</td>
<td>🚫</td>
<td>✅</td>
<td>✅</td>
<td>🚫</td>
</tr>
<tr>
<td>Tables used</td>
<td>0</td>
<td>0</td>
<td>5</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
</tbody>
</table>
<p>With all this being said, I'd love to combine my efforts into a project with any of the maintainers of the code here.</p>
<!--EndFragment-->Setting Variables in a MRVS from an outside variable2019-11-20T04:46:53Zhttps://jace.pro/post/2019-11-19-setting-vars-in-a-mrvs-from-outside/Jace Benson<!--StartFragment-->
<p>A while ago <a href="https://jace.pro/post/2019-09-06-mvrs-dependent-variables/">I wrote about</a> using Dependent variables in a Multi Row Variable Set (MRVS). In there something always bothered me. The whole bit about how you can not access the variables outside of the MRVS.</p>
<p>Today a former colleague of mine asked me, "How do you get a value from the main form variable onto the MRVS field?"</p>
<p>I wanted to help, so I talked through the options available that I have not tested. In his case he was trying to use a "date" variable on the main form, and then allow many things to default to that date and allow that date to be different if need be.</p>
<p>The options as I saw them were these (none of these work);</p>
<ul>
<li>In the default value of the variable, try <code>javascript: current.variables.main_date</code></li>
<li>In the MRVS, add an onChange Client Script for the first variable to read the <code>main_date</code> variable and set the <code>server_date</code> variable.</li>
<li>(Didn't try this), on the main form, add an onChange Client Script for the <code>main_date</code> variable to pre-build a number of rows in the MRVS.</li>
</ul>
<p>After talking about these options it was really clear that there should be another way. I found one. Here it is, it is not as elegant as I'd like.</p>
<p>This uses user preferences to solve this issue. On change of the main form's variable, set the preference. On the MRVS set the default value based on that preference. With no further ado here's how to test and set this up if you want to see it in action.</p>
<ol>
<li>
<p>Install the <code>ATF</code> scoped application (to give you a form with a MRVS and other variables). We'll be using the MRVS and the <code>Date</code> variable.</p>
</li>
<li>
<p>On the Test Item, look at the related variable set. Update the "Question" variable's default value to this script;</p>
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">//default value on variable in MRVS</span><br /><span class="token literal-property property">javascript</span><span class="token operator">:</span> <span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">var</span> currentUser <span class="token operator">=</span> gs<span class="token punctuation">.</span><span class="token function">getUser</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <br /> <span class="token keyword">return</span> currentUser<span class="token punctuation">.</span><span class="token function">getPreference</span><span class="token punctuation">(</span><span class="token string">'customform.date'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token punctuation">)</span></code></pre>
</li>
<li>
<p>Now we can't set a preference in a client script, but we need to. So we'll need to create a script include that's client callable. Here's mine.</p>
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">//script include</span><br /><span class="token keyword">var</span> CatalogMVRSHelper <span class="token operator">=</span> Class<span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token class-name">CatalogMVRSHelper</span><span class="token punctuation">.</span>prototype <span class="token operator">=</span> Object<span class="token punctuation">.</span><span class="token function">extendsObject</span><span class="token punctuation">(</span>global<span class="token punctuation">.</span>AbstractAjaxProcessor<span class="token punctuation">,</span> <span class="token punctuation">{</span><br /> <span class="token function-variable function">awesomeFunction</span><span class="token operator">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">var</span> inputObj <span class="token operator">=</span> <span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">parse</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">getParameter</span><span class="token punctuation">(</span><span class="token string">'sysparm_obj'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> currentUser <span class="token operator">=</span> gs<span class="token punctuation">.</span><span class="token function">getUser</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <br /> currentUser<span class="token punctuation">.</span><span class="token function">savePreference</span><span class="token punctuation">(</span><span class="token string">'customform.date'</span><span class="token punctuation">,</span>inputObj<span class="token punctuation">.</span>date<span class="token punctuation">)</span><span class="token punctuation">;</span> <br /> <span class="token keyword">var</span> returnObj <span class="token operator">=</span> <span class="token punctuation">{</span><br /> <span class="token literal-property property">from</span><span class="token operator">:</span><span class="token string">"server"</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">input</span><span class="token operator">:</span> inputObj<br /> <span class="token punctuation">}</span><span class="token punctuation">;</span><br /> <span class="token keyword">return</span> <span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">stringify</span><span class="token punctuation">(</span>returnObj<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">type</span><span class="token operator">:</span> <span class="token string">'CatalogMVRSHelper'</span><br /><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
</li>
<li>
<p>After that's created we can set the preference with a client script. Here's that code.</p>
<pre class="language-javascript"><code class="language-javascript"><span class="token keyword">function</span> <span class="token function">onChange</span><span class="token punctuation">(</span><span class="token parameter">control<span class="token punctuation">,</span> oldValue<span class="token punctuation">,</span> newValue<span class="token punctuation">,</span> isLoading</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>isLoading <span class="token operator">||</span> newValue <span class="token operator">==</span> <span class="token string">''</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">return</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token comment">//js in client script on form</span><br /> <span class="token comment">//if variable changes </span><br /> <span class="token keyword">var</span> ga <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideAjax</span><span class="token punctuation">(</span><span class="token string">'x_8821_atf.CatalogMVRSHelper'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> ga<span class="token punctuation">.</span><span class="token function">addParam</span><span class="token punctuation">(</span><span class="token string">'sysparm_name'</span><span class="token punctuation">,</span> <span class="token string">'awesomeFunction'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> ga<span class="token punctuation">.</span><span class="token function">addParam</span><span class="token punctuation">(</span><span class="token string">'sysparm_obj'</span><span class="token punctuation">,</span> <span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">stringify</span><span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token string-property property">"date"</span><span class="token operator">:</span>newValue<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> ga<span class="token punctuation">.</span><span class="token function">getXML</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">response</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">var</span> responseDocument <span class="token operator">=</span> response<span class="token punctuation">.</span>responseXML<span class="token punctuation">.</span>documentElement<span class="token punctuation">;</span><br /> <span class="token keyword">var</span> answer <span class="token operator">=</span> responseDocument<span class="token punctuation">.</span><span class="token function">getAttribute</span><span class="token punctuation">(</span><span class="token string">'answer'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> serverObj <span class="token operator">=</span> <span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">parse</span><span class="token punctuation">(</span>answer<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token comment">//console.log(serverObj);</span><br /> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span></code></pre>
</li>
</ol>
<p>So now that those parts are happening here's what's occurring;</p>
<p>When your user sets the "Date" variable, you are creating or updating that user's <code>sys_user_preference</code>. Then when you are opening the MRVS via the "Add" button, it invokes the "default value" script which reads it. Really it's pretty simple once you boil it down.</p>
<!--EndFragment--> Comparing VS Code Extensions2019-11-14T04:44:59Zhttps://jace.pro/post/2019-11-13-vs-code-extensions/Jace Benson<!--StartFragment-->
<p>This post is about the state of code syncing tools for the VS Code tool.</p>
<p>Recently <a href="https://developer.servicenow.com/blog.do?p=/post/vscode/">Andrew announced the new VS Code extension</a>. I knew something was going to be released eventually because at K19 on the CreatorCon keynote they briefly showed the creation of web components being built locally. To do that you need something locally.</p>
<p>With all that out of the way I want to show what is currently out there, and compare features.</p>
<p>Also it's worth noting once ServiceNow seems to release something most generally community versions of them stop getting updated because, why would the community contribute when ServiceNow is maintaining it.</p>
<p>I'm going to compare the following file syncr's</p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Installer</th>
<th>Source</th>
</tr>
</thead>
<tbody>
<tr>
<td>Sal Costa's Servicenow Sync</td>
<td><a href="https://marketplace.visualstudio.com/items?itemName=anerrantprogrammer.servicenow-sync">VS Code Installer</a></td>
<td><a href="https://github.com/alcosta/vsc-servicenow-sync">Source</a></td>
</tr>
<tr>
<td>IntegrateNate's S.N.I.C.H.</td>
<td><a href="https://marketplace.visualstudio.com/items?itemName=integrateNate.snich">VS Code Installer</a></td>
<td><a href="https://github.com/RaynorUE/snich">Source</a></td>
</tr>
<tr>
<td>ServiceNow® Extension for VS Code</td>
<td><a href="https://marketplace.visualstudio.com/items?itemName=ServiceNow.now-vscode">VS Code Installer</a></td>
<td>NA</td>
</tr>
</tbody>
</table>
<p>I'm not going to look at these as they either haven't been updated or require software I'm not going to stand up. That is to say I respect the work done on these and these may have helped others make their tools, so to all of you who wrote these, good job. I do follow your work.</p>
<ul>
<li><a href="https://github.com/dynamicdan/sn-filesync">DynamicDan's Filesync</a></li>
<li><a href="https://github.com/cern-snow/codesync">cern-snow's Codesync</a></li>
<li><a href="https://github.com/theconnectiv/now-sync">theconnectiv's Now-sync</a></li>
<li><a href="https://github.com/0x111/sn-edit.com">0x111's sn-edit.com Sync</a></li>
<li><a href="https://github.com/thtliife/servicenow-sync">tftliife's Atom Servicenow Sync</a></li>
<li><a href="https://github.com/salcosta/servicenow-sync">Sal Costa's Sublime Servicenow Sync</a></li>
<li><a href="https://github.com/ReedOwens/UXsyncNow">ReedOwens' UXsyncNow</a></li>
</ul>
<h2>DynamicDan's Filesync</h2>
<p>Many years ago I worked at Fruition Partners and was aware of the Filesync project near the time of my departure. I never used it while there but did try it out after Dynamic Dan started maintaining it. Originally written by <a href="https://github.com/johncaruso">John Caruso</a> here on <a href="https://github.com/fruition-partners/filesync">github.com/fruition-partners/filesync</a>, then <a href="https://github.com/dynamicdan/sn-filesync">forked and maintained by Dynamic Dan</a>. This is great, it has a lot of room for configuration and wasn't tied to any editor. Since Dynamic Dan's fork has existed it's been forked 54 times, and stared 66 times.</p>
<p>This tool is not dependent on any text editor like the rest but I believe this was and still is a source of inspiration for all of these tools. Because this tool has no required editor, it in my opinion is going to be more available to more systems and users likes.</p>
<p>This was originally written before scopes, so you literally had to set up what tables and columns you wanted and this will fetch the files and update the values in ServiceNow in your current scope and update set.</p>
<h2>Sal Costa's Servicenow Sync</h2>
<p>I'm pretty partial to Sal's work as it to me has always been of very high quality. As such I tried this out. This reminded me very much of when I had used DynamicDan's fork. It is more intuitive, but that is because the commands are all available in command palette. This extension has these features;</p>
<p>The good;</p>
<ul>
<li>No pre-configured tables to start with, you have to specify what you want</li>
<li>Pre-configured fields for tables are set up once you add a table</li>
<li>Can download records regardless of scope/application</li>
<li>Link to open the file in the browser</li>
<li>Compare file to server</li>
<li>Can set your scope</li>
</ul>
<p>The bad;</p>
<ul>
<li>No pre-configured tables to start with, you have to specify what you want</li>
<li>No Intellisense</li>
<li>No way to download all files from a scope</li>
<li>No way to set your update set (No api made available)</li>
<li>Works in your current Scope/Update set that is associated to user</li>
</ul>
<p><a href="https://jace.pro/post/2019-11-13-vs-code-extensions/"></a></p>
<h2>IntegrateNate's S.N.I.C.H.</h2>
<p>Nate's extension had something many people wanted, Intellisense. Somehow Nate has the hookup to get this and it is great. This like Sal's has a simple to understand way to configure tables and fields. This extension has these features;</p>
<p>The good;</p>
<ul>
<li>Pre-configured (also customizable) to download many system files and fields</li>
<li>A way to download records regardless of scope/application</li>
<li>Compare file to server</li>
<li>Intellisense</li>
</ul>
<p>The bad;</p>
<ul>
<li>No link to the file on server</li>
<li>No way to set your scope</li>
<li>No way to set your update set (No api made available)</li>
<li>Works in your current Scope/Update set that is associated to user</li>
</ul>
<p><a href="https://jace.pro/post/2019-11-13-vs-code-extensions/"></a></p>
<h2>ServiceNow® Extension for VS Code</h2>
<p>Enter ServiceNow® Extension for VS Code extension. I think they have a great place to start here. Lots of idea's from Sal, Nate's and DynamicDan's projects.</p>
<p>The good;</p>
<ul>
<li>Pre-configured (<em>not customizable</em>) to download many system files and fields</li>
<li>Compare file to server</li>
<li>Intellisense</li>
<li>Run highlighted code in or out of scope</li>
<li>Link to open file in browser (sometimes)</li>
<li>Can set your update set (Must be a new undocumented api)</li>
<li>Can set your scope</li>
<li>Works with Scoped applications</li>
</ul>
<p>The bad;</p>
<ul>
<li><s>Table configurations not modifiable</s></li>
<li>Table configurations do not allow you to modify pre-configured tables e.g. UI Pages, Business Rules</li>
<li><s>Only works for Scoped Applications</s></li>
<li>Can work with global records if you know the plugin that includes the record in question</li>
<li>Has interesting way to configure initially (shown in video)</li>
</ul>
<p><a href="https://jace.pro/post/2019-11-13-vs-code-extensions/"></a></p>
<h1>Summary</h1>
<p>Lets look at it in a table format</p>
<p>Legend;<br />
✅ = Yes<br />
❌ = No<br />
😕 = Sort of</p>
<table>
<thead>
<tr>
<th>Feature</th>
<th>Servicenow Sync</th>
<th>S.N.I.C.H.</th>
<th>ServiceNow Official</th>
</tr>
</thead>
<tbody>
<tr>
<td>Updates ServiceNow from VS Code</td>
<td>✅</td>
<td>✅</td>
<td>✅</td>
</tr>
<tr>
<td>Can create records from VS Code</td>
<td>❌</td>
<td>❌</td>
<td>✅</td>
</tr>
<tr>
<td>Works with proxy</td>
<td>✅</td>
<td>❌</td>
<td>❌</td>
</tr>
<tr>
<td>Sets your scope</td>
<td>✅</td>
<td>❌</td>
<td>✅</td>
</tr>
<tr>
<td>Sets your update set</td>
<td>❌</td>
<td>❌</td>
<td>✅</td>
</tr>
<tr>
<td>Opens file in the instance</td>
<td>✅</td>
<td>❌</td>
<td>😕❌</td>
</tr>
<tr>
<td>Executes code on server</td>
<td>✅</td>
<td>❌</td>
<td>✅</td>
</tr>
<tr>
<td>Compares file to server</td>
<td>✅</td>
<td>✅</td>
<td>✅</td>
</tr>
<tr>
<td>Pre-configured Setup</td>
<td>❌</td>
<td>✅</td>
<td>✅</td>
</tr>
<tr>
<td>Customizable Setup</td>
<td>✅</td>
<td>✅</td>
<td>😕</td>
</tr>
<tr>
<td>Has Intellisense</td>
<td>❌</td>
<td>✅</td>
<td>✅</td>
</tr>
<tr>
<td>Works with Global</td>
<td>✅</td>
<td>✅</td>
<td>❌</td>
</tr>
<tr>
<td>Works with Scopes</td>
<td>✅</td>
<td>✅</td>
<td>✅</td>
</tr>
<tr>
<td>Allows Basic Auth</td>
<td>✅</td>
<td>✅</td>
<td>✅</td>
</tr>
<tr>
<td>Allows OAuth</td>
<td>❌</td>
<td>✅</td>
<td>✅</td>
</tr>
<tr>
<td>Open Source</td>
<td>✅</td>
<td>✅</td>
<td>❌</td>
</tr>
</tbody>
</table>
<p>Changelog;\</p>
<table>
<thead>
<tr>
<th>Date</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td>2019-11-18</td>
<td>Changed "ServiceNow Official" Customizable Setup from No, to Sort of</td>
</tr>
<tr>
<td>2019-11-18</td>
<td>Changed "ServiceNow Official" Works with Global from No, to No and Sort of</td>
</tr>
<tr>
<td>2019-11-18</td>
<td>Changed "ServiceNow Official" The bad to be more clear that table configurations are possible but only if not already configured</td>
</tr>
<tr>
<td>2019-11-18</td>
<td>Changed "ServiceNow Official" The good to include "Works with scoped application"</td>
</tr>
<tr>
<td>2019-11-18</td>
<td>Added "ServiceNow Official" The bad to include "Authentication issues"</td>
</tr>
<tr>
<td>2019-11-21</td>
<td>Added "Can create records from VS Code"</td>
</tr>
<tr>
<td>2019-11-21</td>
<td>Added "Allows Basic Auth"</td>
</tr>
<tr>
<td>2019-11-21</td>
<td>Added "Allows OAuth"</td>
</tr>
<tr>
<td>2019-11-21</td>
<td>Added "Can execute code on server"</td>
</tr>
<tr>
<td>2019-11-21</td>
<td>Changed "ServiceNow Official" video to show all features and how to set it up.</td>
</tr>
<tr>
<td>2019-11-21</td>
<td>Changed "ServiceNow Official" Can open file in the instance as I just had that wrong.</td>
</tr>
<tr>
<td>2019-11-21</td>
<td>Changed "ServiceNow Official" Works with Global to No because although global files can be retrieved in scope, it's not simple to do and will be in scope if you change it.</td>
</tr>
<tr>
<td>2019-11-27</td>
<td>Changed "ServiceNow Official" Opens files in instance to Sort of No because some things pull down with a <code>.now</code> and those open in the instance</td>
</tr>
</tbody>
</table>
<!--EndFragment-->Validating links on your KB2019-11-14T04:42:56Zhttps://jace.pro/post/2019-11-13-validating-links-on-kb/Jace Benson<!--StartFragment-->
<p>The other day, "Jon" on slack asked;</p>
<blockquote>
<p>Hi everyone :slightly_smiling_face: We have a ton of external links in content items. How can I regularly check those links to make sure they are active?</p>
</blockquote>
<p>Got me thinking, I should share this, cause someone might find it useful.</p>
<blockquote>
<p>Jace: You'd need to do the following steps;<br />
1 Gather the outbound links<br />
2 Make a http request to the endpoint to ensure it returns whatever is valid (is a 301 okay, that's a redirect?)<br />
3 Once you get the response, do something when you have an issue.<br />
To do 1, you could GlideRecord over the KB records and use regex to extract the links.<br />
You'll probably want to make an object where the link name is the property, and store the KB article as an array so if multiple articles use the same link you don't need to test repeatedly.<br />
You're output will look like\</p>
</blockquote>
<!--EndFragment-->
<!--StartFragment-->
<pre class="language-json"><code class="language-json"><span class="token punctuation">{</span><br /> <span class="token property">"https://google.com"</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token string">"KB1234"</span><span class="token punctuation">,</span><span class="token string">"KB1235"</span><span class="token punctuation">]</span><span class="token punctuation">,</span><br /> <span class="token property">"https://ddg.gg"</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token string">"KB43232"</span><span class="token punctuation">,</span><span class="token string">"KB4355"</span><span class="token punctuation">]</span><br /><span class="token punctuation">}</span></code></pre>
<!--EndFragment-->
<!--StartFragment-->
<p>Then if the links are PUBLIC, you could just use a scripted rest message and if response is not 200 do something, [https://jace.pro/post/2019-09-14-recordless-rest-is-great/](https://jace.pro/post/2019-09-14-recordless-rest-is-great/%5C)</p>
<p>However if the links require auth or vpn access, you'll have to account for that.</p>
<p>I'd assume code would be something like;</p>
<!--EndFragment-->
<!--StartFragment-->
<pre class="language-javascript"><code class="language-javascript"><span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">var</span> link <span class="token keyword">in</span> links<span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token function">doRestCall</span><span class="token punctuation">(</span>link<span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span><br /><span class="token keyword">function</span> <span class="token function">doRestCall</span><span class="token punctuation">(</span><span class="token parameter">url</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">var</span> restMessage <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">sn_ws<span class="token punctuation">.</span>RESTMessageV2</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> restMessage<span class="token punctuation">.</span><span class="token function">setHttpMethod</span><span class="token punctuation">(</span><span class="token string">"post"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> restMessage<span class="token punctuation">.</span><span class="token function">setEndpoint</span><span class="token punctuation">(</span>url<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> restMessage<span class="token punctuation">.</span><span class="token function">setRequestBody</span><span class="token punctuation">(</span><span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">stringify</span><span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> response <span class="token operator">=</span> restMessage<span class="token punctuation">.</span><span class="token function">execute</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span><span class="token punctuation">(</span>response<span class="token punctuation">.</span><span class="token function">getStatusCode</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">!=</span><span class="token number">200</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> gs<span class="token punctuation">.</span><span class="token function">error</span><span class="token punctuation">(</span><span class="token string">'not getting a 200 response'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span></code></pre>
<!--EndFragment-->
<!--StartFragment-->
<p>This could easily be adapted to a business rule or scheduled job to verify sites are available. One thing that would be interesting would be having this process check if the site is on the <a href="https://archive.org/web/web.php">Wayback machine</a>, if it is rewrite the link, if it is not, request it there and rewrite it to there.</p>
<!--EndFragment-->Making a custom probe & sensor2019-11-14T04:41:13Zhttps://jace.pro/post/2019-11-13-custom-probe-sensor/Jace Benson<!--StartFragment-->
<p>The other day I was trying to create a custom probe/sensor for a probe for our linux machines.</p>
<p>The only example I could find was to read a text file and make a ci based on that. That was not what I wanted.</p>
<p>I was specifically asking a program to tell me about its facts and I wanted to relate those details to the currently identified CI.</p>
<p>I couldnt remember how to do this;</p>
<p>Thankfully Rob G. pointed me in the right direction.</p>
<ul>
<li>Created Probe to run the command <code>sudo `which factor` -pj</code></li>
<li>Created Sensor to respond to the probe</li>
<li>Opened the Classifiers, and added the Probe to the Linux one</li>
<li>Created a Test Discovery schedule so I could test the Probe & Sensor</li>
</ul>
<!--EndFragment-->
<p><img src="https://jace.pro/static/img/probe-01.png" alt="" /></p>
<p><img src="https://jace.pro/static/img/probe-02-sensor.png" alt="" /></p>
<!--StartFragment-->
<p>Notes;</p>
<ul>
<li><code>result.output</code> is going to be string output as its what's on the shell that is returned. If it's an object, you gotta parse it.</li>
<li><code>var serverGR = this.getCmdbRecord();</code> is the way I used to get the currently identified CI.</li>
</ul>
<!--EndFragment-->Service Portal is going the way of the mammoth2019-10-15T03:34:40Zhttps://jace.pro/post/2019-10-14-end-of-sp-coming/Jace Benson<!--StartFragment-->
<p>That's my prediction. Service Portal will no longer get updates by the Orlando release. It will be like Workflow, Execution plans, Homepages, and the Content Management System. It will still <em>work</em> but will not get future development.</p>
<p>I know it's only been out since <a href="https://docs.servicenow.com/bundle/helsinki-release-notes/page/release-notes/servicenow-platform/r_ServicePortalRN.html">Helsinki</a> and that means since April 2016 which is ~4 years. But after you look at these findings, you'll agree.</p>
<h2>Why bring it up?</h2>
<p>Well, I don't like to work on something that isn't going to get support. Things that do not get active development generally are left behind.</p>
<p>They are hard to maintain because any <em>new</em> features need to be built by the customers using them. Want to see some active examples?</p>
<table>
<thead>
<tr>
<th>New Feature</th>
<th>New Feature last notable update</th>
<th>Old Feature</th>
<th>Old Feature last notable update</th>
</tr>
</thead>
<tbody>
<tr>
<td>Dashboards</td>
<td>New York: Multiple Breakdowns</td>
<td>Home pages</td>
<td>Homepage layouts (Summer '08)</td>
</tr>
<tr>
<td>Flow Designer</td>
<td>New York: Multiple Updates</td>
<td>Workflow</td>
<td>Created Workflow (Summer '08)</td>
</tr>
<tr>
<td>Service Portal</td>
<td>New York: Agent Chat</td>
<td>CMS</td>
<td>Created CMS (Summer '09)</td>
</tr>
</tbody>
</table>
<p>Would ServiceNow keep development efforts on Service Portal and the New Design System? Unlikely.</p>
<p>In the past they haven not ever announced they would od this kind of dual development. According to <a href="https://community.servicenow.com/community?id=community_article&sys_id=6246e75cdb9d3b0422e0fb2439961965">this talk</a> all out of box forms will use these components that are part of this.</p>
<h2>What is the New Design System?</h2>
<p>Before we dive into what this is, lets talk about <strong>why</strong> it's needed.</p>
<ol>
<li>Keeping ServiceNow tied to Angular 1.5.3 is not maintainable.</li>
<li>Any new functionality developed needs to be custom developed by someone to use in SN.</li>
<li>No ability to use new tech in the old system.</li>
</ol>
<p>So, now that we know why it's needed, lets talk about the new design system.</p>
<p>At it's core everything is on a "Canvas". When you customize the canvas, it appears ServiceNow is calling that an "Experience" and Pre-defined experiences are called "Workspaces" which we've seen since Madrid (See Agent Workspace).</p>
<p>So to repeat;</p>
<ul>
<li>Canvas: Base building block for new design system. I'd compare this to a UI Page.</li>
<li>Experience: A name for a customized Canvas.</li>
<li>Workspace: A Experience with navigation and general UI components.</li>
</ul>
<!--EndFragment-->
<p><img src="https://jace.pro/static/img/sp-mammoth-01.png" alt="" /></p>
<p><img src="https://jace.pro/static/img/sp-mammoth-02.png" alt="" /></p>
<!--StartFragment-->
<h2>How is the design System built?</h2>
<p>ServiceNow has not made that clear, but they did say it's all built on Jelly, then said, "Just Kidding". I am not sure.</p>
<p>The <strong>ServiceNow UI Framework</strong> is a custom Javascript framework built using web components. On top of that framework is the metadata layer.</p>
<ul>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/Web_Components">Based on web components stardard: custom elements + shadow DOM</a> is what this is based on</li>
<li>Write testable, re-usable effects that respond to actions</li>
<li>Shared effects: all your platform API calls, no more messy spaghetti code These are custom to SN</li>
<li>Everything is a component, and that's great</li>
<li>One target stack with customization and composition built into core.</li>
</ul>
<p>There are two kinds of components;</p>
<ul>
<li>
<p>Experience Components - These are a UI and effects to connect to the platform API</p>
<p><img src="https://jace.pro/static/img/sp-mammoth-03.png" alt="" /></p>
</li>
<li>
<p>Base Components - UI only building blocks</p>
<p><img src="https://jace.pro/static/img/sp-mammoth-04.png" alt="" /></p>
<p><img src="https://jace.pro/static/img/sp-mammoth-05.png" alt="" /></p>
</li>
<li>
<p>How does it work together?</p>
<p><img src="https://jace.pro/static/img/sp-mammoth-06.png" alt="" /></p>
</li>
</ul>
<!--StartFragment-->
<h2>What will this look like</h2>
<p>In the video they actually create a widget using web components for ServiceNow. Below is a screenshot, but also here is a link to the talk. This part starts @25:57.</p>
<!--EndFragment-->
<p><img src="https://jace.pro/static/img/sp-mammoth-07.png" alt="" /></p>
<!--StartFragment-->
<h2>Sources</h2>
<ul>
<li><a href="https://community.servicenow.com/community?id=community_article&sys_id=6246e75cdb9d3b0422e0fb2439961965">CreatorCon2019 - CCB0702</a></li>
<li><a href="https://knowledge.servicenow.com/video-library/day-3-spotlight-creatorcon-full.html">Day 3 Keynote, @51:44</a></li>
</ul>
<!--EndFragment-->Going Fast in ServiceNow2019-10-07T03:32:50Zhttps://jace.pro/post/2019-10-06-faster-with-servicenow/Jace Benson<!--StartFragment-->
<p>Robert Fedoruk has been killing it with his content, and one of theses posts needs to be retold because it is, just that good.</p>
<p>Source: <a href="https://www.youtube.com/watch?v=UvwA4_9ajX8">Youtube</a></p>
<!--EndFragment-->
<!--StartFragment-->
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Tired of only the pros knowing how work fast in <a href="https://twitter.com/hashtag/ServiceNow?src=hash&ref_src=twsrc%5Etfw">#ServiceNow</a>. In <5 minutes, learn to pinpoint stuff most relevant to you, and bookmark it for later.<a href="https://t.co/f2FWknvr5G">https://t.co/f2FWknvr5G</a></p>— Rob (@rfedoruk) <a href="https://twitter.com/rfedoruk/status/1179140873352876033?ref_src=twsrc%5Etfw">October 1, 2019</a></blockquote> <script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<!--EndFragment-->
<!--StartFragment-->
<p>I feel like this should be searchable and isn't today. So I am making a post to share that content.</p>
<p>There's a few things people should know to going fast. All the shortcuts, and accessing your stuff.</p>
<h1><a href="https://jace.pro/post/2019-10-06-faster-with-servicenow/#list-management">List Management</a></h1>
<h2><a href="https://jace.pro/post/2019-10-06-faster-with-servicenow/#right-click">Right-click</a></h2>
<p>Be bold and use your middle finger, to right-click on everything. This gives your access to the following actions;<br />
filter out</p>
<ul>
<li>show matching</li>
<li>show before</li>
<li>show after</li>
<li>build a report</li>
</ul>
<h2><a href="https://jace.pro/post/2019-10-06-faster-with-servicenow/#use-the-monacle-to-search-columns">Use the monacle to search columns</a></h2>
<p>This will load a textbox below each column, they work with text like so;</p>
<ul>
<li><code>text</code> defaults to starts with</li>
<li><code>=text</code> is the exact match (case insensitive)</li>
<li><code>*text</code> is the text contains</li>
</ul>
<h2><a href="https://jace.pro/post/2019-10-06-faster-with-servicenow/#jump-around-with-breadcrumbs">Jump around with breadcrumbs</a></h2>
<p>You can change your filter fast by smashing the different parts of the breadcrumbs.</p>
<ul>
<li>smash the chevron to remove the next specific filter</li>
<li>smash the part of the filter to remove all the parts right of it</li>
</ul>
<h2><a href="https://jace.pro/post/2019-10-06-faster-with-servicenow/#editing-data-in-a-list">Editing data in a list</a></h2>
<p>You don't have to go into each record to change the data.</p>
<ul>
<li><code>CTRL</code> + smash and then double smash a cell to edit all selected rows for that column</li>
<li><code>SHIFT</code> + <code>↑</code> / <code>↓</code>, then double smash a selected cell to edit all selected rows</li>
</ul>
<h2><a href="https://jace.pro/post/2019-10-06-faster-with-servicenow/#control-the-data-you-see-with-the-cog">Control the data you see with the cog</a></h2>
<ul>
<li>smash the cog to decide what columns you will see</li>
<li>experiment with this as you can always reset</li>
</ul>
<h1><a href="https://jace.pro/post/2019-10-06-faster-with-servicenow/#accessing-your-stuff-fast">Accessing your stuff fast</a></h1>
<ul>
<li>Drag a condition onto the left hand menu to add it to your favorites</li>
<li>Ham sandwich menu has a create favorite option too that does the same from <strong>list</strong> and <strong>record</strong></li>
<li>Stars in the left hand menu appear if you hover, that will also add them to your favorites</li>
<li>On the left hand menu in the star menu at the bottom is a pencil to edit all your favorites and their order</li>
</ul>
<!--EndFragment-->Annotations seem to be unsupported2019-09-29T03:30:30Zhttps://jace.pro/post/2019-09-28-sp-annotations/Jace Benson<!--StartFragment-->
<p>First, I have to say, thank you @paige for making me aware. I really appreciate you and this info.</p>
<h2>Form annotations</h2>
<p>Can be really helpful and powerful. You can use them help users enter the right information and users can turn them off when they feel comfortable.<br />
The other day on <a href="https://sndevs.com/">slack</a> I think Paige mentioned they just flat out do not work on service portal. This is a real shame.</p>
<p>There's three things here;</p>
<ol>
<li>No where does it say it's not supported on service portal. Not on the Form Annotation link above, not on the page specifically about the <a href="https://docs.servicenow.com/bundle/newyork-servicenow-platform/page/build/service-portal/concept/form-widget.html">form widget</a> itself.</li>
<li>There's no options on the widget to set to allow them.</li>
<li>They aren't on the new Agent Workspaces either.</li>
</ol>
<p>Don't believe me. Okay. Here's a short video showing the <code>ticket</code> table record with annotations of html and plain text working in UI16, not working on the Service Portal.</p>
<p>So when people are making new fields, or showing fields on forms and might want to show what things are for what, is the expectation to move these informational messages to guided tours? But that seems less available, meaning it isn't easily toggled on and off.</p>
<!--EndFragment-->
<!--StartFragment-->
<p>Now I'd love to just add this functionality back, but it seem the more and more we as developers add to this platform, the more and more ServiceNow takes away from it. With that I highly encourage you to open a HI ticket if you use annotations and ask pointed questions that have easy and direct answers.</p>
<p>Ha, I was even able to make a preloaded form with some text for you, but you have to already be logged in.</p>
<p><a href="https://hi.service-now.com/hisp?id=cssp_irp&description=When%20will%20form%20annoations%20be%20supported%20on%20Service%20Portal%20and%20Agent%20Workspace%3F">Open a Hi ticket</a></p>
<p>Further Reading: <a href="https://community.servicenow.com/community?id=community_question&sys_id=231ccf25db9cdbc01dcaf3231f9619d9">Community post from 2016 by mdobner</a></p>
<!--EndFragment-->What Are Syntax Macros?2019-09-29T03:27:58Zhttps://jace.pro/post/2019-09-28-what-are-syntax-macros/Jace Benson<!--StartFragment-->
<p><a href="https://docs.servicenow.com/bundle/geneva-servicenow-platform/page/script/general_scripting/reference/r_SyntaxEditorMacros.html">Syntax Editor Macros</a> are rarely talked about.<br />
Effectively, they are a text replacement table for script elements.</p>
<p>That might not seem that big of a deal, but for me. It could have saved me some serious headaches. Let's look at the examples provided on the docs site.</p>
<p><code>vargr</code> will replace itself to;</p>
<!--EndFragment-->
<!--StartFragment-->
<pre class="language-javascript"><code class="language-javascript"><span class="token keyword">var</span> gr <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">""</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br />gr<span class="token punctuation">.</span><span class="token function">addQuery</span><span class="token punctuation">(</span><span class="token string">"name"</span><span class="token punctuation">,</span> <span class="token string">"value"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br />gr<span class="token punctuation">.</span><span class="token function">query</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token keyword">if</span> <span class="token punctuation">(</span>gr<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /><br /><span class="token punctuation">}</span></code></pre>
<!--EndFragment-->
<!--StartFragment-->
<p>As much as I dislike the use of variable name <code>gr</code> as using just that name can cause issues, its nice!</p>
<p>You can change the code up so if you want to ensure a <a href="https://sn.jace.pro/docs/scripting/glideajax/"><code>glideAjax</code></a> call always uses some format like I use cause for me consistency is key.</p>
<p>Additionally, because I don't believe anything is permanent online I'll include links and Wayback links to these next resources.</p>
<p>This <em>shark711</em> person form Australia has had a <a href="https://shark711.github.io/sn-syntax-editor-macro/">"sn-syntax-editor-macro"</a> repo public since 2016. <a href="https://web.archive.org/web/20190929002112/https://shark711.github.io/sn-syntax-editor-macro/">Wayback Link</a>.</p>
<p>In that repo its just a collection of these syntax editor macros.</p>
<h2>Does it work everywhere in the platform?</h2>
<p>Sadly, no, it doesn't work in the Service Portal Widget Editor screen :(</p>
<p>Thankfully, <a href="http://snowguy.co.uk/2019/04/27/service-portal-syntax-editor-macros/">Dan Gibbard's post</a> comes to the rescue <a href="https://web.archive.org/web/20190929002526/http://snowguy.co.uk/2019/04/27/service-portal-syntax-editor-macros/">Wayback</a>;</p>
<p>He has a UI Script that he says you just gotta add to the widget editor widget. That's a mouthful.</p>
<!--EndFragment-->
<p>Thanks jgr1ffin for sharing <a href="https://www.cheatography.com/kipp/cheat-sheets/personal-servicenow-syntax-macros/">https://www.cheatography.com/kipp/cheat-sheets/personal-servicenow-syntax-macros/</a></p>
Projects are better than Certificates2019-09-29T03:22:08Zhttps://jace.pro/post/2019-09-28-projects-are-better-than-certs/Jace Benson<!--StartFragment-->
<p>I posted a survey on Twitter a few weeks ago;</p>
<!--EndFragment-->
<!--StartFragment-->
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Prosective <a href="https://twitter.com/hashtag/servicenow?src=hash&ref_src=twsrc%5Etfw">#servicenow</a> employers, what do you find more telling of a quality applicant? <a href="https://twitter.com/hashtag/servicenowdev?src=hash&ref_src=twsrc%5Etfw">#servicenowdev</a>. If it's something else, reply to this.</p>— Jace Benson 👨💻⚙️ (@jacebenson) <a href="https://twitter.com/jacebenson/status/1145689658791272448?ref_src=twsrc%5Etfw">July 1, 2019</a></blockquote> <script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<!--EndFragment-->
<!--StartFragment-->
<h2>Why does this matter?</h2>
<p>Average developers using ServiceNow think they <em>need</em> a certificate to validate<br />
that they really do in fact know something about ServiceNow. I think having<br />
a certificate is great for ServiceNow, and for your employer if you're a consultant<br />
because it adds to their partner level stuff. You know what is better? Something.<br />
That. You. Make.</p>
<p>Make something, make anything. If it's something you find useful, share that.</p>
<p>Jobs that post that they require a certificate, don't know the ins-and-outs of<br />
what is entailed in getting, and maintaining the certificate. They are not cheap.</p>
<p>Let's follow one of my... Twitter threads;</p>
<!--EndFragment-->
<!--StartFragment-->
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">So I’m not sure how familiar y’all are with <a href="https://twitter.com/hashtag/darkpatterns?src=hash&ref_src=twsrc%5Etfw">#darkpatterns</a> but I’m pretty sure this qualifies <a href="https://t.co/wP3M4IiLyq">https://t.co/wP3M4IiLyq</a></p>— Jace Benson 👨💻⚙️ (@jacebenson) <a href="https://twitter.com/jacebenson/status/1172949268489035782?ref_src=twsrc%5Etfw">September 14, 2019</a></blockquote> <script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<!--EndFragment-->
<!--StartFragment-->
<p>Let me just say this one more time. If I were hiring, and as the top survey had shown, showing results is better than a certificate any day. I'd suggest creating something instead of getting certified. If, you have to get certified, just realize it's likely not what you think it is.</p>
<p>None of these things guarantee employment and at least if you have something you made, you can have that in a portfolio which is better than a piece of paper saying you know ITSM.</p>
<!--EndFragment-->Better UX or Fully Automated?2019-09-28T03:19:21Zhttps://jace.pro/post/2019-09-27-better-ux-vs-fully-automated/Jace Benson<p>I posted a survey on Twitter a few weeks ago;</p>
<!--StartFragment-->
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">What's better? Fully Automated with many questions, or nearly automated process with very simple inputs? <a href="https://twitter.com/hashtag/ServiceNowDev?src=hash&ref_src=twsrc%5Etfw">#ServiceNowDev</a> <a href="https://twitter.com/hashtag/ServiceNow?src=hash&ref_src=twsrc%5Etfw">#ServiceNow</a> <a href="https://twitter.com/hashtag/Survey?src=hash&ref_src=twsrc%5Etfw">#Survey</a> <br />One means, make it and forget, the other means a better user experience.</p>— Jace Benson 👨💻⚙️ (@jacebenson) <a href="https://twitter.com/jacebenson/status/1174684663861956609?ref_src=twsrc%5Etfw">September 19, 2019</a></blockquote> <script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<!--EndFragment-->
<!--StartFragment-->
<p>Once I came to this realization that User Experience(UX) is literally more important then getting all the details from an end user, it literally took me three days to sort it internally.</p>
<p>But like a good survey, a good form should only ask the very bare minimum to get the request going. If 80% of the requests for a complicated item are in favor of one type of response, I'd argue, you should either assume every request is for that option, or make a separate item for the other option.</p>
<h2>Why?</h2>
<p>That makes so many more thing to maintain ( I hear my self asking ). Well, if you keep it, the item is more complex. Therefor it's less likely to get filled out, or users will more likely dislike the process of putting that data in. Lets look at a real-world example.</p>
<p>Consider the item, "ServiceNow Access or Group Membership". Now, lets think about the title, it doesn't indicate an action to add or remove. We've used this item for <strong>all</strong> group changes. This might seem like a simple item, but lets consider the kinds of questions on this form;</p>
<ul>
<li>Are you adding or removing a user?</li>
<li>What group</li>
<li>What user</li>
<li>Why is access needed</li>
</ul>
<p>Now of the 7K items that I can see in our system 80% are to add a user. If we had only made this item to add users, 8 out of 10 requests we could have avoided that question. Additionally, asking "Why is access needed" is only filled out 1/2 the time and normally doesn't make any difference on the request.</p>
<p>What does this form look like when it's simplified?</p>
<ul>
<li>What group needs this new member?</li>
<li>Who is this new member?</li>
</ul>
<p>Now about the removing of a user, I'd say it would make more sense to separate that into a separate item. Once items are simplified you can have other systems potentially digest them. Imagine searching for "how to add a user to a group" and being asked by Clippy if you'd like to add a user to a group, without leaving search, and having it render this simple item.</p>
<p>To me that sounds delightful. It just bothers me so much that I've been all about full end-to-end automation until now. I'm not saying that those details are not needed. Sometimes those details will require someone to actually talk to the person who asked for this item. That is not so bad.</p>
<h2>What about more complex items?</h2>
<p>So sure, lets talk about two other more complex items.</p>
<ol>
<li>Let's say one is for a company provided phone and phones available per country are different and varying depending on availability. So maybe you made a few tables to allow the telephony folks to control this item without having to actually change the item.<br />
This right now seems too complex for me to breakdown in the same way. This form however allows for different things based on "why" the request is being made. E.g. Lost, New Hire, Up for renewal.<br />
Again I'd argue we probably don't need the why, and should leave that up to the telephony group to<br />
ask the requester.</li>
<li>Requesting a certificate, you know like SSL certificates<br />
Here things that are needed are the domain, the type of certificate (e.g. Standard, SAN, Wildcard), a password, an responsible group. I'd argue this should be an item per type as most the requests are likely standard certificate.</li>
</ol>
<p>My whole point of this post, is you should consider user experience before automation.</p>
<!--EndFragment-->Terminology and Wording2019-09-19T03:17:32Zhttps://jace.pro/post/2019-09-18-terminology-and-word-choices/Jace Benson<!--StartFragment-->
<p>I took this from, <a href="https://hi.service-now.com/styles/heisenberg/styleguide/docs/terminology_and_wording.html">Hi's styleguide</a> as I don't trust anyone to keep anything online. So this is just a local copy with opinions about word choices.</p>
<blockquote>
<p>Note: Consider consulting with a technical writer before you commit UI text. Tech writers can help with clarity and consistency of UI text.</p>
</blockquote>
<h2>Avoid Using "Please"</h2>
<p>Using "please" is unnecessary, unless you are asking the user to do something that is inconvenient or a result of a system error.</p>
<table>
<thead>
<tr>
<th>Do</th>
<th>Do not</th>
</tr>
</thead>
<tbody>
<tr>
<td>Select custom application</td>
<td>Please Select a custom application</td>
</tr>
<tr>
<td>Error encountered while executing the selected rules. Please contact system administrator for further assistance</td>
<td>Error encountered while executing the selected rules. Contact system administrator for further assistance</td>
</tr>
</tbody>
</table>
<h2>Avoid Using Words Interchangeably</h2>
<p>Some words can have multiple meanings, depending on the context. Often, these words are used interchangeably with another word. For clarity, select and consistently use the less ambiguous meaning for each word.</p>
<p>For example, <em>because</em> and <em>since</em> should not be used interchangeably. The word <em>since</em> can have two meanings. To avoid ambiguity, always use <em>because</em> to provide a reason, and use <em>since</em> when referring to a specific point in time.</p>
<table>
<thead>
<tr>
<th>Do</th>
<th>Do not</th>
</tr>
</thead>
<tbody>
<tr>
<td>Group approval for {0} was deleted because it no longer matches approval rule {1}</td>
<td>Group approval for {0} was deleted since it no longer matches approval rule {1}</td>
</tr>
</tbody>
</table>
<p>As another example, <em>once</em> and _after_should not be used interchangeably. The word <em>once</em> has two meanings. Always use <em>after</em> when referring to events that occur later than or in succession to another event, and use <em>once</em> when referring to events that occur one time.</p>
<table>
<thead>
<tr>
<th>Do</th>
<th>Do not</th>
</tr>
</thead>
<tbody>
<tr>
<td>You cannot change the State after it is Closed or Canceled</td>
<td>You cannot change the State once it is Closed or Canceled</td>
</tr>
</tbody>
</table>
<h2>Spell Out Contractions</h2>
<p>Contractions can be hard to translate. Avoid contractions if at all possible.</p>
<table>
<thead>
<tr>
<th>Do</th>
<th>Do not</th>
</tr>
</thead>
<tbody>
<tr>
<td>You do not have any archived tasks</td>
<td>You don't have any archived tasks</td>
</tr>
</tbody>
</table>
<h2>Use Present Tense</h2>
<p>Present tense is easier to read and understand.</p>
<p>Avoid future tense and past tense if at all possible.</p>
<table>
<thead>
<tr>
<th>Do</th>
<th>Do not</th>
</tr>
</thead>
<tbody>
<tr>
<td>Problem is closed when the related change is marked Closed Complete</td>
<td>Problem will be closed when the related change is marked Closed Complete</td>
</tr>
</tbody>
</table>
<h2>Write Brief But Effective Text</h2>
<p>In messages that tell users about an action that they can perform, use active voice by providing a direct command or addressing users directly with <em>you</em>.</p>
<table>
<thead>
<tr>
<th>Do</th>
<th>Do not</th>
</tr>
</thead>
<tbody>
<tr>
<td>Specify the start date</td>
<td>Start date must be specified</td>
</tr>
<tr>
<td>You can create bookmarks by dragging a link to the left edge</td>
<td>Bookmarks are created by dragging a link to the left edge</td>
</tr>
</tbody>
</table>
<p>Only include enough detail to help users complete tasks.</p>
<table>
<thead>
<tr>
<th>Do</th>
<th>Do not</th>
</tr>
</thead>
<tbody>
<tr>
<td>Provide a brief explanation for rejecting this code</td>
<td>Enter your comments for rejecting this code. This comment will be useful for the developer who submitted this code change</td>
</tr>
<tr>
<td>Edit the report settings, and then click <strong>Run Report</strong></td>
<td>You've chosen Edit mode, make adjustments above and press the button titled <strong>Run Report</strong></td>
</tr>
</tbody>
</table>
<p>Remove unnecessary words. Examples of words that you can usually remove without altering your meaning include: - Adverbs. For example, really, quickly, and easily. - Articles (for example, the, a, and an) in the beginning of sentences. - Forms of “to be” that are used with another verb.</p>
<table>
<thead>
<tr>
<th>Do</th>
<th>Do not</th>
</tr>
</thead>
<tbody>
<tr>
<td>Article was not found</td>
<td>Unfortunately, the article cannot be found</td>
</tr>
<tr>
<td>Chart is loading</td>
<td>The chart is being loaded</td>
</tr>
</tbody>
</table>
<!--EndFragment-->Recordless Rest Is Great2019-09-15T03:15:52Zhttps://jace.pro/post/2019-09-14-recordless-rest-is-great/Jace Benson<!--StartFragment-->
<p>It seems this page was lost in the rearranging of files. I pulled it out<br />
of storage</p>
<p>I often use the record-less rest calls to test things. I didn't see it on<br />
my blog, so here's an example so I can find it in the future.\</p>
<!--EndFragment-->
<!--StartFragment-->
<pre class="language-javascript"><code class="language-javascript"><span class="token keyword">var</span> instance <span class="token operator">=</span> <span class="token string">"dev40379"</span><span class="token punctuation">;</span><br /><span class="token keyword">var</span> requestBody <span class="token operator">=</span> <span class="token punctuation">{</span><br /> <span class="token literal-property property">short_description</span><span class="token operator">:</span> <span class="token string">"test incident"</span><br /><span class="token punctuation">}</span><span class="token punctuation">;</span><br /><span class="token keyword">var</span> restMessage <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">sn_ws<span class="token punctuation">.</span>RESTMessageV2</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br />restMessage<span class="token punctuation">.</span><span class="token function">setBasicAuth</span><span class="token punctuation">(</span><span class="token string">"slack"</span><span class="token punctuation">,</span> <span class="token string">"slack"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br />restMessage<span class="token punctuation">.</span><span class="token function">setHttpMethod</span><span class="token punctuation">(</span><span class="token string">"post"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br />restMessage<span class="token punctuation">.</span><span class="token function">setEndpoint</span><span class="token punctuation">(</span><span class="token string">"http://"</span><span class="token operator">+</span> instance <span class="token operator">+</span><span class="token string">".service-now.com/api/now/table/incident"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br />restMessage<span class="token punctuation">.</span><span class="token function">setRequestBody</span><span class="token punctuation">(</span><span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">stringify</span><span class="token punctuation">(</span>requestBody<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token keyword">var</span> response <span class="token operator">=</span> restMessage<span class="token punctuation">.</span><span class="token function">execute</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token keyword">var</span> error <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">haveError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token keyword">if</span><span class="token punctuation">(</span>error<span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">var</span> errorCode <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">getErrorCode</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> errorMsg <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">getErrorMessage</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><br /> <br /><span class="token punctuation">}</span><br /><span class="token keyword">var</span> headerVal <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">getHeader</span><span class="token punctuation">(</span><span class="token string">"Content-Type"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token keyword">var</span> headers <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">getHeaders</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token keyword">var</span> queryString <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">getQueryString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token keyword">var</span> statusCode <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">getStatusCode</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token keyword">var</span> responseBody <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">getBody</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br />gs<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span>statusCode<span class="token punctuation">)</span><span class="token punctuation">;</span><br />gs<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span>responseBody<span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token comment">/**<br />* *** Script: 201<br />* *** Script: {"result":{"parent":"","..."}}<br />*/</span></code></pre>
<!--EndFragment-->Rename Update Set Export File Name2019-09-07T03:14:18Zhttps://jace.pro/post/2019-09-06-rename-update-set-export-file-name/Jace Benson<p>I know I've lost an update set in the past after a clone. Not because I didn't back it up. But because I couldn't find it locally on my drive. Or I did but all the names were too much to keep straight.</p>
<p>There's a bunch of ways to mitigate that loss. I'm not going to go into weather or not you should move everything up or what not. This post is about making the "Export Update Set" button give you a file name that makes more sense.</p>
<p>You can update a OOB Script include <code>ExportWithRelatedLists</code> to change how it works for exporting update sets. There's a function, <code>getFileName</code> that determines the name of the file. It's <code>table_sysid.xml</code>. You can add an if and rename it. Here's the code I've used to do this.</p>
<pre class="language-javascript"><code class="language-javascript"> <span class="token function-variable function">getFileName</span><span class="token operator">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token comment">// added customized name for exported update sets</span><br /> <span class="token comment">// script include: ExportWithRelatedLists</span><br /> <span class="token keyword">var</span> name <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>parent_table <span class="token operator">+</span> <span class="token string">'_'</span> <span class="token operator">+</span> <span class="token keyword">this</span><span class="token punctuation">.</span>sys_id <span class="token operator">+</span> <span class="token string">'.xml'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>parent_table <span class="token operator">==</span> <span class="token string">"sys_remote_update_set"</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">var</span> sus <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'sys_remote_update_set'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span><span class="token punctuation">(</span>sus<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>sys_id<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> name <span class="token operator">=</span> sus<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token string">'name'</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">'.xml'</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">return</span> name<span class="token punctuation">;</span><br /> <span class="token comment">// end of addition</span><br /> <span class="token comment">// return (this.parent_table + '_' + this.sys_id + '.xml');</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span></code></pre>
<p>Further Reading: <a href="https://community.servicenow.com/community?id=community_question&sys_id=d2ca7e63dbb723c41cd8a345ca9619c7">Community Post</a></p>
No Code Date Validations2019-09-07T00:44:56Zhttps://jace.pro/post/2019-09-06-no-code-date-validations/Jace Benson<!--StartFragment-->
<p>I've in the past had to write some... cludgey date comparisons. I'm not proud of them. I'm just glad I didn't have to look at them later.</p>
<p>Had I thought about what Mark Ragavan wrote about, it would have saved me probably days over my development time in the last 10 years.</p>
<p>Really, there's some common types of checks and actions for dates.</p>
<ul>
<li>Is it in the past?</li>
<li>Is it within a window? e.g. After 7 days from now.</li>
<li>Is it after another date on the form?</li>
</ul>
<p>To show this I'll add some reproduction steps below. Start out with my <a href="https://atf.jace.pro/">ATF Scoped App</a>;</p>
<ol>
<li>On your PDI import my <a href="https://atf.jace.pro/">"ATF" scoped app</a>.</li>
<li>URL: <code>https://github.com/jacebenson/atf.git</code></li>
<li>Change scope to "ATF"</li>
<li>Goto maintain items, and look for "Test Item"</li>
</ol>
<p>Now that you're here we can quickly test this out.</p>
<h2><a href="https://jace.pro/post/2019-09-06-no-code-date-validations/#disallow-past-dates">Disallow past dates</a></h2>
<ol>
<li>Create a UI Policy with the condition, <code>Date Before Today</code>.</li>
</ol>
<!--EndFragment-->
<p><img src="https://jace.pro/static/img/no-code-date-validation-1-ui-policy.png" alt="" /></p>
<!--StartFragment-->
<ol>
<li>
<p>Add a UI Policy action for the field <code>Date</code> and check the <code>clear value</code> checkbox.</p>
<p><img src="https://jace.pro/static/img/no-code-date-validation-2-ui-policy-action.png" alt="" /></p>
</li>
<li>
<p>Update the variable <code>Date</code> to have <code>Example text</code> of "Date cannot be in the past."</p>
<p><img src="https://jace.pro/static/img/no-code-date-validation-3-update-variable.png" alt="" /></p>
</li>
</ol>
<p>Try it out.</p>
<p>Now that you've seen it, it should be pretty clear how to apply this to a number of different situations. I just wanted to share as this is a great way for me to remember.</p>
<p>Further Reading: <a href="https://community.servicenow.com/community?id=community_article&sys_id=f61964aadbcb3fc85129a851ca9619eb">No Code dates validations thru Catalog UI Policies</a></p>
<!--EndFragment-->Multiple Variable Row Set - Dependent Variables2019-09-07T00:43:23Zhttps://jace.pro/post/2019-09-06-mvrs-dependent-variables/Jace Benson<!--StartFragment-->
<p>So It's been asked a few times, "How can I make my MVRS variables depend on other variables?"</p>
<p>The question has some caveats;</p>
<ol>
<li>If the Variables are all in the same row, that's possible.</li>
<li>If the Variables are not all in the MVRS, it's possible but you need to add stuff to the MVRS.</li>
</ol>
<p>Let's go over each of those.</p>
<p>So I'm going to deal with the 2nd one first. It's a design choice that you cannot make the MRVS variables dependent on variables outside of the row. The way around this is to add the variable to the MVRS and use that copy instead of the non-MVRS. I don't see another way around this.</p>
<p>Now that is dealt with the only time this comes up is if you seem to want to use a Lookup Select variable that re-evaluates based on other variables. I've <a href="https://blog.jace.pro/post/2017-10-28-lookup-select-attributes/">written about this in the past here</a>. If you're not familiar with it might be worth reading that.</p>
<p>Now I'm going to add reproduction steps cause I don't want to re-create things all over.<br />
So lets decide out test. Let's load all .. notification devices for a user, based on a user variable.</p>
<ol>
<li>On your PDI import my <a href="https://atf.jace.pro/">"ATF" scoped app</a>.</li>
<li>URL: <code>https://github.com/jacebenson/atf.git</code></li>
<li>Change scope to "ATF"</li>
<li>Goto maintain items, and look for "Test Item"</li>
<li>Open the variable set "Multi Row Variable Set"<br />
At this point you should see a "question" and "answer"</li>
<li>Rename "question" to "user"</li>
<li>Change it's type to "reference" to <code>sys_user</code></li>
<li>Rename "answer" to "device"</li>
<li>Change it's type to "lookup select box"</li>
<li>Set it's table to <code>cmn_notif_device</code></li>
<li>Add a variable attribute of <code>ref_qual_elements=user</code></li>
<li>Add a reference qualifier of<br />
<code>javascript: 'user=' + current.variables.user</code></li>
</ol>
<p>Now when I try this is just works.</p>
<!--EndFragment-->
<!--StartFragment-->
<p>Now say you don't want the Reference in the MVRS. Okay. I have a Reference variable on this test item already, it has a silly name, "Reference". But it works. Lets try that and change the variable attribute and reference qualifier.</p>
<ol>
<li>Change variable attribute to <code>ref_qual_elements=Reference</code></li>
<li>Add a reference qualifier of<br />
<code>javascript: 'user=' + current.variables.Reference</code></li>
</ol>
<p>You'll notice this doesn't appear to work. It seems this is as designed 😭.</p>
<!--EndFragment-->
<p><img src="https://jace.pro/static/img/mrvs-docs.png" alt="" /></p>
K11 Adv. Scripting and Debugging2019-09-02T00:42:35Zhttps://jace.pro/post/2019-08-31-j_roberts-blast-from-k11/Jace Benson<!--StartFragment-->
<p>So I was looking for something and came across this old link from K11. I didn't go to K11, but I sure wanted to.</p>
<p>I still think this lab has useful info so I'm sharing it <a href="https://jace.pro/slides/k11-adv-scripting-debugging/#/">here on this post</a> and linking to the source at the bottom.</p>
<p>Source: <a href="https://www.slideshare.net/j_roberts/servicenow-knowledge11-advanced-scripting-debugging-lab">https://www.slideshare.net/j_roberts/servicenow-knowledge11-advanced-scripting-debugging-lab</a></p>
<!--EndFragment-->UI16: How to update the user menu2019-09-01T00:40:54Zhttps://jace.pro/post/2019-08-30-updating-ui16-user-menu/Jace Benson<!--StartFragment-->
<p>Ever wanted to add an item in the drop down menu on the header or<br />
customize the sections of the user preferences? Here's one way.</p>
<p>So it seems ServiceNow is built on jelly, and if you know the names of the<br />
macros and ui pages you can overwrite them. So I was able to find the name<br />
of the macro. How? That's a day for another post. I'll just go over the<br />
<code>concourse_user_menu</code> today. In the image on top, I pasted the code.</p>
<p>So you want to add something to it. Make a UI Macro called <code>concourse_user_menu</code><br />
with the following xml. I added a link to DuckDuckGo. But you can see how<br />
this works.</p>
<!--EndFragment-->
<!--StartFragment-->
<pre class="language-xml"><code class="language-xml"><span class="token prolog"><?xml version="1.0" encoding="utf-8" ?></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">j:</span>jelly</span> <br /> <span class="token attr-name">trim</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>false<span class="token punctuation">"</span></span> <br /> <span class="token attr-name"><span class="token namespace">xmlns:</span>j</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>jelly:core<span class="token punctuation">"</span></span> <br /> <span class="token attr-name"><span class="token namespace">xmlns:</span>g</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>glide<span class="token punctuation">"</span></span> <br /> <span class="token attr-name"><span class="token namespace">xmlns:</span>j2</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>null<span class="token punctuation">"</span></span> <br /> <span class="token attr-name"><span class="token namespace">xmlns:</span>g2</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>glide<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>dropdown pull-left<span class="token punctuation">"</span></span> <span class="token attr-name">role</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>application<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>button</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>user_info_dropdown<span class="token punctuation">"</span></span> <span class="token attr-name">data-toggle</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>dropdown<span class="token punctuation">"</span></span><br /> <span class="token attr-name">aria-haspopup</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>true<span class="token punctuation">"</span></span> <span class="token attr-name">aria-expanded</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>false<span class="token punctuation">"</span></span><br /> <span class="token attr-name">title</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>${gs.getMessage('User menu')}<span class="token punctuation">"</span></span><br /> <span class="token attr-name">aria-label</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>${gs.getMessage('User menu')}<span class="token punctuation">"</span></span><br /> <span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>sn-user-avatar</span> <br /> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>sn-avatar_xs<span class="token punctuation">"</span></span> <br /> <span class="token attr-name">aria-hidden</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>true<span class="token punctuation">"</span></span> <br /> <span class="token attr-name">disable-popover</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>true<span class="token punctuation">"</span></span> <br /> <span class="token attr-name">profile</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>{avatar: '$[gs.getUser().getAvatar()]', initials: '$[gs.getUser().getInitials()]', userID: '$[gs.getUserID()]'}<span class="token punctuation">"</span></span> <br /> <span class="token attr-name">enable-presence</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>true<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>span</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>user-name hidden-xs hidden-sm hidden-md<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> $[HTML,NG:gs.getUser().getDisplayName()]<br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>span</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>span</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>sr-only<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> ${gs.getMessage('User menu')}<br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>span</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>elevate-role-indicator</span><span class="token punctuation">/></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>span</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>caret<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>button</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>ul</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>dropdown-menu<span class="token punctuation">"</span></span><br /> <span class="token attr-name">aria-labelledby</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>user_info_dropdown<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>li</span> <span class="token attr-name">role</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>presentation<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>sys_user.do?sys_id=${gs.getUserID()}<span class="token entity named-entity" title="&">&amp;</span>sysparm_view=ess<span class="token punctuation">"</span></span><br /> <span class="token attr-name">target</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>gsft_main<span class="token punctuation">"</span></span> <span class="token attr-name">role</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>listitem<span class="token punctuation">"</span></span> <span class="token attr-name">tabindex</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>-1<span class="token punctuation">"</span></span> <span class="token punctuation">></span></span><br /> ${gs.getMessage('Profile')}<br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>li</span><span class="token punctuation">></span></span><br /><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">j:</span>if</span> <span class="token attr-name">test</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>${gs.getProperty('glide.ui.impersonate_button.enable')}<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">j2:</span>if</span> <span class="token attr-name">test</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>$[new GlideImpersonate().canImpersonate(gs.getUserID())]<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>li</span> <span class="token attr-name">role</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>presentation<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>javascript:void(0)<span class="token punctuation">"</span></span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>glide_ui_impersonator<span class="token punctuation">"</span></span> <span class="token attr-name">sn-modal-show</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>impersonate<span class="token punctuation">"</span></span> <span class="token attr-name">role</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>listitem<span class="token punctuation">"</span></span> <span class="token attr-name">tabindex</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>-1<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> ${gs.getMessage('Impersonate User')}<br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>li</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span><span class="token namespace">j2:</span>if</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span><span class="token namespace">j:</span>if</span><span class="token punctuation">></span></span><br /><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">g2:</span>evaluate</span> <span class="token attr-name">var</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>jvar_elevated_privileges<span class="token punctuation">"</span></span> <span class="token attr-name">expression</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>gs.getSession().getAvailableElevatedRoles()<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">j2:</span>if</span> <span class="token attr-name">test</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>${!empty(jvar_elevated_privileges)}<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>li</span> <span class="token attr-name">role</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>presentation<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>javascript:void(0)<span class="token punctuation">"</span></span> <span class="token attr-name">sn-modal-show</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>elevateRoles<span class="token punctuation">"</span></span> <span class="token attr-name">role</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>listitem<span class="token punctuation">"</span></span> <span class="token attr-name">tabindex</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>-1<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> ${gs.getMessage('Elevate Roles')}<br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>li</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span><span class="token namespace">j2:</span>if</span><span class="token punctuation">></span></span><br /><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">j2:</span>if</span> <span class="token attr-name">test</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>$[gs.getUser().getPreference('user.can.logout') == 'true']<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>li</span> <span class="token attr-name">role</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>presentation<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>logout.do<span class="token punctuation">"</span></span> <span class="token attr-name">role</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>listitem<span class="token punctuation">"</span></span> <span class="token attr-name">tabindex</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>-1<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> ${gs.getMessage('Logout')}<br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>li</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span><span class="token namespace">j2:</span>if</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>li</span> <span class="token attr-name">role</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>presentation<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>https://ddg.gg<span class="token punctuation">"</span></span> <span class="token attr-name">role</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>listitem<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> Welcome to the #duckside<br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>li</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>ul</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"></</span><span class="token namespace">j:</span>jelly</span><span class="token punctuation">></span></span></code></pre>
<!--EndFragment-->Service Portal: Embedding a form widget2019-08-27T00:35:11Zhttps://jace.pro/post/2019-08-25-sp-embedded-widgets/Jace Benson<!--StartFragment-->
<p>So this weekend I had the opportunity to help someone out with an issue<br />
on their side project. They had this list they wanted to access from<br />
a phone, and wanted the ability to add a new record from a phone.</p>
<p>Simple enough I though. Just make a <a href="https://getbootstrap.com/docs/3.3/components/#list-group">bootstrap list</a><br />
of sorts and add a button, to open a <a href="https://developer.servicenow.com/app.do#!/api_doc?v=madrid&id=SPM-open_O">spModal</a><br />
to the OOB form widget.</p>
<p>That worked, but we ended up with 3 buttons, and 2 headers.</p>
<p>So that didn't work. Sure, I could have removed the buttons, by setting<br />
the <code>buttons</code> array to blank. Also I could have looked into the<br />
<code>widget-form</code> options. I didn't though. Because it was for a rating<br />
system and needed to use something that has a <a href="https://angular-ui.github.io/bootstrap/#!#rating">star ranking</a></p>
<p>In case you are not aware, ServiceNow does a few things for you, like load<br />
in a bunch of UI Bootstrap directives.</p>
<p>Enter <code><uib-rating></code></p>
<p>This gets a little fuzzy here, but essentially, if you have a numeric scale;<br />
1-10 or less, you can represent it with stars or other icons. You cannot do<br />
this with the OOB widgets you'll need your own input form. That's where this<br />
post really shines for me. I need to remember how I did this.</p>
<p>So we had a Widget already, called "Home" for the list of ratings. Then we<br />
wanted a spModal to load a new widget that was the form. One of the fields<br />
is this UIB Rating thing. Then when the [OK] is pressed, send the data back<br />
up to the parent widget, and make a new Rating record, and refresh the list.</p>
<p>When sorting this out, I didn't have that last paragraph. So it took me a bit<br />
to find how to pass the data but here's the crucial bits if you find yourself<br />
in a similar situation.</p>
<p>Below is a Home widget which makes the call to spModal.open. That has a promise<br />
to handle the response in the <code>then</code> bit. That's where this magic happens. It<br />
wasn't in the docs. Thankfully this markdown file was still out on <a href="https://github.com/service-portal/x-archive/blob/master/documentation/spModal.md#example-5-embedded-widget-with-shared-data">Github</a>.</p>
<p>End result was this;</p>
<!--EndFragment-->
<p><img src="https://jace.pro/static/img/2019-08-25-sp-embedded-widgets.gif" alt="" /></p>
<!--StartFragment-->
<p>That example shows how to do this for variable, and I wanted to do this for five.</p>
<h3>Home Widget</h3>
<h3>HTML</h3>
<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>list-group<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>#<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>list-group-item<span class="token punctuation">"</span></span> <span class="token attr-name">ng-repeat</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>book in c.data.books<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>span</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>badge<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>span</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span> <br /><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>button</span> <span class="token attr-name">ng-click</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>c.onWidget() <span class="token punctuation">"</span></span><span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>btn btn-default<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> Add Rating<br /><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>button</span><span class="token punctuation">></span></span></code></pre>
<h3>Client Script</h3>
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">//Client Script</span><br /><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">spModal</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token comment">/* widget controller */</span><br /> <span class="token keyword">var</span> c <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> shared <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span><br /> c<span class="token punctuation">.</span><span class="token function-variable function">onWidget</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> spModal<span class="token punctuation">.</span><span class="token function">open</span><span class="token punctuation">(</span><span class="token punctuation">{</span><br /> <span class="token literal-property property">shared</span><span class="token operator">:</span> shared<span class="token punctuation">,</span><br /> <span class="token literal-property property">value</span><span class="token operator">:</span> c<span class="token punctuation">.</span>response<span class="token punctuation">,</span><br /> <span class="token literal-property property">title</span><span class="token operator">:</span> <span class="token string">'titkfadsf'</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">widget</span><span class="token operator">:</span> <span class="token string">'rating_form'</span><span class="token punctuation">,</span> <br /> <span class="token literal-property property">widgetInput</span><span class="token operator">:</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>shared<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> c<span class="token punctuation">.</span>data<span class="token punctuation">.</span>bookrating<span class="token operator">=</span>shared<span class="token punctuation">;</span><br /> c<span class="token punctuation">.</span>server<span class="token punctuation">.</span><span class="token function">update</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <br /> <span class="token punctuation">}</span><span class="token punctuation">)</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span></code></pre>
<h3>Server Script</h3>
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">//Server Script</span><br /><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token comment">/* populate the 'data' object */</span><br /> <span class="token comment">/* e.g., data.table = $sp.getValue('table'); */</span> <br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>input<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token comment">//if submitted rating</span><br /> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>input<span class="token punctuation">)</span><br /> <span class="token keyword">var</span> rating<span class="token operator">=</span><span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'x_86691_heardit_ratings'</span><span class="token punctuation">)</span><br /> rating<span class="token punctuation">.</span><span class="token function">newRecord</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> rating<span class="token punctuation">.</span>book<span class="token operator">=</span>input<span class="token punctuation">.</span>bookrating<span class="token punctuation">.</span>title<span class="token punctuation">;</span><br /> rating<span class="token punctuation">.</span>stars<span class="token operator">=</span>input<span class="token punctuation">.</span>bookrating<span class="token punctuation">.</span>stars<span class="token punctuation">;</span><br /> rating<span class="token punctuation">.</span>author<span class="token operator">=</span>input<span class="token punctuation">.</span>bookrating<span class="token punctuation">.</span>input<span class="token punctuation">;</span><br /> rating<span class="token punctuation">.</span>genre<span class="token operator">=</span>input<span class="token punctuation">.</span>bookrating<span class="token punctuation">.</span>genre<span class="token punctuation">;</span><br /> rating<span class="token punctuation">.</span>u_comments<span class="token operator">=</span>input<span class="token punctuation">.</span>bookrating<span class="token punctuation">.</span>comments<span class="token punctuation">;</span><br /> rating<span class="token punctuation">.</span><span class="token function">insert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><br /> <span class="token punctuation">}</span><br /> data<span class="token punctuation">.</span>books <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> countRatings <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideAggregate</span><span class="token punctuation">(</span><span class="token string">'x_86691_heardit_ratings'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token comment">//parm1: COUNT, MIN, MAX, parm2: field</span><br /> countRatings<span class="token punctuation">.</span><span class="token function">addAggregate</span><span class="token punctuation">(</span><span class="token string">'COUNT'</span><span class="token punctuation">,</span> <span class="token string">'book'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> countRatings<span class="token punctuation">.</span><span class="token function">addAggregate</span><span class="token punctuation">(</span><span class="token string">'AVG'</span><span class="token punctuation">,</span> <span class="token string">'stars'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> countRatings<span class="token punctuation">.</span><span class="token function">query</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">while</span> <span class="token punctuation">(</span>countRatings<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> book <span class="token operator">=</span> countRatings<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token string">'book'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> ratingCount <span class="token operator">=</span> countRatings<span class="token punctuation">.</span><span class="token function">getAggregate</span><span class="token punctuation">(</span><span class="token string">'COUNT'</span><span class="token punctuation">,</span> <span class="token string">'book'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> averageRating <span class="token operator">=</span> countRatings<span class="token punctuation">.</span><span class="token function">getAggregate</span><span class="token punctuation">(</span><span class="token string">'AVG'</span><span class="token punctuation">,</span> <span class="token string">'stars'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> data<span class="token punctuation">.</span>books<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token punctuation">{</span><br /> <span class="token literal-property property">name</span><span class="token operator">:</span>book<span class="token punctuation">,</span><br /> <span class="token literal-property property">averageRating</span><span class="token operator">:</span>averageRating<span class="token punctuation">,</span><br /> <span class="token literal-property property">ratingCount</span><span class="token operator">:</span> ratingCount<br /> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<!--EndFragment-->
<h2>Form Widget</h2>
<h3>HTML</h3>
<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>form</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>form-horizontal<span class="token punctuation">"</span></span><br /> <span class="token attr-name">ng-model-options</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>{getterSetter: true}<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>fieldset</span><span class="token punctuation">></span></span><br /><br /><span class="token comment"><!-- Form Name --></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>legend</span><span class="token punctuation">></span></span>Form Name<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>legend</span><span class="token punctuation">></span></span><br /><br /><span class="token comment"><!-- Text input--></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>form-group<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>label</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>col-md-4 control-label<span class="token punctuation">"</span></span> <span class="token attr-name">for</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>textinput<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Title<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>label</span><span class="token punctuation">></span></span> <br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>col-md-4<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>input</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>bookTitle<span class="token punctuation">"</span></span> <br /> <span class="token attr-name">ng-model</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">'</span>c.title<span class="token punctuation">'</span></span> <br /> <span class="token attr-name">ng-model-options</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>{getterSetter:true}<span class="token punctuation">"</span></span><br /> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>textinput<span class="token punctuation">"</span></span> <br /> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>text<span class="token punctuation">"</span></span> <br /> <span class="token attr-name">placeholder</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>placeholder<span class="token punctuation">"</span></span> <br /> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>form-control input-md<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><br /><span class="token comment"><!-- Text input--></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>form-group<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>label</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>col-md-4 control-label<span class="token punctuation">"</span></span> <span class="token attr-name">for</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>textinput<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Author<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>label</span><span class="token punctuation">></span></span> <br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>col-md-4<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>input</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>bookAuthor<span class="token punctuation">"</span></span> <br /> <span class="token attr-name">ng-model</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">'</span>c.author<span class="token punctuation">'</span></span> <br /> <span class="token attr-name">ng-model-options</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>{getterSetter:true}<span class="token punctuation">"</span></span><br /> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>textinput<span class="token punctuation">"</span></span> <br /> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>text<span class="token punctuation">"</span></span> <br /> <span class="token attr-name">placeholder</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>placeholder<span class="token punctuation">"</span></span> <br /> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>form-control input-md<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><br /><span class="token comment"><!-- Select Basic --></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>form-group<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>label</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>col-md-4 control-label<span class="token punctuation">"</span></span> <span class="token attr-name">for</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>selectbasic<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Genre<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>label</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>col-md-4<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>select</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>bookGenre<span class="token punctuation">"</span></span> <br /> <span class="token attr-name">ng-model</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">'</span>c.genre<span class="token punctuation">'</span></span> <br /> <span class="token attr-name">ng-model-options</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>{getterSetter:true}<span class="token punctuation">"</span></span><br /> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>selectbasic<span class="token punctuation">"</span></span><br /> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>form-control<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>option</span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Pick One<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>option</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>option</span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Action/Adventure<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Action/Adventure<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>option</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>option</span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Autobiography/Biography/Memoir<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Autobiography/Biography/Memoir<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>option</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>option</span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Children's Fiction<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Children's Fiction<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>option</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>option</span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Comedy/Humor<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Comedy/Humor<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>option</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>option</span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Crime/Mystery<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Crime/Mystery<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>option</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>option</span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Drama/Romance<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Drama/Romance<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>option</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>option</span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>History/Classic<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>History/Classic<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>option</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>option</span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Horror/Paranormal<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Horror/Paranormal<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>option</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>option</span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Motivational/Educational/Health & Wellness<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Motivational/Educational/Health <span class="token entity named-entity" title="&">&amp;</span> Wellness<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>option</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>option</span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Mystery/Suspense/Thriller<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Mystery/Suspense/Thriller<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>option</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>option</span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Poetry<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Poetry<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>option</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>option</span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Religion/Spirituality<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Religion/Spirituality<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>option</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>option</span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Sci-Fi/Fantasy<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Sci-Fi/Fantasy<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>option</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>option</span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Other<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Other<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>option</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>select</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><br /><span class="token comment"><!-- Text input--></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>form-group<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>label</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>col-md-4 control-label<span class="token punctuation">"</span></span> <span class="token attr-name">for</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>textinput<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Stars<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>label</span><span class="token punctuation">></span></span> <br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>col-md-4<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>uib-rating</span> <span class="token attr-name">ng-model</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">'</span>c.stars<span class="token punctuation">'</span></span> <br /> <span class="token attr-name">ng-model-options</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>{getterSetter:true}<span class="token punctuation">"</span></span><br /> <span class="token attr-name">max</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>5<span class="token punctuation">"</span></span><br /> <span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>uib-rating</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><br /><span class="token comment"><!-- Textarea --></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>form-group<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>label</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>col-md-4 control-label<span class="token punctuation">"</span></span> <span class="token attr-name">for</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>textarea<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Comments<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>label</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>col-md-4<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>textarea</span> <span class="token attr-name">ng-model</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">'</span>c.comments<span class="token punctuation">'</span></span> <br /> <span class="token attr-name">ng-model-options</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>{getterSetter:true}<span class="token punctuation">"</span></span><br /> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>form-control<span class="token punctuation">"</span></span> <br /> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>bookComments<span class="token punctuation">"</span></span> <br /> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>bookComments<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>default text<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>textarea</span><span class="token punctuation">></span></span><br /> <br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>fieldset</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>form</span><span class="token punctuation">></span></span></code></pre>
<!--EndFragment-->
<!--StartFragment-->
<h3>Client Script</h3>
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">//Client Script</span><br /><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token comment">/* widget controller */</span><br /> <span class="token keyword">var</span> c <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> shared <span class="token operator">=</span> c<span class="token punctuation">.</span>widget<span class="token punctuation">.</span>options<span class="token punctuation">.</span>shared<span class="token punctuation">;</span><br /> c<span class="token punctuation">.</span><span class="token function-variable function">title</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token function">title</span><span class="token punctuation">(</span><span class="token parameter">newVal</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">return</span> angular<span class="token punctuation">.</span><span class="token function">isDefined</span><span class="token punctuation">(</span>newVal<span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token punctuation">(</span>shared<span class="token punctuation">.</span>title <span class="token operator">=</span> newVal<span class="token punctuation">)</span> <span class="token operator">:</span> shared<span class="token punctuation">.</span>title<span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> c<span class="token punctuation">.</span><span class="token function-variable function">author</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token function">author</span><span class="token punctuation">(</span><span class="token parameter">newVal</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">return</span> angular<span class="token punctuation">.</span><span class="token function">isDefined</span><span class="token punctuation">(</span>newVal<span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token punctuation">(</span>shared<span class="token punctuation">.</span>author <span class="token operator">=</span> newVal<span class="token punctuation">)</span> <span class="token operator">:</span> shared<span class="token punctuation">.</span>author<span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> c<span class="token punctuation">.</span><span class="token function-variable function">genre</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token function">genre</span><span class="token punctuation">(</span><span class="token parameter">newVal</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">return</span> angular<span class="token punctuation">.</span><span class="token function">isDefined</span><span class="token punctuation">(</span>newVal<span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token punctuation">(</span>shared<span class="token punctuation">.</span>genre <span class="token operator">=</span> newVal<span class="token punctuation">)</span> <span class="token operator">:</span> shared<span class="token punctuation">.</span>genre<span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> c<span class="token punctuation">.</span><span class="token function-variable function">stars</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token function">stars</span><span class="token punctuation">(</span><span class="token parameter">newVal</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">return</span> angular<span class="token punctuation">.</span><span class="token function">isDefined</span><span class="token punctuation">(</span>newVal<span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token punctuation">(</span>shared<span class="token punctuation">.</span>stars <span class="token operator">=</span> newVal<span class="token punctuation">)</span> <span class="token operator">:</span> shared<span class="token punctuation">.</span>stars<span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> c<span class="token punctuation">.</span><span class="token function-variable function">comments</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token function">comments</span><span class="token punctuation">(</span><span class="token parameter">newVal</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">return</span> angular<span class="token punctuation">.</span><span class="token function">isDefined</span><span class="token punctuation">(</span>newVal<span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token punctuation">(</span>shared<span class="token punctuation">.</span>comments <span class="token operator">=</span> newVal<span class="token punctuation">)</span> <span class="token operator">:</span> shared<span class="token punctuation">.</span>comments<span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span></code></pre>
<!--EndFragment-->
<h3>Server Script</h3>
<!--StartFragment-->
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">//Server Script</span><br /><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token comment">/* populate the 'data' object */</span><br /> <span class="token comment">/* e.g., data.table = $sp.getValue('table'); */</span><br /><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<!--EndFragment-->
<p>viswam10 thanks for the feedback!</p>
Service Portal: Own your own form2019-08-15T00:32:28Zhttps://jace.pro/post/2019-08-14-sp-own-your-form/Jace Benson<!--StartFragment-->
<p>Sometimes, you have to control your form. You can use the out of box variable types ServiceNow gives you and the messages they give you.</p>
<p>But, sometimes, that won't due. In these times you have own the form. You might asking, "Jace, how do you do that? DOM Manipulation is bad mmkay." You're right, ServiceNow HATES dom manipulation. That will break. I don't suggest that. You can use a custom macro for UI 16, and a SP widget for Mobile/SP things.</p>
<p>This is one way to do that. Really this is just an extension of the work that Cody Esmay and Hunter Wolf did for a <a href="https://sndevs.github.io/meetups/decks/sp-portal-custom-inputs/">lab</a> YEARS ago now.</p>
<p>So one way to do this is to make a variable that you're fulfillers and UI 16 users can interact that will keep the data. Then make a Macro/Widget to control the visibility and value of that first variable.</p>
<p>Here's what I mean. Imagine you have a item to request a Single Board Computer.</p>
<p>Lets say those options are;</p>
<ul>
<li>Raspberry Pi Zero</li>
<li>Raspberry Pi 4</li>
<li>Paperclip</li>
</ul>
<p>And you want to show the spec differences. Normally you'd have to let <a href="https://blog.jace.pro/g%5C_form/#mobile-showfieldmsg"><code>g_form.showFieldMsg</code></a> do the heavy lifting.</p>
<p>This time it's different. You know that paperclip needs an image. And you know what image it needs. Clippy.</p>
<p>So follow these steps;</p>
<ol>
<li>Create the item</li>
<li>Create a variable to store the value you actually will use for workflow and task visibility</li>
<li>Create a variable of type "Macro"</li>
<li>Create a widget for the macro</li>
<li>Build the HTML you want. I generally use <a href="https://bootsnipp.com/forms">bootsnipp</a> to build that</li>
<li>Add some JS to access <code>g_form</code>, hide the variable from Step 2. Add a ng-change attribute and have that set the now hidden variable from Step 2</li>
<li>Add some cool ng-bind to dynamically create some html</li>
</ol>
<p>Here's what that could look like.</p>
<!--EndFragment-->
<p><img src="https://jace.pro/static/img/2019-08-14-sp-own-your-form.gif" alt="" /></p>
<!--StartFragment-->
<p>Here's the code used for that example;</p>
<!--EndFragment-->
<!--StartFragment-->
<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span><br /> <span class="token comment"><!-- your widget template --></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>form</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>form-horizontal<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>fieldset</span><span class="token punctuation">></span></span><br /><br /> <span class="token comment"><!-- Form Name --></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>legend</span><span class="token punctuation">></span></span>Form Name<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>legend</span><span class="token punctuation">></span></span><br /><br /> <span class="token comment"><!-- Select Basic --></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>form-group<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>col-md-6<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>label</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>col-md-4 control-label<span class="token punctuation">"</span></span> <span class="token attr-name">for</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>selectbasic<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Hardware<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>label</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>col-md-4<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>select</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>selectbasic<span class="token punctuation">"</span></span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>selectbasic<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>form-control<span class="token punctuation">"</span></span> <span class="token attr-name">ng-change</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>c.setVariable()<span class="token punctuation">"</span></span> <span class="token attr-name">ng-model</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>c.hardwareSelected<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>option</span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>paperclip<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Paperclip<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>option</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>option</span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>rpi4<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Raspberry Pi 4<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>option</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>option</span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>rpi0<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Raspberry Pi 0<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>option</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>select</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>col-md-6<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>description<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>p</span> <span class="token attr-name">ng-bind-html</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>c.hardwareOptions[c.hardwareSelected]<span class="token punctuation">"</span></span> <span class="token attr-name">ng-model</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>c.hardwareOptions[c.hardwareSelected]<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>p</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>fieldset</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>form</span><span class="token punctuation">></span></span><br /><br /><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span></code></pre>
<!--StartFragment-->
<p>The Client JS</p>
<!--EndFragment-->
<!--StartFragment-->
<pre class="language-javascript"><code class="language-javascript"><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">$scope</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token comment">//This is the controller, we've included $scope in the function above because it's easy to work with</span><br /> <span class="token keyword">var</span> c <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">;</span><br /> <br /> <span class="token comment">//We are going to simplify accessing g_form within the client script by setting it as a variable named g_form</span><br /> <span class="token keyword">var</span> g_form <span class="token operator">=</span> $scope<span class="token punctuation">.</span>page<span class="token punctuation">.</span>g_form<span class="token punctuation">;</span><br /> <span class="token comment">//We are going to simplify accessing g_form within the HTML by setting it as a $scope attribute</span><br /> $scope<span class="token punctuation">.</span>g_form <span class="token operator">=</span> $scope<span class="token punctuation">.</span>page<span class="token punctuation">.</span>g_form<span class="token punctuation">;</span><br /> g_form<span class="token punctuation">.</span><span class="token function">setDisplay</span><span class="token punctuation">(</span><span class="token string">'hardware_sku'</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> c<span class="token punctuation">.</span><span class="token function-variable function">setVariable</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> g_form<span class="token punctuation">.</span><span class="token function">setValue</span><span class="token punctuation">(</span><span class="token string">'hardware_sku'</span><span class="token punctuation">,</span> c<span class="token punctuation">.</span>hardwareSelected<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> c<span class="token punctuation">.</span>hardwareSelected <span class="token operator">=</span> <span class="token string">'Hello?'</span><span class="token punctuation">;</span><br /> c<span class="token punctuation">.</span>hardwareOptions <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span><br /> c<span class="token punctuation">.</span>hardwareOptions<span class="token punctuation">.</span>paperclip <span class="token operator">=</span> <span class="token string">"This is an amazing bar of steel bent in and important way!"</span><span class="token punctuation">;</span><br /> c<span class="token punctuation">.</span>hardwareOptions<span class="token punctuation">.</span>paperclip <span class="token operator">+=</span> <span class="token string">"<img src='https://i.ytimg.com/vi/a3qlc2ivES8/hqdefault.jpg' />"</span><br /> c<span class="token punctuation">.</span>hardwareOptions<span class="token punctuation">.</span>rpi4 <span class="token operator">=</span> <span class="token string">"It's new... and the USB-C has issues"</span><span class="token punctuation">;</span><br /> c<span class="token punctuation">.</span>hardwareOptions<span class="token punctuation">.</span>rpi0 <span class="token operator">=</span> <span class="token string">"It's small and comes with wifi"</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span></code></pre>
<!--EndFragment-->New York Features: Auto Suggest, JS Beautify & Context Menus2019-08-12T00:30:23Zhttps://jace.pro/post/2019-08-11-script-field-click-events/Jace Benson<!--StartFragment-->
<p>New york has a few, nice things added for developers if you still work in the tool and not on some syncer.</p>
<p>This feature specifically is barely noted. Here's the link to the <a href="https://docs.servicenow.com/bundle/newyork-release-notes/page/release-notes/summary/rn-summary-new-features.html">documentation</a>.<br />
However, it's so short I'll put the text here too;</p>
<blockquote>
<p>HTML auto-suggestions<br />
Edit HTML and Jelly scripts and define what is rendered when the page is displayed.<br />
The script can contain either static XHTML or dynamically generated content that is defined as Jelly and can call script includes and UI macros.<br />
JS Beautify<br />
Format code by applying the proper indentation to the script.<br />
Context menu<br />
Enable the context menu options for script includes, Glide APIs, and tables in the JavaScript editor.<br />
<br />
With the context menu options, your users can navigate to:\</p>
<ul>
<li>Script include definitions\</li>
<li>Glide API documentation\</li>
<li>System and custom table definitions and data</li>
</ul>
</blockquote>
<p>Well here I'm going to go over the them.</p>
<h2><a href="https://jace.pro/post/2019-08-11-script-field-click-events/#html-auto-suggestions">HTML auto-suggestions</a></h2>
<p>Well this is a very overdue convenience. But at least it's here... Or it's allegedly here. When I tried it by going toa new UI page, modify the XML adding <code><div>test</code> then starting to type <code></</code> nothing came up.. so maybe this isn't here.</p>
<h2><a href="https://jace.pro/post/2019-08-11-script-field-click-events/#js-beautify">JS Beautify</a></h2>
<p>This isn't really clear that you <strong>apply you're own settings</strong> here. However you can. It's controlled via this property, <a href="https://jace.pro/properties/glide.ui.syntax_editor.linter.eslint_config/"><code>glide.ui.syntax_editor.linter.eslint_config</code></a>.<br />
This appears to just take a eslint json config object. An example one would be like this;</p>
<pre class="language-json"><code class="language-json"><span class="token punctuation">{</span><br /> <span class="token property">"rules"</span><span class="token operator">:</span> <span class="token punctuation">{</span><br /> <span class="token property">"constructor-super"</span><span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"no-case-declarations"</span><span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"no-class-assign"</span><span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"no-compare-neg-zero"</span><span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"no-cond-assign"</span><span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"no-console"</span><span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"no-const-assign"</span><span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"no-constant-condition"</span><span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"no-control-regex"</span><span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"no-debugger"</span><span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"no-delete-var"</span><span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"no-dupe-args"</span><span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"no-dupe-class-members"</span><span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"no-dupe-keys"</span><span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"no-duplicate-case"</span><span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"no-empty-character-class"</span><span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"no-empty-pattern"</span><span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"no-empty"</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token string">"warn"</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> <span class="token property">"allowEmptyCatch"</span><span class="token operator">:</span> <span class="token boolean">true</span> <span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token punctuation">,</span><br /> <span class="token property">"no-ex-assign"</span><span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"no-extra-boolean-cast"</span><span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"no-extra-semi"</span><span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"semi"</span> <span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"no-fallthrough"</span><span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"no-func-assign"</span><span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"no-global-assign"</span><span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"no-inner-declarations"</span><span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"no-invalid-regexp"</span><span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"no-irregular-whitespace"</span><span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"no-mixed-spaces-and-tabs"</span><span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"no-new-symbol"</span><span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"no-obj-calls"</span><span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"no-octal"</span><span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"no-redeclare"</span><span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"no-regex-spaces"</span><span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"no-self-assign"</span><span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"no-sparse-arrays"</span><span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"no-this-before-super"</span><span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"no-undef"</span><span class="token operator">:</span> <span class="token string">"off"</span><span class="token punctuation">,</span><br /> <span class="token property">"no-unexpected-multiline"</span><span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"no-unreachable"</span><span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"no-unsafe-finally"</span><span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"no-unsafe-negation"</span><span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"no-unused-labels"</span><span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"no-unused-vars"</span><span class="token operator">:</span> <span class="token string">"off"</span><span class="token punctuation">,</span><br /> <span class="token property">"no-useless-escape"</span><span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"require-yield"</span><span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"use-isnan"</span><span class="token operator">:</span> <span class="token string">"warn"</span><span class="token punctuation">,</span><br /> <span class="token property">"valid-typeof"</span><span class="token operator">:</span> <span class="token string">"warn"</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span></code></pre>
<p>Feel free to read more up on eslint <a href="https://eslint.org/docs/user-guide/configuring">here on their docs site</a>.</p>
<p>Also thanks <a href="https://twitter.com/DoomaSimunek/status/1157404260327407617">Dominik Simunek</a> for the info to look into this.</p>
<h2><a href="https://jace.pro/post/2019-08-11-script-field-click-events/#context-menus-for-script-fields">Context Menus for script fields</a></h2>
<p>I noticed the context menu thing before I read about it. If you have a script include or client script where you invoke some script include, they now show up <strong>bold</strong> and <em>italicized</em>. If you right-click on anything like that, you'll get a few options;</p>
<ul>
<li>Show Documentation (which will bring you to <a href="http://docs.servicenow.com/">docs.servicenow.com</a> for that object)</li>
<li>Show Definition (which will bring you to the table definition of the content)</li>
<li>Show Data (which will bring you to the table list of data)</li>
<li>Open Definition (which will bring you to the script include)</li>
</ul>
<p>This might seem small but man, will this save me time.</p>
<!--EndFragment-->New York Feature: Remote Tables2019-08-11T00:28:11Zhttps://jace.pro/post/2019-08-10-remote-tables/Jace Benson<!--StartFragment-->
<p>Making a remote table could be less work but as it is, it's better than what was before.</p>
<p>If you are okay with <em>read only</em> data from another system then this is actually pretty good.</p>
<p>To use this you'll need to create a Table still that will have columns for the columns defined in the script. So the real benefit is just keeping the data up to date and OUT of ServiceNow.</p>
<p>For this example I'm going to use <a href="https://www.alphavantage.co/">https://www.alphavantage.co/</a> to get Stock information.</p>
<p>The table I'm going to make is going to have the data for the quote api. It has this data in a response for this;</p>
<p><code>https://www.alphavantage.co/query?function=GLOBAL_QUOTE&symbol=MSFT&apikey=demo</code></p>
<!--EndFragment-->
<!--StartFragment-->
<pre class="language-json"><code class="language-json"><span class="token punctuation">{</span><br /> <span class="token property">"Global Quote"</span><span class="token operator">:</span> <span class="token punctuation">{</span><br /> <span class="token property">"01. symbol"</span><span class="token operator">:</span> <span class="token string">"MSFT"</span><span class="token punctuation">,</span><br /> <span class="token property">"02. open"</span><span class="token operator">:</span> <span class="token string">"138.6100"</span><span class="token punctuation">,</span><br /> <span class="token property">"03. high"</span><span class="token operator">:</span> <span class="token string">"139.3800"</span><span class="token punctuation">,</span><br /> <span class="token property">"04. low"</span><span class="token operator">:</span> <span class="token string">"136.4600"</span><span class="token punctuation">,</span><br /> <span class="token property">"05. price"</span><span class="token operator">:</span> <span class="token string">"137.7100"</span><span class="token punctuation">,</span><br /> <span class="token property">"06. volume"</span><span class="token operator">:</span> <span class="token string">"23466701"</span><span class="token punctuation">,</span><br /> <span class="token property">"07. latest trading day"</span><span class="token operator">:</span> <span class="token string">"2019-08-09"</span><span class="token punctuation">,</span><br /> <span class="token property">"08. previous close"</span><span class="token operator">:</span> <span class="token string">"138.8900"</span><span class="token punctuation">,</span><br /> <span class="token property">"09. change"</span><span class="token operator">:</span> <span class="token string">"-1.1800"</span><span class="token punctuation">,</span><br /> <span class="token property">"10. change percent"</span><span class="token operator">:</span> <span class="token string">"-0.8496%"</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span></code></pre>
<!--EndFragment-->
<!--StartFragment-->
<p>So I'll store all of it and use the "symbol" as the unique key, some how. It has to be a "sys_id" but... in this case "MSFT" isn't long enough. I guess we'll get there when we get there.</p>
<p>So here's the steps I'm taking in order (in global)</p>
<ol>
<li>Create a remote table (<code>u_st_stock</code>)</li>
<li>Create columns;</li>
</ol>
<ul>
<li><code>u_symbol</code> - String</li>
<li><code>u_open</code> - Floating Point Number</li>
<li><code>u_high</code> - Floating Point Number</li>
<li><code>u_low</code> - Floating Point Number</li>
<li><code>u_price</code> - Floating Point Number</li>
<li><code>u_volume</code> - Integer</li>
<li><code>u_latest_trading_day</code> - Date</li>
<li><code>u_previous_close</code> - Floating Point Number</li>
<li><code>u_change</code> - Floating Point Number</li>
<li><code>u_change_percent</code> - Floating Point Number</li>
</ul>
<ol start="3">
<li>Create a Remote Table Definition(<code>sys_script_vtable</code>)</li>
</ol>
<ul>
<li>This is not as simple as I'd like. I was hoping to use some simple stock price for the NYSE however, there is not a good source for that in its entirety.<br />
So I defaulted it to load 5 stocks and if a search occurred, I returned those results. But pretty much if your data is rate limited, or doesn't allow return of > 5 records, this becomes really painful.</li>
<li>Also if you need it to work with searches, it seems that the only way to get field searches is to get the encoded query and parse the bits out. There is no helper function for that if the search is a field STARTSWITH, ENDSWITH or CONTAINS which is used if you have the inputs on the headers of the list.</li>
<li>Feel free to try this out yourself with this code;</li>
</ul>
<!--EndFragment-->
<!--StartFragment-->
<pre class="language-javascript"><code class="language-javascript"><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token function">executeQuery</span><span class="token punctuation">(</span><span class="token parameter">v_table<span class="token punctuation">,</span> v_query</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">function</span> <span class="token function">getKey</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">return</span> <span class="token string">""</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">function</span> <span class="token function">getStock</span><span class="token punctuation">(</span><span class="token parameter">ticker</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">var</span> endpoint <span class="token operator">=</span> <span class="token string">"https://www.alphavantage.co/query?function=GLOBAL_QUOTE&symbol="</span><span class="token punctuation">;</span><br /> endpoint <span class="token operator">+=</span> ticker <span class="token operator">+</span> <span class="token string">"&apikey="</span> <span class="token operator">+</span> <span class="token function">getKey</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> restMessage <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">sn_ws<span class="token punctuation">.</span>RESTMessageV2</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> restMessage<span class="token punctuation">.</span><span class="token function">setHttpMethod</span><span class="token punctuation">(</span><span class="token string">"get"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> restMessage<span class="token punctuation">.</span><span class="token function">setEndpoint</span><span class="token punctuation">(</span>endpoint<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> restMessage<span class="token punctuation">.</span><span class="token function">setRequestBody</span><span class="token punctuation">(</span><span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">stringify</span><span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> response <span class="token operator">=</span> restMessage<span class="token punctuation">.</span><span class="token function">execute</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> error <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">haveError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>error<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> errorCode <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">getErrorCode</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> errorMsg <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">getErrorMessage</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> headerVal <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">getHeader</span><span class="token punctuation">(</span><span class="token string">"Content-Type"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> headers <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">getHeaders</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> queryString <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">getQueryString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> statusCode <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">getStatusCode</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> responseBody <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">getBody</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> responseObj <span class="token operator">=</span> <span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">parse</span><span class="token punctuation">(</span>responseBody<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <br /> gs<span class="token punctuation">.</span><span class="token function">addErrorMessage</span><span class="token punctuation">(</span>responseBody<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token keyword">typeof</span> responseObj<span class="token punctuation">[</span><span class="token string">"Global Quote"</span><span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">"object"</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">var</span> quote <span class="token operator">=</span> responseObj<span class="token punctuation">[</span><span class="token string">"Global Quote"</span><span class="token punctuation">]</span><span class="token punctuation">;</span><br /> v_table<span class="token punctuation">.</span><span class="token function">addRow</span><span class="token punctuation">(</span><span class="token punctuation">{</span><br /> <span class="token literal-property property">sys_id</span> <span class="token operator">:</span> ticker<span class="token punctuation">,</span><br /> <span class="token literal-property property">u_symbol</span> <span class="token operator">:</span> quote<span class="token punctuation">[</span><span class="token string">"01. symbol"</span><span class="token punctuation">]</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">u_open</span> <span class="token operator">:</span> quote<span class="token punctuation">[</span><span class="token string">"02. open"</span><span class="token punctuation">]</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">u_high</span> <span class="token operator">:</span> quote<span class="token punctuation">[</span><span class="token string">"03. high"</span><span class="token punctuation">]</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">u_low</span> <span class="token operator">:</span> quote<span class="token punctuation">[</span><span class="token string">"04. low"</span><span class="token punctuation">]</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">u_price</span> <span class="token operator">:</span> quote<span class="token punctuation">[</span><span class="token string">"05. price"</span><span class="token punctuation">]</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">u_volume</span> <span class="token operator">:</span> quote<span class="token punctuation">[</span><span class="token string">"06. volume"</span><span class="token punctuation">]</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">u_latest_trading_day</span><span class="token operator">:</span> quote<span class="token punctuation">[</span><span class="token string">"07. latest trading day"</span><span class="token punctuation">]</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">u_previous_close</span> <span class="token operator">:</span> quote<span class="token punctuation">[</span><span class="token string">"08. previous close"</span><span class="token punctuation">]</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">u_change</span> <span class="token operator">:</span> quote<span class="token punctuation">[</span><span class="token string">"09. change"</span><span class="token punctuation">]</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">u_change_percent</span> <span class="token operator">:</span> <span class="token function">parseFloat</span><span class="token punctuation">(</span>quote<span class="token punctuation">[</span><span class="token string">"10. change percent"</span><span class="token punctuation">]</span><span class="token punctuation">)</span><br /> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><br /> gs<span class="token punctuation">.</span><span class="token function">addErrorMessage</span><span class="token punctuation">(</span>responseBody<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> v_table<span class="token punctuation">.</span><span class="token function">addRow</span><span class="token punctuation">(</span><span class="token punctuation">{</span><br /> <span class="token literal-property property">sys_id</span> <span class="token operator">:</span> ticker<span class="token punctuation">,</span><br /> <span class="token literal-property property">u_symbol</span> <span class="token operator">:</span> ticker<br /> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">function</span> <span class="token function">getTickers</span><span class="token punctuation">(</span><span class="token parameter">keyword</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <br /> <span class="token keyword">var</span> endpoint <span class="token operator">=</span> <span class="token string">"https://www.alphavantage.co/query?function=SYMBOL_SEARCH&keywords="</span><span class="token punctuation">;</span><br /> endpoint <span class="token operator">+=</span> keyword <span class="token operator">+</span> <span class="token string">"&apikey="</span> <span class="token operator">+</span> <span class="token function">getKey</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> restMessage <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">sn_ws<span class="token punctuation">.</span>RESTMessageV2</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> restMessage<span class="token punctuation">.</span><span class="token function">setHttpMethod</span><span class="token punctuation">(</span><span class="token string">"get"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> restMessage<span class="token punctuation">.</span><span class="token function">setEndpoint</span><span class="token punctuation">(</span>endpoint<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> restMessage<span class="token punctuation">.</span><span class="token function">setRequestBody</span><span class="token punctuation">(</span><span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">stringify</span><span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> response <span class="token operator">=</span> restMessage<span class="token punctuation">.</span><span class="token function">execute</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> error <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">haveError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>error<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> errorCode <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">getErrorCode</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> errorMsg <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">getErrorMessage</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> headerVal <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">getHeader</span><span class="token punctuation">(</span><span class="token string">"Content-Type"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> headers <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">getHeaders</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> queryString <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">getQueryString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> statusCode <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">getStatusCode</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> responseBody <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">getBody</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> responseObj <span class="token operator">=</span> <span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">parse</span><span class="token punctuation">(</span>responseBody<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span><span class="token punctuation">(</span>responseObj<span class="token punctuation">[</span><span class="token string">"bestMatches"</span><span class="token punctuation">]</span><span class="token punctuation">.</span>length<span class="token operator">></span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> responseObj<span class="token punctuation">[</span><span class="token string">"bestMatches"</span><span class="token punctuation">]</span><span class="token punctuation">.</span>length <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> matches <span class="token operator">=</span> responseObj<span class="token punctuation">[</span><span class="token string">"bestMatches"</span><span class="token punctuation">]</span><span class="token punctuation">;</span><br /> matches<span class="token punctuation">.</span><span class="token function">forEach</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">match</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">if</span><span class="token punctuation">(</span>match<span class="token punctuation">[</span><span class="token string">"4. region"</span><span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">"United States"</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token function">getStock</span><span class="token punctuation">(</span>match<span class="token punctuation">[</span><span class="token string">"1. symbol"</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">try</span> <span class="token punctuation">{</span><br /> <span class="token comment">/*<br /> on list load... load these 10 <br /> Load now, and 9 others<br /> now<br /> goog<br /> msft<br /> aapl<br /> uber<br /> expe<br /> ko<br /> pep<br /> tsla<br /> amzn<br /> tgt<br /> */</span><br /> <span class="token comment">//https://www.alphavantage.co/query?function=GLOBAL_QUOTE&symbol=MSFT&apikey=demo</span><br /> <span class="token keyword">var</span> defaultStocks <span class="token operator">=</span> <span class="token punctuation">[</span><br /> <span class="token string">'now'</span><span class="token punctuation">,</span><br /> <span class="token string">'goog'</span><span class="token punctuation">,</span><br /> <span class="token string">'aapl'</span><span class="token punctuation">,</span><br /> <span class="token string">'tsla'</span><span class="token punctuation">,</span><br /> <span class="token string">'amzn'</span><span class="token punctuation">,</span><br /> <span class="token punctuation">]</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span><span class="token punctuation">(</span>v_query<span class="token punctuation">.</span><span class="token function">isGet</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token function">getStock</span><span class="token punctuation">(</span>v_query<span class="token punctuation">.</span><span class="token function">getSysId</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><br /> <span class="token comment">//list lookup</span><br /> gs<span class="token punctuation">.</span><span class="token function">addInfoMessage</span><span class="token punctuation">(</span>v_query<span class="token punctuation">.</span><span class="token function">getEncodedQuery</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> query <span class="token operator">=</span> v_query<span class="token punctuation">.</span><span class="token function">getEncodedQuery</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span><span class="token punctuation">(</span>query<span class="token punctuation">.</span><span class="token function">indexOf</span><span class="token punctuation">(</span><span class="token string">'STARTSWITH'</span><span class="token punctuation">)</span><span class="token operator">>=</span><span class="token number">0</span> <span class="token operator">||</span> <br /> query<span class="token punctuation">.</span><span class="token function">indexOf</span><span class="token punctuation">(</span><span class="token string">'CONTAINS'</span><span class="token punctuation">)</span><span class="token operator">>=</span><span class="token number">0</span> <span class="token operator">||</span> <br /> query<span class="token punctuation">.</span><span class="token function">indexOf</span><span class="token punctuation">(</span><span class="token string">'ENDSWITH'</span><span class="token punctuation">)</span><span class="token operator">>=</span><span class="token number">0</span><br /> <span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">var</span> keyword<span class="token punctuation">;</span><br /> <span class="token keyword">var</span> keyword1 <span class="token operator">=</span> query<span class="token punctuation">.</span><span class="token function">split</span><span class="token punctuation">(</span><span class="token string">'STARTSWITH'</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> keyword2 <span class="token operator">=</span> query<span class="token punctuation">.</span><span class="token function">split</span><span class="token punctuation">(</span><span class="token string">'CONTAINS'</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> keyword3 <span class="token operator">=</span> query<span class="token punctuation">.</span><span class="token function">split</span><span class="token punctuation">(</span><span class="token string">'ENDSWITH'</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span><span class="token punctuation">(</span>keyword1<span class="token punctuation">)</span><span class="token punctuation">{</span><br /> keyword <span class="token operator">=</span> keyword1<span class="token punctuation">.</span><span class="token function">split</span><span class="token punctuation">(</span><span class="token string">'^'</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">if</span><span class="token punctuation">(</span>keyword2<span class="token punctuation">)</span><span class="token punctuation">{</span><br /> keyword <span class="token operator">=</span> keyword2<span class="token punctuation">.</span><span class="token function">split</span><span class="token punctuation">(</span><span class="token string">'^'</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">if</span><span class="token punctuation">(</span>keyword3<span class="token punctuation">)</span><span class="token punctuation">{</span><br /> keyword <span class="token operator">=</span> keyword3<span class="token punctuation">.</span><span class="token function">split</span><span class="token punctuation">(</span><span class="token string">'^'</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token function">getTickers</span><span class="token punctuation">(</span>keyword<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token comment">//if search is happening... lookup those tickers</span><br /> <span class="token comment">//https://www.alphavantage.co/query?function=SYMBOL_SEARCH&keywords=target&apikey=</span><br /><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><br /> <span class="token comment">//not searched load default</span><br /> defaultStocks<span class="token punctuation">.</span><span class="token function">forEach</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">ticker</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token function">getStock</span><span class="token punctuation">(</span>ticker<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /><br /> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>ex<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> v_query<span class="token punctuation">.</span><span class="token function">setLastErrorMessage</span><span class="token punctuation">(</span>ex<span class="token punctuation">.</span>message<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> gs<span class="token punctuation">.</span><span class="token function">addErrorMessage</span><span class="token punctuation">(</span>ex<span class="token punctuation">.</span>message<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">return</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token comment">// Main API:</span><br /> <span class="token comment">// v_table.addRow({ ... }) - adds a row to the result set</span><br /><br /> <span class="token comment">// There are also query helper methods</span><br /> <span class="token comment">// v_query.getEncodedQuery() - returns encoded querystring</span><br /> <span class="token comment">// v_query.getCondition(field) - returns encoded querystring for the given field (includes field name, operator, and value)</span><br /> <span class="token comment">// v_query.getParameter(field) - returns parameter for the given field (only includes value for equality conditions)</span><br /> <span class="token comment">// v_query.isGet() - returns whether the query is a single get by sys_id</span><br /> <span class="token comment">// v_query.getSysId() - returns parameter for sys_id field</span><br /> <span class="token comment">// v_query.isTextSearch() - returns whether the query contains a text query parameter</span><br /> <span class="token comment">// v_query.getTextSearch() - returns text search query parameter (internal field name 123TEXTQUERY321)</span><br /> <span class="token comment">// v_query.getFirstRowWanted() - returns the first row to include</span><br /> <span class="token comment">// v_query.getLastRowWanted() - returns the last row to include</span><br /><br /> <span class="token comment">// Note: You must define sys_id for each row so that forms and lists for this table work properly</span><br /><br /> <span class="token comment">// Your code goes here</span><br /> <span class="token comment">// v_table.addRow({...})</span><br /><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">(</span>v_table<span class="token punctuation">,</span> v_query<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<!--EndFragment-->
<!--StartFragment-->
<p>TL;DR - Remote tables are neat, but have some limitations. It does lower the work for a READ ONLY integration, however, it all really depends on your API.</p>
<!--EndFragment-->Why use a Service Account2019-08-08T00:26:59Zhttps://jace.pro/post/2019-08-07-service-accounts/Jace Benson<!--StartFragment-->
<p>On Slack someone asked me to post about service accounts.</p>
<blockquote>
<p>Could anyone define some advantages of using a service account rather than a user account when it comes to integrations?</p>
</blockquote>
<p>There was a three pros right away;</p>
<ul>
<li>Doesn't depend on user being employed</li>
<li>Generally can be excused from password reset policies</li>
<li>Granular permissions</li>
</ul>
<h2>How one is made</h2>
<p>Check the "Web Services Access Only" on the user account. It's part of the <a href="https://docs.servicenow.com/bundle/london-platform-administration/page/administer/users-and-groups/concept/c_NonInteractiveSessions.html">Non-Interactive Session Plugin</a>.</p>
<p>Now this is where this post was going to end. I had gone into how I do service accounts.</p>
<h2>How I manage them</h2>
<ol>
<li>Create a group called "ServiceNow Service Accounts"</li>
<li>We have a process in place when someone wants to be added to a group they submit and item. It has an approval to the manager. If Approved a script adds them to the group. Otherwise they don't get added.</li>
<li>Once added to the group the roles attached, <code>itil</code>, and <code>rest_api_explorer</code> are given. You could add other older roles like the SOAP roles but we encourage REST.</li>
<li>Let the owner of the service account figure out their calls.</li>
<li>Once those calls are sorted. Remove gui access.</li>
</ol>
<p>We use SSO so user's can't use their personal account to do the REST calls outside of the browser. We make the new user have a manager of the person who is asking for the service account. If the service account needs more access, we can add it to other groups where the access is proper. I do intend to write up something or link to something to help convey what the APIs are they have access to but generally I point them to the <a href="https://docs.servicenow.com/bundle/london-application-development/page/integrate/inbound-rest/concept/c_RESTAPIExplorer.html">Rest API Explorer</a></p>
<p>Further Reading: <a href="https://community.servicenow.com/community?id=community_blog&sys_id=b4fca2a5dbd0dbc01dcaf3231f961900">https://community.servicenow.com/community?id=community_blog&sys_id=b4fca2a5dbd0dbc01dcaf3231f961900</a></p>
<!--EndFragment-->Save Time, Money, and Resources by Asking Why2019-08-08T00:11:44Zhttps://jace.pro/post/2019-08-07-ask-why/Jace Benson<p>There are problems we should be solving, but they're not part of any requirements. That's where you come in. Use your professional skills to help us shape a solution that will make our customers happy, without breaking the bank.</p>
<p>I've been on most sides of the equation when it comes to this. I started as a help desk technician. Then I tried to help define the requirements that we needed. I've been a consultant where I fulfilled the requirements. Now I'm a customer again. When you're a customer, you don't care how it works, just that it works. At least that was my opinion back then. Now, I push back. <strong>I ask why</strong>. I get the details that drive to the question, "<strong>What business problem does this solve?</strong>" You should to.</p>
<h2>You are the expert</h2>
<p>You were hired or at least you are probably working as the subject matter expert. If you didn't push back or give reasons <strong>why</strong> the requirement they've given is poor/bad why wouldn't they keep doing this? When someone asks;</p>
<blockquote>
<p>Customer: Hey SME, Add this checkbox on Incident called "Outage"</p>
<p>You: I can do that, but <em>why</em> do you want this?</p>
</blockquote>
<p>That's all this post is about.<br />
Until they give you the reason, or the business problem this solves. I'd wait to do it.</p>
<p>I've spent countless hours head down working on code that never got released because I never asked this. Sure. They are paying you either via payroll or via a contract, but, if you didn't ask you wouldn't be doing you're job. It's critical you ask.</p>
<h2>How I handle poor requirements</h2>
<p>I'll go over adding that field above.</p>
<blockquote>
<p>Customer: Hey SME, Add this checkbox on Incident called "Outage"</p>
<p>You: I can do that, but <em>why</em> do you want this?</p>
<p>Customer: Don't ask why, just do it.</p>
<p>You: If I didn't ask, you could hire anyone to do this.<br />
I've done this in the past, and knowing <em>why</em> is crucial to ensuring this is the right thing to solve the problem.<br />
When you don't present a problem, it's concerning because you might not be considering other factors.</p>
<p>Customer: Like what? Less is worst!</p>
<p>You: Licensing, whose maintaining the value of the field, what is going to keep it in check,<br />
and setting an expectation that anyone can add an arbitrary number of fields on incident.</p>
<p>Customer: This is just for reporting. We want to know when and for what customers an incident is considered an outage.</p>
<p>You: ...🤦♂️</p>
</blockquote>
<p>You can see how this might keep going down different ways. Maybe the right call here is use the <code>cmdb_ci_outage</code>table. Maybe the right call is to use a metric. In any case. Adding a field is probably not the right way to solve this.</p>
<p>Let me end here by quoting Chuck's ending remarks;</p>
<blockquote>
<ul>
<li>First, Seek to understand their needs. Don't take their solution at face value when you haven't understood the problem. Ask why.</li>
<li>If necessary, consult the community for additional knowledge in the matter.</li>
<li>Offer options.</li>
<li>Finally, make your recommendation based on their needs.<br />
<a href="https://community.servicenow.com/community?id=community_blog&sys_id=7c9ceae1dbd0dbc01dcaf3231f9619da">Chuck Tomasi</a></li>
</ul>
</blockquote>
<p>By asking why, you could short circuit any solution saving you and colleagues loads of time, the customers money, and wasted resources.</p>
Quick Guide: New York2019-07-26T23:56:14Zhttps://jace.pro/post/2019-07-26-new-york/Jace Benson<!--StartFragment-->
<p>Here's my take of whats new with New York</p>
<p>Deprecated things</p>
<ul>
<li>
<p><a href="https://docs.servicenow.com/bundle/newyork-application-development/page/script/processors/concept/c_Processors.html">Processors-Listed under changes</a></p>
<ul>
<li>Note: This feature is deprecated. While legacy, custom processors will continue to be supported, creating new custom processors has been deprecated. Instead, please use the Scripted REST APIs. The following information is left in the documentation for existing processors only.</li>
<li><strong>You can still create them, so it's just a recommendation</strong></li>
</ul>
</li>
<li>
<p><a href="https://jace.pro/properties/mid.download.through.instance/">Mid server property mid.download.through.instance</a></p>
<ul>
<li>In previous releases, this property was set to true to force all MID Servers to upgrade through the instance and was configurable by customers. In the New York release, auto-upgrades are performed by the MID Server host computer and not by the instance. To implement this behavior, the default value of this property was changed to <strong>false</strong>, and the property was concealed to protect the setting. DO NOT change the value of this property.</li>
</ul>
</li>
</ul>
<p><a href="https://docs.servicenow.com/bundle/newyork-release-notes/page/release-notes/summary/rn-summary-changes.html">Updated things</a></p>
<ul>
<li>
<p><a href="https://docs.servicenow.com/bundle/newyork-it-service-management/page/product/service-catalog-management/concept/c_ServiceCatalogVariableSets.html">Multi-row variable set</a></p>
<ul>
<li>When you clone a request that contains a multi-row variable set, the information that is specified in the multi-row variable set is available in all cloned requests.</li>
<li>A multi-row variable set is now visible in the variable summarizer in Service Portal.</li>
<li>Set a limit to the number of rows that you can add to a multi-row variable set by using the `max_rows` attribute in the Variable Set attributes field.</li>
</ul>
</li>
</ul>
<p><a href="https://docs.servicenow.com/bundle/newyork-release-notes/page/release-notes/summary/rn-summary-new-features.html">New things</a></p>
<ul>
<li>
<p>Remote Tables</p>
<ul>
<li>
<p><a href="https://docs.servicenow.com/bundle/newyork-servicenow-platform/page/administer/remote-tables/concept/remote-tables.html">Retrieve external data using remote tables and scripts</a>\</p>
<ul>
<li>retrieve the data from external sources or from another instance with REST or SOAP services. The external data lives in the memory in read-only mode, which makes the data temporary, or transient, within the Now Platform. You can then view and manipulate the external data without importing or storing it.</li>
<li>Plugin: "Remote Tables" or <code>com.glide.script.vtable</code></li>
<li>Recommended limit is 1000 records</li>
<li>example use cases;</li>
<li>weather-related data that appears on a homepage when a user logs in.</li>
<li>customer details that are stored in an external Customer Relationship Management</li>
<li>personnel data from Human Capital Management</li>
<li>Example working script;</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre class="language-javascript"><code class="language-javascript"> <span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token function">executeQuery</span><span class="token punctuation">(</span><span class="token parameter">v_table<span class="token punctuation">,</span> v_query</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">try</span> <span class="token punctuation">{</span><br /> <span class="token comment">// <https://randomuser.me/api/>\</span><br /> <span class="token keyword">var</span> requestBody <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> restMessage <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">sn_ws<span class="token punctuation">.</span>RESTMessageV2</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> restMessage<span class="token punctuation">.</span><span class="token function">setHttpMethod</span><span class="token punctuation">(</span><span class="token string">"get"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> restMessage<span class="token punctuation">.</span><span class="token function">setEndpoint</span><span class="token punctuation">(</span><span class="token string">"<https://randomuser.me/api/?results=1000&seed=foobar>"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>\<br /> restMessage<span class="token punctuation">.</span><span class="token function">setRequestBody</span><span class="token punctuation">(</span><span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">stringify</span><span class="token punctuation">(</span>requestBody<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> response <span class="token operator">=</span> restMessage<span class="token punctuation">.</span><span class="token function">execute</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> error <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">haveError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>error<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> errorCode <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">getErrorCode</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> errorMsg <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">getErrorMessage</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> gs<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span>errorCode<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> gs<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span>errorMsg<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> headerVal <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">getHeader</span><span class="token punctuation">(</span><span class="token string">"Content-Type"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> headers <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">getHeaders</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> queryString <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">getQueryString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> statusCode <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">getStatusCode</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> responseBody <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">getBody</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> responseObj <span class="token operator">=</span> <span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">parse</span><span class="token punctuation">(</span>responseBody<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> responseObjLen <span class="token operator">=</span> responseObj<span class="token punctuation">.</span>results<span class="token punctuation">.</span>length<span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token punctuation">)</span></code></pre>
<ul>
<li>
<p>System Clone</p>
<ul>
<li><a href="https://docs.servicenow.com/bundle/newyork-platform-administration/page/administer/managing-data/task/schedule-cloning.html">Automatic, repeated cloning</a> - Clone instances automatically on a recurring basis.</li>
</ul>
</li>
<li>
<p>Delegated development and deployment</p>
<ul>
<li><a href="https://docs.servicenow.com/bundle/newyork-application-development/page/build/applications/task/t_AddADeveloper.html">Manage Update sets</a> - Grant non-admin users permission to manage local and retrieved update sets. Allow users to create, update, and delete local update sets as well as preview, resolve conflicts, and commit retrieved update sets.</li>
</ul>
</li>
</ul>
<p>Further Reading:</p>
<ul>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=abfe2818db667b401cd8a345ca9619a1">Pradeep's blog post</a></li>
<li><a href="https://developer.servicenow.com/blog.do?p=/post/newyork-pdi/">Dave Slusher's post</a></li>
</ul>
<!--EndFragment-->What is GlideOverlay2019-07-25T23:55:24Zhttps://jace.pro/post/2019-07-25-GlideOverlay/Jace Benson<!--StartFragment-->
<p>I was on twitter and this came up;</p>
<blockquote>
<p>Try GlideOverlay instead. I can send you a DM with some sample code.<br />
Or ping on SNDevs.</p>
<p>--- Jonathan Jacob (@TheBurgerlution) <a href="https://twitter.com/TheBurgerlution/status/1154155650521456640">July 24, 2019</a></p>
</blockquote>
<p>I had to make a <a href="https://sn.jace.pro/GlideOverlay">page for it</a>.</p>
<p>It appears to be a undocumented modal.</p>
<p>It's used throughout ServiceNow on VTB, Change, and Surveys.</p>
<!--EndFragment-->Blog - Simplified layout2019-07-24T23:52:47Zhttps://jace.pro/post/2019-07-23-blog-update/Jace Benson<!--StartFragment-->
<p>Hey everyone,</p>
<p>I just updated the layout of the home page for my blog. I also did some... standardizing of the format's of the markdown files. I did a pretty good look over, but if you see anything bizarre please let me know on <a href="https://github.com/jacebenson/blog/issues/new/">github</a>.</p>
<p>Thanks a bunch. I appreciate all of you!</p>
<!--EndFragment-->Licensing... Again (Mid 2019)[redacted]2019-07-23T23:54:28Zhttps://jace.pro/post/2019-07-23-sn-licensing-update/Jace Benson<!--StartFragment-->
<h1>CONTENT REDACTED PER SERVICENOWS COUNCIL</h1>
<p>I'm sad that I can't share the content I have seen in public spaces. I don't want to cause more problems for anyone so I'm removing the content they've identified. At this point, I'd suggest reaching out to your business contacts of similar size and industry to comparing notes. Outside of that you'll have to meet with ServiceNow and get their pricing.</p>
<ul>
<li>Updated on Feb 16 2021</li>
</ul>
<!--EndFragment-->New side project: Dev Toolbox2019-07-22T23:47:34Zhttps://jace.pro/post/2019-07-21-devtoolbox/Jace Benson<!--StartFragment-->
<p>Dev Toolbox is a scoped app to capture tests for all the Out of Box ServiceNow applications. This is a scoped application for Service-now to allow some utilities to be easily added and maintained on instances.</p>
<p>Now the difference between Jim's and mine is, well was, I haven't checked in a few months, about 11 features due to scoped things not being able to be added on a global level.</p>
<p>Here's a link to the current issues:<br />
<a href="https://github.com/jacebenson/devtoolbox/issues">https://github.com/jacebenson/devtoolbox/issues</a></p>
<ul>
<li>My Scoped version cause, scoped means you're protected right: <a href="https://devtoolbox.jace.pro/">https://devtoolbox.jace.pro</a></li>
<li>Jim's Post: <a href="https://community.servicenow.com/community?id=community_blog&sys_id=b3c843aadb892b40fece0b55ca961906">https://community.servicenow.com/community?id=community_blog&sys_id=b3c843aadb892b40fece0b55ca961906</a></li>
<li>Jim's Update Set: <a href="https://developer.servicenow.com/app.do#!/share/contents/7375176_developer_toolbox3?v=1&t=PRODUCT_DETAILS">https://developer.servicenow.com/app.do#!/share/contents/7375176_developer_toolbox3?v=1&t=PRODUCT_DETAILS</a></li>
</ul>
<!--EndFragment-->How to build reports via URL2019-07-22T23:46:27Zhttps://jace.pro/post/2019-07-21-building-reports-via-url/Jace Benson<!--StartFragment-->
<p>Building reports via the URL can be really useful when you don't want to<br />
ensure a report exists or hasn't been modified, but documentation is<br />
pretty lacking on it.</p>
<p>Thankfully<br />
<a href="https://community.servicenow.com/community?id=community_question&sys_id=05540369dbd8dbc01dcaf3231f9619d3#answer_9ca74435db905fc01dcaf3231f9619a3">ralpho</a><br />
have seemed to figure out the url parameters.</p>
<p>Report type: List</p>
<table>
<thead>
<tr>
<th>Parameter</th>
<th>Value</th>
</tr>
</thead>
<tbody>
<tr>
<td>manual_labor</td>
<td><code>true</code></td>
</tr>
<tr>
<td>form</td>
<td><code>list</code></td>
</tr>
<tr>
<td>query</td>
<td>encoded query</td>
</tr>
<tr>
<td>field_list</td>
<td>comma separated list of fields you want</td>
</tr>
<tr>
<td>type</td>
<td><code>list</code></td>
</tr>
<tr>
<td>table</td>
<td><code>table</code></td>
</tr>
</tbody>
</table>
<p>A few things to note;</p>
<ol>
<li>You can dot-walk on the fields regardless of role, so this is a<br />
great workaround to making some tricky reports for power users.</li>
<li>You can add variables from sc_req_item if you can figure out the<br />
sys_id of variable</li>
</ol>
<p>Here's an example report url I generated for someone the other day that<br />
included variables;</p>
<p><code>sys_report_template.do?sysparm_field_list=variables.71cba0540f5fb600503c590be1050ec0&sysparm_type=list&sysparm_table=sc_req_item&sysparm_from_list=true&sysparm_chart_size=large&sysparm_manual_labor=true&sysparm_query=cat_item%3Dc9d980750f437200503c590be1050e8a%5Ecat_item%3Dc9d980750f437200503c590be1050e8a</code></p>
<!--EndFragment-->Madrid2019-07-21T23:51:16Zhttps://jace.pro/post/2019-07-21-madrid-review/Jace Benson<!--StartFragment-->
<p>Here's my take of whats new with Madrid</p>
<h1>Madrid</h1>
<p>I was told these are things I should look at;</p>
<p><img src="https://jace.pro/static/img/madrid-review.png" alt="" /></p>
<!--EndFragment-->
<!--StartFragment-->
<table>
<thead>
<tr>
<th>Thing</th>
<th>Comment</th>
</tr>
</thead>
<tbody>
<tr>
<td>Agent Workspace</td>
<td>Yep It's here, it's nice, g_form stuff works on it for mobile stuff</td>
</tr>
<tr>
<td>Agent Workspace Lists</td>
<td>Not sure what to look at here</td>
</tr>
<tr>
<td>Agent Workspace Form Resizing</td>
<td>Nice?</td>
</tr>
<tr>
<td>Agent Workspace Contextual Search</td>
<td>Looking into what's different</td>
</tr>
<tr>
<td>ATF</td>
<td>Lots of new features</td>
</tr>
<tr>
<td>ATF Smart Suites</td>
<td>Sounds, intelligent</td>
</tr>
<tr>
<td>ATF Quick Start Test</td>
<td>Could be improved</td>
</tr>
<tr>
<td>ATF Custom UI / Page Inspector</td>
<td>Interesting and a nice addition</td>
</tr>
<tr>
<td>ATF Parameterized Tests</td>
<td>Looks great</td>
</tr>
<tr>
<td>Virtual Agent</td>
<td>Extra subscription</td>
</tr>
<tr>
<td>No-code designer</td>
<td>It's pretty</td>
</tr>
<tr>
<td>Adv. Work Assignment</td>
<td>Not sure what this is</td>
</tr>
<tr>
<td>Service Portal Multiple KB and Catalog Support</td>
<td>Now that I have a work around I have to see if it's worth undoing it for this</td>
</tr>
<tr>
<td>Store & Plugin UI Updates</td>
<td>Only impacts Admins, it's nice</td>
</tr>
<tr>
<td>Mid Server - Now using JRE</td>
<td>Saving some $ money</td>
</tr>
<tr>
<td>CMDB Query Builder</td>
<td>I'll have to check it out</td>
</tr>
<tr>
<td>Flow Designer</td>
<td>Booo</td>
</tr>
<tr>
<td>Decision Trees</td>
<td>Booo</td>
</tr>
<tr>
<td>New Logic</td>
<td>Booo</td>
</tr>
<tr>
<td>New Actions</td>
<td>Booo</td>
</tr>
<tr>
<td>New API</td>
<td>Booo</td>
</tr>
<tr>
<td>Reporting on Running Flows</td>
<td>Booo</td>
</tr>
<tr>
<td>IntegrationHub - Adds Soap</td>
<td>Nice</td>
</tr>
<tr>
<td>IntegrationHub - Payload Builder</td>
<td>...</td>
</tr>
<tr>
<td>Mobile - new app on apple and play store</td>
<td>Where? Not as of Jan 29</td>
</tr>
<tr>
<td>Mobile studio</td>
<td>I still haven't found it</td>
</tr>
<tr>
<td>Mobile offline capable</td>
<td>Nice...</td>
</tr>
<tr>
<td>Instance Security Center</td>
<td>I still think <a href="https://developer.servicenow.com/connect.do#!/share/contents/7852853_security_best_practice_audit?v=3.02&t=PRODUCT_DETAILS">https://developer.servicenow.com/connect.do#!/share/contents/7852853_security_best_practice_audit?v=3.02&t=PRODUCT_DETAILS</a> was better, easier to follow</td>
</tr>
<tr>
<td>Cloning</td>
<td>Cant test this on my pdi</td>
</tr>
<tr>
<td>Analytics hub</td>
<td>not sure I know this.</td>
</tr>
</tbody>
</table>
<!--EndFragment-->Did you know, you can impersonate with a sys_id2019-07-21T23:49:43Zhttps://jace.pro/post/2019-07-21-impersonate-via-sys_id/Jace Benson<!--StartFragment-->
<p>Sometimes you'll have many people with the same name... Don't judge my users. You also sometimes need to impersonate the user. Did you know you can impersonate by pasting the <code>sys_id</code>? I didn't.</p>
<p>Thanks cmclendon for sharing this!</p>
<!--EndFragment-->
<p><img src="https://jace.pro/static/img/2019-07-21-impersonate.png" alt="" /></p>
<!--StartFragment-->
<p>Source: <a href="https://community.servicenow.com/community?id=community_article&sys_id=9a177495db44f348f7fca851ca961961">https://community.servicenow.com/community?id=community_article&sys_id=9a177495db44f348f7fca851ca961961</a></p>
<!--EndFragment-->Service Portal: Disabling the order confirmation dialog2019-07-21T23:48:41Zhttps://jace.pro/post/2019-07-21-disabling-order-confermation-dialog-in-sp/Jace Benson<!--StartFragment-->
<p>This is the first thing I was asked to do as the dialog is not what some of my stake holders wanted.</p>
<p>Make this sys_property <code>glide.sc.sp.twostep</code> with a value false.</p>
<!--EndFragment-->
<p><img src="https://jace.pro/static/img/2019-07-21-disabling-order-confirmation.png" alt="" /></p>
How to activate plugins via script2019-07-21T23:43:58Zhttps://jace.pro/post/2019-07-21-activating-plugins-via-script/Jace Benson<!--StartFragment-->
<p>Sometimes you have a whole bunch of plugins to install. No reason to keep your screen busy, you can script it, here's how.</p>
<p>Some smart person named Ashby posted about this. I haven't tested it out, but this seems promising and likely undocumented.</p>
<!--EndFragment-->
<!--StartFragment-->
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">//Partial Version</span><br /><span class="token comment">//you can check following URL to see if the work is finished. It is finished when the completion time is set and the percent complete is 100.</span><br /><span class="token comment">//<instance>/sys_execution_tracker_list.do?sysparm_query=name%3DPlugin%20Installer</span><br /><span class="token keyword">var</span> plugins <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span><br />plugins<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token string">'com.snc.pa.change'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br />plugins<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token string">'com.snc.pa.problem'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br />plugins<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token string">'com.snc.pa.premium'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br />plugins<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token string">'com.snc.pa.solution.library'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token keyword">var</span> main <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideMultiPluginManagerWorker</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br />main<span class="token punctuation">.</span><span class="token function">setPluginIds</span><span class="token punctuation">(</span>plugins<span class="token punctuation">)</span><span class="token punctuation">;</span><br />main<span class="token punctuation">.</span><span class="token function">setProgressName</span><span class="token punctuation">(</span><span class="token string">"Plugin Installer"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br />main<span class="token punctuation">.</span><span class="token function">setBackground</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br />main<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<!--EndFragment-->
<!--StartFragment-->
<p>Source: <a href="https://community.servicenow.com/community?id=community_question&sys_id=e6db5e4bdb47ab002e8c2183ca9619a2#answer_a8ddb159db407388feb1a851ca9619fa">https://community.servicenow.com/community?id=community_question&sys_id=e6db5e4bdb47ab002e8c2183ca9619a2#answer_a8ddb159db407388feb1a851ca9619fa</a></p>
<!--EndFragment-->Using Processors to download files2019-07-12T23:41:42Zhttps://jace.pro/post/2019-07-12-using-processors-to-download-files/Jace Benson<!--StartFragment-->
<p>I was talking to Nthumma about a problem. It was the need for a custom XML file for each incident. I knew of a way to do this, but it's <strong>old</strong>. Enter Processors.</p>
<p>If you ever have a need to make something auto-download, that would seem pretty difficult as you need to set headers as mentioned <a href="https://stackoverflow.com/questions/386845/http-headers-for-file-downloads#386904">here on StackOverlow</a>.</p>
<p>With processors this is a non-issue. Here's how to do it.</p>
<!--EndFragment-->
<!--StartFragment-->
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">// Processor code</span><br /><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token function">process</span><span class="token punctuation">(</span><span class="token parameter">g_request<span class="token punctuation">,</span> g_response<span class="token punctuation">,</span> g_processor</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">try</span><span class="token punctuation">{</span><br /> <span class="token keyword">var</span> filter <span class="token operator">=</span> g_request<span class="token punctuation">.</span><span class="token function">getParameter</span><span class="token punctuation">(</span><span class="token string">"filterQuery"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> fileName <span class="token operator">=</span> filter <span class="token operator">+</span> <span class="token string">'.xml'</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> contentType <span class="token operator">=</span> <span class="token string">'xml/plain'</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> fileContent <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> incident <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'incident'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> incident<span class="token punctuation">.</span><span class="token function">addEncodedQuery</span><span class="token punctuation">(</span>filter<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> incident<span class="token punctuation">.</span><span class="token function">query</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> fileContent<span class="token operator">+=</span><span class="token string">'<root>'</span><span class="token punctuation">;</span><br /> <span class="token keyword">while</span><span class="token punctuation">(</span>incident<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token comment">//generate XML format</span><br /> fileContent<span class="token operator">+=</span><span class="token string">'<record>'</span><span class="token punctuation">;</span><br /> fileContent<span class="token operator">+=</span><span class="token string">'<message-type>'</span><span class="token operator">+</span> incident<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token string">'short_description'</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">'</message-type>'</span><span class="token punctuation">;</span><br /> fileContent<span class="token operator">+=</span><span class="token string">'</record>'</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> fileContent<span class="token operator">+=</span><span class="token string">'</root>'</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span><span class="token punctuation">(</span>contentType <span class="token operator">==</span> <span class="token string">'xml/plain'</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> fileContent <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">XMLDocument</span><span class="token punctuation">(</span>fileContent<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> g_response<span class="token punctuation">.</span><span class="token function">addHeader</span><span class="token punctuation">(</span><span class="token string">'Content-Disposition'</span><span class="token punctuation">,</span> <span class="token string">'attachment;filename='</span> <span class="token operator">+</span> fileName<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> g_processor<span class="token punctuation">.</span><span class="token function">writeOutput</span><span class="token punctuation">(</span>contentType<span class="token punctuation">,</span>fileContent<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">catch</span><span class="token punctuation">(</span>error<span class="token punctuation">)</span><span class="token punctuation">{</span><br /> g_processor<span class="token punctuation">.</span><span class="token function">writeOutput</span><span class="token punctuation">(</span><span class="token string">'text/html'</span><span class="token punctuation">,</span>error<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">(</span>g_request<span class="token punctuation">,</span> g_response<span class="token punctuation">,</span> g_processor<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<!--EndFragment-->
<!--StartFragment-->
<h2>UI Action</h2>
<!--EndFragment-->
<!--StartFragment-->
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">// Client side ui action</span><br /><span class="token function">downloadXML</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token keyword">function</span> <span class="token function">downloadXML</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> sysparm_query <span class="token operator">=</span> g_list<span class="token punctuation">.</span><span class="token function">getQuery</span><span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token literal-property property">orderby</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token literal-property property">fixed</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> url <span class="token operator">=</span> <span class="token string">'/customprocessor.do?filterQuery='</span><span class="token operator">+</span>sysparm_query<span class="token punctuation">;</span><br /> window<span class="token punctuation">.</span><span class="token function">open</span><span class="token punctuation">(</span>url<span class="token punctuation">,</span> <span class="token string">"_blank"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span></code></pre>
<!--EndFragment-->
<!--StartFragment-->
<p>Thanks Nthumma for the idea to make this post and the code above.</p>
<p>Further Reading;</p>
<ul>
<li><a href="http://www.john-james-andersen.com/blog/service-now/create-your-own-rest-based-servicenow-web-service.html">http://www.john-james-andersen.com/blog/service-now/create-your-own-rest-based-servicenow-web-service.html</a></li>
<li><a href="https://www.servicenowguru.com/scripting/download-attachments-zip-file/">https://www.servicenowguru.com/scripting/download-attachments-zip-file/</a></li>
</ul>
<!--EndFragment-->Silly Tech Videos2019-07-10T23:38:32Zhttps://jace.pro/post/2019-07-10-silly-tech-videos/Jace Benson<!--StartFragment-->
<p>A while ago some people shared with me some great videos that were just<br />
silly. These are just, well in my opinion worth at least a cursory<br />
glance. If you're like me you'll probably enjoy them</p>
<ul>
<li>Sia Mongodb: <a href="https://youtu.be/0vPt7GI-2kc?t=24">https://youtu.be/0vPt7GI-2kc?t=24</a></li>
<li>Opensuse uptown funk: <a href="https://youtu.be/SYRlTISvjww">https://youtu.be/SYRlTISvjww</a></li>
<li>Winsongs: <a href="https://youtu.be/W--13mBc788">https://youtu.be/W--13mBc788</a></li>
</ul>
<!--EndFragment-->Outbound Email Examples - Might come in handy2019-07-10T23:37:17Zhttps://jace.pro/post/2019-07-10-email-examples/Jace Benson<!--StartFragment-->
<p>I am trying to keep a small list of emails I get from service-now<br />
installations... this post is just that;</p>
<h1>Email Examples</h1>
<h2>Survey 1</h2>
<p>Subject: ServiceNow Customer Satisfaction Survey for [RECORD]</p>
<blockquote>
<p>We would like to thank you again for being our customer.</p>
<p>Customer satisfaction is our priority, and we hope the solution to<br />
incident [RECORD] has met your expectations.</p>
<p>Please grade our performance by clicking the link below to complete a<br />
short survey. Every survey is acted upon and your input is vital.</p>
<p>Customer Satisfaction Survey</p>
<p>Thank you for your input.</p>
<h2>[[Person's name] [Role, Department] [Company]](https://jace.pro/post/2019-07-10-email-examples/#persons-name-role-department-company)</h2>
<p>Resolved by: [Resolvers Name]</p>
<p>Short description: [Short Description]</p>
</blockquote>
<h2>Survey 2</h2>
<p>Subject: Survey invitation: New Survey on Customer Satisfaction Survey</p>
<blockquote>
<p>You have been invited to take the survey: Customer Satisfaction<br />
Survey.</p>
<p>Click here to take your survey: [Link to survey]</p>
<p>Unsubscribe | Notification Preferences</p>
</blockquote>
<h2>Record Commented</h2>
<p>Subject: [Priority] [Record Class] Commented - [Company] - [Record]: [Short Description]</p>
<blockquote>
<p>[Record Updated] [Priority] [Record Class]: [Record]</p>
<hr />
<h2>[Hi [Record Class] [Record] has been updated.](https://jace.pro/post/2019-07-10-email-examples/#hi-record-class-record-has-been-updated)</h2>
<p>[Record Class]: [Record]<br />
Priority: [Priority]<br />
Short Description: [Short Description]</p>
<h2><a href="https://jace.pro/post/2019-07-10-email-examples/#comments">Comments</a></h2>
<p>[Comments]</p>
<p>Steps to reproduce: [Steps to reproduce]</p>
<p>Business Criticality: [Impact]</p>
<p>Affected Users: [Quantity of users]</p>
<p>Start Date: [Start Date]</p>
<p>End Date: [End Date]</p>
<hr />
<p>Click here to view [Record Class] [Record]</p>
<p>Sincerely, ServiceNow Customer Support</p>
</blockquote>
<!--EndFragment-->Dawn Jurek's great list of Best Practices2019-07-10T23:23:11Zhttps://jace.pro/post/2019-07-10-best-practices-lists/Jace Benson<!--StartFragment-->
<p>Dawn Jurek has a great list of best practices that she keeps up to<br />
date.<br />
As much as I'd like to think that list will always exist, I've been<br />
burnt before, so this is my copy.</p>
<h1>Best Practices</h1>
<p>Source: <a href="https://community.servicenow.com/community?id=community_blog&sys_id=6e7d6269dbd0dbc01dcaf3231f9619c0">https://community.servicenow.com/community?id=community_blog&sys_id=6e7d6269dbd0dbc01dcaf3231f9619c0</a></p>
<h2>ATF (Automated Test Framework)</h2>
<ul>
<li><a href="https://community/?id=community_blog&sys_id=1a4e66addbd0dbc01dcaf3231f96192f">Best practices for using ATF</a> 9/26/17</li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=84dc2665dbd0dbc01dcaf3231f96190f">How to avoid ATF testing failures</a> 5/30/17</li>
</ul>
<h2>Development</h2>
<ul>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=09becbf3db589b403882fb651f961986">Best practices for using the Flow Designer</a> 2/22/18</li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=582de2e5dbd0dbc01dcaf3231f961988">Dictionary overrides---what they are and how to use them</a> 7/24/17</li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=342e266ddbd0dbc01dcaf3231f961971">When running business rules, timing is everything</a> 7/11/17</li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=47bc6e25dbd0dbc01dcaf3231f961967">Six ways to Improve the Performance of Client Scripts</a> 6/21/17</li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=c79dae69dbd0dbc01dcaf3231f96192a">Properly deploy changes using Team Development</a> 5/23/17</li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=ddecea65dbd0dbc01dcaf3231f9619f0">How to keep variables from stepping on each other</a> 3/17/17</li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=b4fca2a5dbd0dbc01dcaf3231f961900">User account or service account? What to use for web service tasks</a> 3/10/17</li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=51aca225dbd0dbc01dcaf3231f9619f8">Outsmart fickle networks, firewall changes, and down servers in your web services integration</a> 2/24/17</li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=675d2a29dbd0dbc01dcaf3231f961910">Why you should never use external iFrames - and the one exception to this rule</a> 2/15/17</li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=4a1e226ddbd0dbc01dcaf3231f9619dd">How to clone to a target instance that has in-development applications</a> 2/14/17</li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=c64e26addbd0dbc01dcaf3231f9619da">Why you shouldn't develop on your production instance</a> 1/17/17</li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=6f4da229dbd0dbc01dcaf3231f9619a8">Annotate scripts and customizations with comments</a> 12/20/16</li>
</ul>
<h2>HI</h2>
<ul>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=cb5eeaaddbd0dbc01dcaf3231f96198f">Requesting assistance with quarterly patching or version upgrade changes</a> 5/17/17</li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=c07ceea1dbd0dbc01dcaf3231f9619b4">The high importance of managing your company contacts on HI</a> 5/1/17</li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=aa2da6e5dbd0dbc01dcaf3231f961912">Adding new users in HI---the how and the why</a> 4/24/17</li>
</ul>
<h2>HR Service Delivery</h2>
<ul>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=2cf37273db2d5b40852c7a9e0f961920">The basics of integrating with SuccessFactors and other HR management systems</a> 4/27/18</li>
</ul>
<h2>Information Technology & Business Management (ITBM)</h2>
<ul>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=e300ac23dbf69bc09d612926ca961977">Agile 101---What is Agile development and why do you need it?</a> 6/28/18</li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=16ec5613dba21340e0e80b55ca961910">PPM 101</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=16ec5613dba21340e0e80b55ca961910">What is PPM, and why do you need it?</a> 6/18/18</li>
</ul>
<h2>Information Technology Operations Management (ITOM)</h2>
<ul>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=e913125fdbd9d7404837f3231f9619de">CMDB 101 - What is a configuration management database, and why do you need one?</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=e913125fdbd9d7404837f3231f9619de">What is a configuration management database, and why do you need one?</a> 4/13/18</li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=6ab2a303db0d9bc4852c7a9e0f96194b">ITOM 101 - What is ITOM and why do I need it?</a> 3/30/18</li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=224bdde9dbacdf00b61ff3231f9619ef">Tips for implementing and troubleshooting Cloud Management</a> 3/2/18</li>
<li><a href="https://community/?id=community_blog&sys_id=e41daea5dbd0dbc01dcaf3231f96197b">Best practices for setting up Discovery schedules</a> Best practices for setting up Discovery schedules 12/14/17</li>
<li><a href="https://community/?id=community_blog&sys_id=9d1deea5dbd0dbc01dcaf3231f961939">Best practices for MID Server setup and tuning</a> 11/9/17</li>
</ul>
<h2>Information Technology Services Management (ITSM)</h2>
<ul>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=0dd93b5bdb5edfc02d1efb651f961927">ITSM 101 - What is ITSM and why do you need it?</a> 6/1/18</li>
<li><a href="https://community/?id=community_blog&sys_id=0e8da669dbd0dbc01dcaf3231f961981">Service Catalog in Kingston---podcast and best practices</a> 2/8/18</li>
<li><a href="https://community/?id=community_blog&sys_id=f71da2e5dbd0dbc01dcaf3231f9619a4">Best practices for a successful ITSM implementation</a> 1/18/18</li>
<li><a href="https://community/?id=community_blog&sys_id=dfdc6a65dbd0dbc01dcaf3231f96196b">Best practices for implementing the Problem Management application</a> 1/11/18</li>
<li><a href="https://community/?id=community_blog&sys_id=c1ecea65dbd0dbc01dcaf3231f9619a3">Best practice: Make the most of standard changes</a> 12/18/17</li>
<li><a href="https://community/?id=community_blog&sys_id=452e266ddbd0dbc01dcaf3231f9619f1">Best practices for implementing the Incident Management application</a> 10/26/17</li>
<li><a href="https://community/?id=community_blog&sys_id=e4edeae9dbd0dbc01dcaf3231f961962">Best practices for implementing the Change Management application</a> 10/11/17</li>
</ul>
<h2>Platform</h2>
<ul>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=cc7ebd56db385f402e247a9e0f961945">Tips for streamlining ServiceNow upgrades - podcast and best practices</a> 3/16/18</li>
<li><a href="https://community/?id=community_blog&sys_id=a5ec2e65dbd0dbc01dcaf3231f9619ac">Why you should give each of your sub-production instances its own unique look</a> 4/12/17</li>
<li><a href="https://community/?id=community_blog&sys_id=f1bcea25dbd0dbc01dcaf3231f96193b">Set up currency properties correctly</a> 4/6/17</li>
<li><a href="https://community/?id=community_blog&sys_id=8f2e2a6ddbd0dbc01dcaf3231f9619e0">How do you plug in a plugin? The ins and outs of plugin activation</a> 3/3/17</li>
<li><a href="https://community/?id=community_blog&sys_id=730e6e2ddbd0dbc01dcaf3231f961927">Limit the Number of Users with the Admin Role</a> 1/5/17</li>
</ul>
<h3>Forms</h3>
<ul>
<li><a href="https://community/?id=community_blog&sys_id=6b9dae69dbd0dbc01dcaf3231f9619ec">Best practices for creating and editing forms</a> 8/24/17</li>
<li><a href="https://community/?id=community_blog&sys_id=571da2e5dbd0dbc01dcaf3231f961915">Choosing the correct field type when building a form</a> 6/9/17</li>
</ul>
<h3>Lists</h3>
<ul>
<li><a href="https://community/?id=community_blog&sys_id=0e0eaa2ddbd0dbc01dcaf3231f9619ff">Best practices for configuring lists</a> 9/11/17</li>
<li><a href="https://community/?id=community_blog&sys_id=1b3d2ee5dbd0dbc01dcaf3231f961933">Where to avoid linking to a reference field when configuring a list</a> 1/12/17</li>
</ul>
<h3>Tables</h3>
<ul>
<li><a href="https://community/?id=community_blog&sys_id=00fd622ddbd0dbc01dcaf3231f961974">Avoid issues when modifying shared fields in extended tables</a> 3/29/17</li>
<li><a href="https://community/?id=community_blog&sys_id=077da269dbd0dbc01dcaf3231f961966">When to Create a New Table vs. When to Extend</a> 1/28/17</li>
</ul>
<h3>Reporting and Performance Analytics</h3>
<ul>
<li><a href="https://community/?id=community_blog&sys_id=ab8caae1dbd0dbc01dcaf3231f961913">Best practices for creating responsive dashboards</a> 12/8/17</li>
<li><a href="https://community/?id=community_blog&sys_id=018d2669dbd0dbc01dcaf3231f9619aa">Best practices for creating and sharing reports</a> 8/11/17</li>
</ul>
<h2>Security Operations</h2>
<ul>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=f8b5b4efdb48f3804819fb2439961900">Leverage sightings searches to gauge and crush phishing and malware attacks</a> 5/14/19</li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=fa6eff4ddb58b3841cd8a345ca961918">How to get the Latest Security Operations and GRC Applications on Your Instance</a> 3/25/19</li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=0478e869db03a3409a64e15b8a9619d7">Getting started with Security Incident Response on the Now Platform</a> 1/24/19</li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=da5c0491dba3d3049d612926ca9619a4">3 NEW features in Security Operations will change how you work in London</a> 7/27/18</li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=34650042dbc693c0b61ff3231f961902">Vulnerability Response 101---Understanding Vulnerability Response with ServiceNow</a> 5/18/18</li>
</ul>
<h2>For more information:</h2>
<ul>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=1e7c5592db8e53047b337a9e0f96193e">Links to all NOWsupport resources</a></li>
<li><a href="https://www.servicenow.com/success.html">ServiceNow Customer Success Center</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=c6e2eb55dbe92300656a5583ca96199e">Want product updates and answers to your questions? Check out our Deskside Chats video series!</a> 11/9/18</li>
</ul>
<!--EndFragment-->How to revert a bunch of records2019-07-09T23:22:03Zhttps://jace.pro/post/2019-07-09-revert-a-bunch-of-records/Jace Benson<!--StartFragment-->
<p>Today I was tasked with reverting ~2k stories states to the past value. This is a daunting task as it requires someone to look at the <code>sys_audit</code> or <code>sys_history_line</code> tables. The code I wrote was a quick fix, but I think others might find it useful.</p>
<p>Without any delay here it is;</p>
<!--EndFragment-->
<!--StartFragment-->
<pre class="language-javascript"><code class="language-javascript"><span class="token keyword">var</span> stories <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'rm_story'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token keyword">var</span> query <span class="token operator">=</span> <span class="token string">'closed_by=eb8562c6b52c3000bb05d180e2312616^'</span><span class="token punctuation">;</span><br />query <span class="token operator">+=</span> <span class="token string">'sys_updated_onONToday@javascript:gs.beginningOfToday()@javascript:gs.endOfToday()^'</span><span class="token punctuation">;</span><br />query <span class="token operator">+=</span> <span class="token string">'state=3'</span><span class="token punctuation">;</span><br />stories<span class="token punctuation">.</span><span class="token function">addEncodedQuery</span><span class="token punctuation">(</span>query<span class="token punctuation">)</span><br />stories<span class="token punctuation">.</span><span class="token function">query</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token keyword">while</span><span class="token punctuation">(</span>stories<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token comment">// for each record</span><br /> gs<span class="token punctuation">.</span><span class="token function">print</span><span class="token punctuation">(</span><span class="token string">'in story: '</span> <span class="token operator">+</span> stories<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token string">'number'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> storyID <span class="token operator">=</span> stories<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token string">'sys_id'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token comment">// look up the last audit record for the state field</span><br /> <span class="token keyword">var</span> audit <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'sys_audit'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> audit<span class="token punctuation">.</span><span class="token function">addQuery</span><span class="token punctuation">(</span><span class="token string">'documentkey'</span><span class="token punctuation">,</span>storyID<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> audit<span class="token punctuation">.</span><span class="token function">addQuery</span><span class="token punctuation">(</span><span class="token string">'fieldname'</span><span class="token punctuation">,</span><span class="token string">'state'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> audit<span class="token punctuation">.</span><span class="token function">orderByDesc</span><span class="token punctuation">(</span><span class="token string">'record_checkpoint'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> audit<span class="token punctuation">.</span><span class="token function">setLimit</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> audit<span class="token punctuation">.</span><span class="token function">query</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">while</span><span class="token punctuation">(</span>audit<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> gs<span class="token punctuation">.</span><span class="token function">print</span><span class="token punctuation">(</span>audit<span class="token punctuation">.</span>oldvalue <span class="token operator">+</span> <span class="token string">'=> '</span> <span class="token operator">+</span> audit<span class="token punctuation">.</span>newvalue<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> stories<span class="token punctuation">.</span><span class="token function">setValue</span><span class="token punctuation">(</span><span class="token string">'state'</span><span class="token punctuation">,</span>audit<span class="token punctuation">.</span>oldvalue<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> gs<span class="token punctuation">.</span><span class="token function">print</span><span class="token punctuation">(</span><span class="token string">'setting state to '</span> <span class="token operator">+</span> stories<span class="token punctuation">.</span>state<span class="token punctuation">.</span><span class="token function">getDisplayValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> stories<span class="token punctuation">.</span><span class="token function">update</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span></code></pre>
<!--EndFragment-->Now there's a newsletter2019-06-13T23:21:05Zhttps://jace.pro/post/2019-06-12-added-newsletter/Jace Benson<!--StartFragment-->
<p>I added a proper newsletter for folks who might want other notifications on a ~ monthly basis about this blog and things I want to share.</p>
<p>It's on every page at the bottom. I promise it's just for updates relating to things about what I consider related to this blog.</p>
<p>The technical, I decided to go with Mailjet as it has a pretty good free tier and they are also by the <a href="https://mjml.io/">mjml</a> project which if you haven't looked at, you should. I'll wait.</p>
<p>This is just a quick update to let everyone know I have a newsletter.</p>
<!--EndFragment-->Knowledge 19's Hackthon, a personal look2019-05-21T23:13:53Zhttps://jace.pro/post/2019-05-21-k19-hackathon-review/Jace Benson<!--StartFragment-->
<p>In my last post I said, "The hackathon is a great place to learn a new feature but it's not a hackathon. They expect you to have the app prebuilt before you get there." I just want to be very clarify in this post.</p>
<p>I learned a lot from the hackathon, but what they want is not a hackathon.</p>
<p>I'll recap the events up until we left.</p>
<h1>Week of April 22nd</h1>
<p>I reviewed all past Knowledge hackathons I could find and aggregated them on my <a href="https://blog.jace.pro/post/2019-04-22-knowledge-hackathon-past/">blog</a>. Trying to get some ideas for what might be a winning idea if executed properly.</p>
<h1>Week of April 29th</h1>
<p>I finally get some ideas worth anything down on paper so I don't have to go without an idea. I am really excited about this. A past co-worker of mine Kevin, found out he's going to K19, cause I found a unused ticket. So that's awesome, I have a hackathon team and I have some decent ideas. I lay out some tasks for each idea.</p>
<h1>May 6th</h1>
<p>I arrive in Vegas, it's great. I meet up with some colleagues and get checked in. Also was given access to the "HackNow" instance. Seems security isn't that important here so all the past submissions all exist. I'll export that and include link at the bottom.</p>
<h1>May 7th</h1>
<p>I see my hackathon team mates getting coffee. We talk about the ideas and pick one. Great. We do some morning labs and then meet up at the CreatorCon hackathon area. Thirty minutes after the start of the event we get our instance. Great.</p>
<p>The idea we are working on is this "LendIt" app. Using the new mobile interface allows users/ groups to indicate they have things to lend out, and if lent, who it's lent to. Pretty simple idea but you could apply this to whatever at work or if part of group of neighbors could be something to facilitate passing around a leaf blower, or other lawn equipment.</p>
<p>Our tasks as we see them;</p>
<ul>
<li>Build the table for the things to be lent.</li>
<li>Build a table to allow people to queue for things to be lent later.</li>
<li>Build table to support who has borrowed the thing.</li>
<li>Make some rules to control the availability and to process the queue</li>
<li>Make a Mobile App</li>
</ul>
<p>Now we can do a lot of this stuff at the same time and so I take on the Mobile App stuff and the other two work out the business rules and table structure.</p>
<h2>The first problem</h2>
<p>I am working on this and creating the stuff only to find that when I save the Mobile App nothing seems to be committing to the database. So after about an hour and half of banging my head on the table I get up and walk over to the "Mobile" experts and show them what's happening. They are perplexed and bring me to another expert who has me check my version. Low and behold we found the problem. We're not on Madrid. We're on some beta unnamed version with a build tag of "glide-trackhinext-12-11-2015" and a build date of "11-13-2018_1928". Well Madrid wasn't done then and the Mobile stuff wasn't working by then.</p>
<p><img src="https://jace.pro/static/img/hackathon-version.png" alt="" /></p>
<h2>The recovery</h2>
<p>So we export our work to <a href="https://github.com/jacebenson/lendIt">git</a> and we move to one of our Madrid PDI's. We all have a "happy hour" we have to go to with our work stuff and that's two hours. When we all get back we're refreshed and good to go. I've taken a sorta leader role, Kevin and Joe have taken more of the "Can Do" attitude. We get it all working and then one of the judges comes by to check out our work. It must be near the end of the night, but by the time he's come by and we've given a pretty poor explanation of this, and shown what we have. He in other words tells us it's just the platform and not at the level of the other teams, but he doesn't use those words. Nope, instead what we took from it was, it was a waste of his time, and everyone else time. Looking back on it, it reminds me to the statement made in <a href="https://www.youtube.com/watch?v=wKjxFJfcrcA">Billy Madison</a>. Rightly offended, we pack up our shit and leave.</p>
<p>At a bar about 20 minutes later we realize you know we got more out of this than any other lab and it was a good experience. No reason to let Chris get us down. So that's the last hackathon I'll be in at a knowledge event.</p>
<h2>Afterword</h2>
<p>It's been a few weeks now and I didn't want to write this while frustrated in the moment. I still feel the same way I did the night of. Thanks! Now I know. The <strong>hackathon</strong> isn't a hackathon at the knowledge events. It's a "Did you bring something cool that we can make a product out of" event.</p>
<p><a href="https://jace.pro/post/2019-05-21-k19-hackathon-review/2019-app-list.xlsx">Link of Ideas</a></p>
<!--EndFragment-->Notes from Knowledge 192019-05-10T23:08:55Zhttps://jace.pro/post/2019-05-10-k19-review/Jace Benson<!--StartFragment-->
<p>I was very lucky to get to go to Knowledge19. Now that it's over, before I leave I want to jot down my thoughts. Of the labs, I attended I had no technical difficulty with the WIFI or content. Others did, but somehow not me.</p>
<p>Below I'll go over the parts I think notable.</p>
<p>Last year I went over the things to keep in mind, but here's a link to the <a href="https://jace.pro/k18">k18 post</a> for a refresher.</p>
<p>This year was different in that I was a speaker about the Meetups I help run. You can see the ones local to you<br />
<a href="https://www.meetup.com/pro/servicenowdevprogram/">here</a>.</p>
<p>I got a lot out of this so I'll get the boring bits out of the way;</p>
<h2>Registration</h2>
<p>Looks like they used <a href="http://g2planet.com/">g2planet.com</a> again and this year it was better than last. This I thought was okay, but it could be improved. It also didn't help that the schedule kept changing after I had been signed up for things.</p>
<h2>Mobile App</h2>
<p>This years app was much better. It could have been better but it worked for its purpose.</p>
<h2>Social Stuff</h2>
<p>This was great. I had been invited out to two nights out and met a ton of people. See <a href="https://twitter.com/phxdev/status/1125984190359465985">Twitter</a> for more details. Drai's party was pretty great. A bit loud, but that's expected being a night club and all.</p>
<h2>Things learned from networking</h2>
<ul>
<li>WeWork bought <a href="http://meetup.com/">meetup.com</a> and does free hosting for paid meetups</li>
<li>ServiceNow is upping Flow Designer free transactions to 1 Million</li>
<li>No one is happy with the new licensing model with Madrid</li>
<li>I found 14 unused #know19 passes this year. Next year I'm going to try to do something with that.</li>
<li>The hackathon is a great place to learn a new feature but it's not a hackathon. They expect you to have the app prebuilt before you get there.</li>
</ul>
<h2>Labs</h2>
<h3>CCW1630 Extension points: How to get other developers to improve your app</h3>
<p>@pheedbaq is the man behind this lab. It was really well done. He had us update a bike borrowing application. I don't think I can properly explain this but, in short this is what I think it is. A better way to let others replace code in a scope.</p>
<p><a href="https://developer.servicenow.com/app.do#!/event/knowledge19/CCW1630">Lab URL</a></p>
<p><a href="https://community.servicenow.com/community?id=community_article&sys_id=5c66ef9cdb9d3b0422e0fb2439961903">On-demand Library URL</a></p>
<h3>CCB1089 Making the most of the ServiceNow MID Server</h3>
<p>This was amazing and performed by Mark Scott. I'm not sure how much he practiced it, but he came off like a pro. This talk checked all the boxes in my opinion.</p>
<p>It was Entertaining, Educational, and Actionable. Not to mention he used R to determine if a photo is a hotdog or not a hotdog just like they did in Silicon Valley on HBO.</p>
<p>In my opinion this was the best session I went to. (If you all have a recording of this on YouTube let me know and I'll add a link.)</p>
<p><a href="https://community.servicenow.com/community?id=community_article&sys_id=6246e75cdb9d3b0422e0fb2439961979">On-demand Library URL</a></p>
<h3>CCB1419 ServiceNow Developer Meetup and community Building</h3>
<p>This was a really open discussion between <a href="https://www.meetup.com/RDU-ServiceNow-Developer-Meetup/members/215745765/profile/">Andrew Barnes</a>, <a href="https://www.meetup.com/Orlando-ServiceNow-Developer-Meetup/members/212809016/profile">Lily Li</a>, <a href="https://www.meetup.com/South-Florida-ServiceNow-Developer-Meetup/members/189027559/profile/">Todd Volpe</a>, <a href="https://www.meetup.com/Munchen-ServiceNow-Developer-Meetup/members/203263765/profile/">Melhem El-Achkar</a>, and <a href="https://www.meetup.com/Sao-Paulo-ServiceNow-Developer-Meetup/members/189217600/profile/">Fernando Luiz Goulart</a>.</p>
<p>It was great. We all introduced ourselves and talked about the struggles and the best way to do things in the meetup. I had been due to talk on the 1st floor 1/2 way through this talk. One of the attendees followed me down and I met her after my talk. She's from Mexico and wants to have one in her area. I hope it starts up. I'd love to go and see it happen.</p>
<h3>BRE1340 - A city in the cloud: How Minneapolis is driving digital transformation on the Now Platform</h3>
<p>I lived in Minneapolis and know the speaker and some of the developers who did a lot of the work featured in this talk.</p>
<p>I just have this to say about the talk. Gina F. did a great job! I loved the slide where you could here her passion for the city.</p>
<p>Also all the business problems they solved were amazing.</p>
<p><a href="https://community.servicenow.com/community?id=community_article&sys_id=4846235cdb9d3b0422e0fb24399619e2">On-demand Library URL</a></p>
<h3>CCDT0335 - Influence and learn by running a local developer Meetup</h3>
<p>I had practiced this talk a few times and was fortunate enough to have a lot of support in the audience. Thanks;</p>
<p>Lida, Jarod M, Anna Baker, Casey, Kevin Karyadi, Will Weaver, Stephen Phayre., and Andrew Colson</p>
<p>I ran too fast but there were plenty of time for questions and there were a number of great questions.</p>
<p><a href="https://community.servicenow.com/community?id=community_article&sys_id=d246a75cdb9d3b0422e0fb24399619a5">On-demand Library URL</a></p>
<h3>CCW1547 -- Full-stack adventures in ServiceNow-land: part one</h3>
<p>This lab was a large lab. A lot of content to make your way through.<br />
However it is a lab where you make end to end peer review application.</p>
<p><a href="https://developer.servicenow.com/app.do#!/event/knowledge19/CCW1547">Lab URL</a></p>
<p><a href="https://community.servicenow.com/community?id=community_article&sys_id=b3462f5cdb9d3b0422e0fb2439961953">On-demand Library URL</a></p>
<h3>CCB0433 Under the hood of Flow Designer and IntegrationHub with the engine developers</h3>
<p>I've been a big advocate that instead of flow designer ServiceNow should have improved the workflow engine. With that being said that isn't happening.</p>
<ul>
<li>Don't use gs sleep</li>
<li>Don't do looping delay anti patterns</li>
<li>Understand that flows aren't versioned like workflows</li>
</ul>
<h2>Labs I need to check out yet</h2>
<h3>CCDT1827 Advanced GlideRecord Techniques</h3>
<p><a href="https://community.servicenow.com/community?id=community_article&sys_id=7e66abdcdb9d3b0422e0fb243996190d">On-demand Library URL</a></p>
<h3>LAB1413 Quickly implement an awesome walk-up service channel for improved employee experience</h3>
<p><a href="https://developer.servicenow.com/app.do#!/event/knowledge19/LAB1413">Lab URL</a></p>
<p><a href="https://community.servicenow.com/community?id=community_article&sys_id=b056639cdb9d3b0422e0fb243996193d">On-demand Library URL</a></p>
<h3>LAB1542 Probe to pattern migration</h3>
<p><a href="https://developer.servicenow.com/app.do#!/event/knowledge19/LAB1542">Lab URL</a></p>
<p><a href="https://community.servicenow.com/community?id=community_article&sys_id=6866ef9cdb9d3b0422e0fb24399619c2">On-demand Library URL</a></p>
<!--EndFragment-->Winning ServiceNow Hackathon Ideas2019-04-22T23:04:02Zhttps://jace.pro/post/2019-04-22-knowledge-hackathon-past/Jace Benson<!--StartFragment-->
<p>This year I'm fortunate enough to go to knowledge, and one of my favorite SN people, Robert Fedoruk, posted a <a href="https://www.youtube.com/watch?v=ctzX-ANG_Sk&feature=youtu.be">YouTube video about winning hackathons</a>.</p>
<p>In the spirit of sharing I'm adding a list I compiled after some searching to see what's won before as it wasn't aggregated anywhere I could see. I'd love to see these shared in an open way afterwards. If this makes the competition better, than that's great and my goal here. Below is that list.</p>
<h1>Knowledge Things</h1>
<ul>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=c15d2629dbd0dbc01dcaf3231f961987">How to win a hackathon</a></li>
</ul>
<h2>2013</h2>
<p><a href="https://web.archive.org/web/20130831022442/http://community.servicenow.com/blog/allanleinwand/createnow-hackathon-check-out-finalist-teams-apps">Post</a></p>
<table>
<thead>
<tr>
<th>Place</th>
<th>App</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>Winner</td>
<td><a href="https://youtu.be/NSWwunAHhjA">KickITnow (video)</a></td>
<td>A kind-of "corporate KickStarter" for incubating projects within an enterprise</td>
</tr>
<tr>
<td>Finalist</td>
<td>TableNOW</td>
<td>a restaurant reservation application that finds nearby restaurants and displays their locations, menus, and availability. And processes reservations, of course.</td>
</tr>
<tr>
<td>Finalist</td>
<td>CasiNOW</td>
<td>a blackjack gambling web site that lets users buy coins for play, interact with one another, read rules and FAQs, report issues, and submit questions.</td>
</tr>
<tr>
<td>Finalist</td>
<td>PictionNOW</td>
<td>a variant on the popular party game "Pictionary" that replaces that game's manual drawing tools with an electronic tablet. The pair used HTML5 to add a "canvas element" to the ServiceNow Content Management System (CMS), and wrote driver software to link the tablet with the ServiceNow platform.</td>
</tr>
</tbody>
</table>
<h2>2014</h2>
<p><a href="https://community.servicenow.com/community?id=community_blog&sys_id=a76caea1dbd0dbc01dcaf3231f961993">Post</a></p>
<table>
<thead>
<tr>
<th>Place</th>
<th>App</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>Winner</td>
<td><a href="https://vimeo.com/96734925">SchoolHub (video)</a></td>
<td>App to structure the interaction between teachers (give assignments and grades), faculty (biographies, tracking attendance), parents (check the grades, fill out all kinds of forms --- absence, dietary, holiday requests) and students (survey teachers, get assignments)</td>
</tr>
<tr>
<td>Finalist</td>
<td>SociaLoop</td>
<td>a Social Media Campaign Management application, enabling organizations to activate all employees around social media.</td>
</tr>
<tr>
<td>Finalist</td>
<td>Password Vault</td>
<td>The app generates a secured password and we use orchestration to make the change a reality. The credentials are encrypted and we use Access Control List (ACL) to make sure you see only the credentials that you are supposed to see in your role.</td>
</tr>
<tr>
<td>Finalist</td>
<td>MudMonsters</td>
<td>"We have 35 locations, 12 monsters, many items in there," Scott explained. "We use business rules to govern the behavior of all elements. The business rules trigger events based off of the text body in the commands. You win when you reach the final destination. If you loose, you go back to square one and you loose all items."</td>
</tr>
<tr>
<td>Finalist</td>
<td>CableCarNow</td>
<td>The world famous cable cars of San Francisco are always full and the queues at the stops are way too long. "So the city needs a solution and it needs it fast."</td>
</tr>
</tbody>
</table>
<h2>2015</h2>
<p><a href="https://community.servicenow.com/community?id=community_blog&sys_id=0a3daae5dbd0dbc01dcaf3231f9619f9">Post</a></p>
<table>
<thead>
<tr>
<th>Place</th>
<th>App</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>Winner</td>
<td><a href="https://youtu.be/Kpgqp1otikY?t=54">FEMA Victim Assistance (cube talk video)</a></td>
<td>ServiceNow Saving Lives. It will be something very special.</td>
</tr>
<tr>
<td>Finalist</td>
<td>Cinema food ordering</td>
<td>App that would allow movie audience to scan a QR code on their seat, complete and submit an order and have it delivered to their seat.</td>
</tr>
<tr>
<td>Finalist</td>
<td>C'est Ne Paas (Robot)</td>
<td>Nuclear Disaster as a Service - This application would enable disaster recovery teams to send a robot into a disaster area and have it execute a task.</td>
</tr>
<tr>
<td>Finalist</td>
<td>Social networking management</td>
<td>Managing posts to Twitter</td>
</tr>
<tr>
<td>Finalist</td>
<td>On-call scheduling</td>
<td>No Details</td>
</tr>
</tbody>
</table>
<h2>2016</h2>
<p><a href="https://community.servicenow.com/community?id=community_blog&sys_id=26ac6625dbd0dbc01dcaf3231f96191d">Post</a></p>
<table>
<thead>
<tr>
<th>Place</th>
<th>App</th>
<th>Category</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>Finalist</td>
<td><a href="https://www.linium.com/research/news-updates/vote-team-smiles-to-win-servicenow-knowledge16-hackathon">Happiness Service</a></td>
<td>Innovation</td>
<td>app that brings together kids awaiting organ transplants and people who want to grant their wish and donate money.</td>
</tr>
<tr>
<td>Finalist</td>
<td><a href="https://www.youtube.com/watch?v=4MbyvYW_bvk&feature=youtu.be">LifeNow</a></td>
<td>Platform</td>
<td>app for employee health tracking with wearables, and gamification for challenges and points redemption for fitness products</td>
</tr>
<tr>
<td>Finalist</td>
<td>Create Doc <a href="https://www.youtube.com/watch?v=jP99ityPijU&feature=youtu.be">Demo</a> <a href="https://www.youtube.com/watch?v=FCUpDKi8tnY">Product</a></td>
<td>Business</td>
<td>app that automates document creation and management directly in ServiceNow</td>
</tr>
</tbody>
</table>
<h2>2017</h2>
<p><a href="https://community.servicenow.com/community?id=community_blog&sys_id=193daae5dbd0dbc01dcaf3231f96193d">Post</a></p>
<table>
<thead>
<tr>
<th>Place</th>
<th>App</th>
<th>Category</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td></td>
<td><a href="https://thewhitespace.io/blog/knowledge17-hackathon-greenlight/">GreenLight</a></td>
<td>Business</td>
<td>Presented a visualization of the carbon footprint of an enterprise. This functional visualization also allows users to actually manage and alter working elements and affect the energy consumption rates of the customer using it.</td>
</tr>
<tr>
<td></td>
<td><a href="https://github.com/CloudPires/LUDI">LUDI - Voice Controlled</a></td>
<td>Innovation</td>
<td>a voice integration application function into ServiceNow using the native voice recognition that ships as standard with the Google Chrome browser.</td>
</tr>
<tr>
<td></td>
<td>GiveNow</td>
<td>Social Good</td>
<td>Enables companies to connect their employees with opportunities to volunteer in their communities</td>
</tr>
</tbody>
</table>
<h2>2018</h2>
<p><a href="https://community.servicenow.com/community?id=community_blog&sys_id=2213cba6dbbd13002b6dfb651f9619b1">Post</a></p>
<p><a href="https://www.youtube.com/watch?v=CkzSssZCJTo">CreatorCon Hackathon 2018 Winners Webinar</a></p>
<table>
<thead>
<tr>
<th>Place</th>
<th>Team</th>
<th>App</th>
<th>Category</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td><a href="https://www.apnews.com/13a8fbf57e3500578146b42e597f40a0">Team Vocalize</a></td>
<td><a href="https://www.youtube.com/watch?v=-Lp9NNPFitY">Video</a></td>
<td>Innovation</td>
<td>Sentiment analyses of support conversations. Based on quality of sentiment metrics, you can assign actions and tasks to prioritize follow up on conversations.</td>
</tr>
<tr>
<td>2</td>
<td>Team Appoxio</td>
<td><a href="https://www.youtube.com/watch?v=CkzSssZCJTo">KSafeNow</a></td>
<td>Social Good</td>
<td>Student Tracker</td>
</tr>
<tr>
<td>3</td>
<td><a href="https://pathwayscg.com/">Team Scrantonicity</a></td>
<td><a href="https://www.youtube.com/watch?v=qTOJSro9tBY">NeutreNow</a></td>
<td>business</td>
<td>App NeutreNow to incentive healthy behavior (scroll down for full review). Tracks calory intake and calories burnt</td>
</tr>
</tbody>
</table>
<h2>2019 Hackathon</h2>
<ul>
<li><a href="https://blogs.servicenow.com/2019/servicenow-hackathon-winners-2019.html">Post</a></li>
<li><a href="https://community.servicenow.com/community?id=community_article&sys_id=5d66e3dcdb9d3b0422e0fb243996192a">CreatorCon Hackathon winners</a></li>
<li><a href="https://www.youtube.com/watch?v=1U-XCylkk54">Video of winner</a></li>
</ul>
<table>
<thead>
<tr>
<th>Place</th>
<th>Team</th>
<th>App</th>
<th>Category</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>Team Scrantonicity</td>
<td><a href="https://www.youtube.com/watch?v=1U-XCylkk54">Reizen by Pathways</a> <a href="https://community.servicenow.com/community?id=community_article&sys_id=5d66e3dcdb9d3b0422e0fb243996192a">@23:37</a></td>
<td>?</td>
<td>ServiceNow app that tracks travel expenses.</td>
</tr>
<tr>
<td>2</td>
<td><a href="https://www.drtstrategies.com/drt-it-smes-team-wins-2nd-place-in-servicenow-creatorcon-hackathon/">Above the Line</a></td>
<td>Cardio <a href="https://community.servicenow.com/community?id=community_article&sys_id=5d66e3dcdb9d3b0422e0fb243996192a">@01:29</a></td>
<td>?</td>
<td>Taking advantage of the fact that Virtual Agent can be set up to be public facing, the runner-up team created an app that automates customer identification for the process of renting or checking out cars.</td>
</tr>
<tr>
<td>3</td>
<td>Superconnectors</td>
<td>Expand Contact Center Workforce <a href="https://community.servicenow.com/community?id=community_article&sys_id=5d66e3dcdb9d3b0422e0fb243996192a">@13:26</a></td>
<td>Social Good</td>
<td>To create more accessibility for the hearing impaired to work in call center environments, Superconnectors created an app that leverages Service Portal and a web browser’s speech API to convert a customer’s voice to text. It then converts the service agent’s typed reply back into synthesized speech.</td>
</tr>
</tbody>
</table>
<h2>2020</h2>
<ul>
<li><a href="https://blogs.servicenow.com/2020/knowledge-2020-hackathon-winners.html">Post</a></li>
<li><a href="https://developer.servicenow.com/blog.do?p=/post/creatorcon-hackathon-2020-review/">Dev Post</a></li>
<li><a href="https://www.youtube.com/watch?v=wKPg08-9UH0">Video</a></li>
</ul>
<table>
<thead>
<tr>
<th>Place</th>
<th>Team</th>
<th>App</th>
<th>Category</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>Volteoans</td>
<td><a href="https://drive.google.com/file/d/1hsys4ccOPi77W1QLqU_vSvc2ugF79nQG/view">Clinical Care Management</a></td>
<td>Healthcare</td>
<td>The Clinical Care Management (CCM) app provides an end-to-end digital clinical care system that helps healthcare teams gather patient medical histories.</td>
</tr>
<tr>
<td>Finalist</td>
<td>Sopra Steria</td>
<td><a href="https://drive.google.com/open?id=1TlxGUekDeMlFx7Roe255iiqfS6MLuWot">JetVet</a></td>
<td>Banking</td>
<td>JetVet helps streamlines due diligence processes in procurement. The goal is to prevent corruption and unethical practices in an organization’s supply chain.</td>
</tr>
<tr>
<td>Finalist</td>
<td>World Class Wrakin’ Cru</td>
<td><a href="https://community.servicenow.com/community?id=community_video&sys_id=01ffcc38db7458502be0a851ca96197c">KICK: Key Items Crisis Kit</a></td>
<td>Manufacturing</td>
<td>KICK helps organizations source personal protective equipment. The app manages supply to meet emergency demand during crises like COVID-19.</td>
</tr>
<tr>
<td>Finalist</td>
<td>Extra Crispy Stimulus Package</td>
<td><a href="https://drive.google.com/drive/folders/1P9sppJqgjf5l5ij4-327xrqjrceGM6BV?usp=sharing">Zoom: Extra Crispy</a></td>
<td>Telecom</td>
<td>This app helps make Zoom meetings more productive. Zoom Extra Crispy uses Predictive Intelligence, Performance Analytics and Integration Hub features in the Now Platform to intake all recordings from the Zoom cloud and create knowledge article transcripts.</td>
</tr>
<tr>
<td>Finalist</td>
<td>NewRocket</td>
<td><a href="https://community.servicenow.com/community?id=community_video&sys_id=a0867724db3854504819fb2439961989">Reach</a></td>
<td>Social Good</td>
<td>In stressful conditions like the current pandemic, it can be very difficult to find reliable information and access critical resources locally. The Reach app uses personalization and the ServiceNow CSM app to create a dynamic personalized hub that offers access to local data and resources. Reach can be customized and used by cities of any size.</td>
</tr>
<tr>
<td>Mentioned</td>
<td>Click to Win</td>
<td><a href="https://youtu.be/vEUxMH58Kvc">AdVenture Manufaturist</a></td>
<td>Manufacturing</td>
<td>AdVenture Manufacturist is a simulation application where a user can rapidly acquire different manufacturing assets to increase revenue while balancing the enhancement of existing assets.</td>
</tr>
<tr>
<td>Mentioned</td>
<td>The Mighty Hacks</td>
<td><a href="https://youtu.be/ne8B2VqJGLE">Annexus</a></td>
<td>Social Good</td>
<td>The vision is to build a social mobile experience that connects people across video & voice to create a virtual community based on their interests.</td>
</tr>
<tr>
<td>Mentioned</td>
<td>Green Dot</td>
<td><a href="https://www.dropbox.com/s/k9ka2baat3lxyby/CareNow%20-%20Team%20Green%20Dot.mp4?dl=0">CareNow</a></td>
<td>Healthcare</td>
<td>CareNow - is a Smarter way to standardise quality home care.B CareNow application aims to improve the quality of in-home care (using features like intelligent assignment, ability to raise care requests, monitoring integration, etc.), address isolation issues faced by care recipient and provide a performance monitoring system for Health care providers and regulatory body.</td>
</tr>
<tr>
<td>Mentioned</td>
<td>Team Scrantonicity</td>
<td><a href="https://pathwayscg.sharefile.com/d-sf2daf96fec94f0c9">Connected Community</a></td>
<td>Social Good</td>
<td>The Connected Community application serves two purposes: Connecting parties offering charitable goods or services with those who are accepting them and helping to coordinate public events related to charity and public well-being. This has value for not only the community, but also as positive PR for the businesses that host or partake in using the application.</td>
</tr>
<tr>
<td>Mentioned</td>
<td>Carnav</td>
<td><a href="https://www.youtube.com/watch?v=XZMr3LG6wEk">EcoNow</a></td>
<td>Social Good</td>
<td>Organizations want to show their support to promote social good in a consistent and continuous way. Empower your employees to launch and coordinate social good initiatives and promote this actions within the company to get support from other fellow employees to make actions for a better community and world.</td>
</tr>
<tr>
<td>Mentioned</td>
<td>Brahmasthra</td>
<td><a href="https://www.youtube.com/watch?v=k2-9JSapdXA">Healthcare Service Management (HSM)</a></td>
<td>Healthcare</td>
<td>Our solution helps in covering end to end hospital services. As an end user (Patient) all you must do is download an app and book appointments/pay bill/Know the medication details. Used all latest features like now mobile app, Agent Work space, Flow Designer, Virtual Agent, scoped application b Studio Development, Integration with Twilio.</td>
</tr>
<tr>
<td>Mentioned</td>
<td>ZeTechno-Sailors</td>
<td><a href="https://youtu.be/v54XMiRyefE">MedicoNOW-Connect Better</a></td>
<td>Healthcare</td>
<td>“MedicoNow app is built to provide better communication between healthcare specialists and patients. The app provides an end to end experience for patients and specialists to view/book appointments, connect via chat/VIDEO, join in social Q/A community. Works on both, large and on mobile devices.</td>
</tr>
<tr>
<td>Mentioned</td>
<td>The Down Underscores</td>
<td><a href="https://www.youtube.com/watch?v=WlVHE1ZM4GE">Resus Runner</a></td>
<td>Healthcare</td>
<td>In todays world, our hospital emergency wards are experiencing an unprecedented level of strain. In cases where patients need to be resuscitated, our emergency doctors and nurses face a high-stress and fast-moving environment where they need simple ways to track and document the actions they take in real-time - whether this is performing CPR, administering medication or taking notes and observations about a resuscitation event. As our hospitals are stretched and new staff brought on board to deal with the increased pressure caused by COVID-19, we need better ways to bring people up to speed with understanding the processes as quickly as possible. Historically many emergency wards have used pen and paper to document these resuscitation events, often needing to recreate the timeline of actions after the fact. Digitizing and simplifying these processes can help our Medical workers to focus more on caring for their patients, and less on maintaining paperwork.</td>
</tr>
</tbody>
</table>
<h2>2021</h2>
<blockquote>
<p>A mobile-friendly platform to attend virtual classes. A better way to stream interactive online events. A system that allows office employees to order and receive supplies from drones. These are among the best ideas to emerge from the Knowledge 2021 CreatorCon Hackathon, held May 8-9.<br />
The hackathon serves as a forum for coders to design and display innovative apps on the Now Platform that can solve real business problems.<br />
This year, more than 100 teams competed in the hackathon. ServiceNow judges for the event—including a vice president of platform product management, senior product managers, staff engineers, and developer advocates—selected four finalists and the Grand Prize winner, as well as five targeted award winners. The Grand Prize-winning team received Oculus Quest 2 virtual reality headsets and Bose Bluetooth headphones.</p>
</blockquote>
<ul>
<li><a href="https://blogs.servicenow.com/2021/creatorcon-2021-hackathon-winners.html">Post</a></li>
<li><a href="https://developer.servicenow.com/blog.do?p=/post/creatorcon-hackathon-2021-winners/">Dev Post</a></li>
</ul>
<table>
<thead>
<tr>
<th>Place</th>
<th>Team</th>
<th>App</th>
<th>Category</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>Winner</td>
<td>Hakuna Matata</td>
<td><a href="https://www.youtube.com/watch?v=w4xZWCgNsPM">Virtual University</a></td>
<td>Best Mobile Experience app</td>
<td>The app creates a single, easy-to-use platform for students, teachers, and administrators to manage their workloads and interactions</td>
</tr>
<tr>
<td>Finalist</td>
<td>Dev Without Hats</td>
<td><a href="https://www.youtube.com/watch?v=FaMfClHR3HU">Obsequio</a></td>
<td>Best Now Experience app</td>
<td>This app creates a scalable, cloud-based system for desktop and mobile devices that allows users to report risk, safety, and compliance issues.</td>
</tr>
<tr>
<td>Finalist</td>
<td>PhilGoesDeep</td>
<td><a href="https://www.youtube.com/watch?v=b-fQIVFl4v4">OBS Overlays with AES</a></td>
<td>Best app started from AES</td>
<td>OBS Overlays with App Engine Studio</td>
</tr>
<tr>
<td>Finalist</td>
<td>Arnav Solo</td>
<td><a href="https://www.youtube.com/watch?v=dlnXxWUMR3w">SentinmentNow</a></td>
<td></td>
<td>Using machine learning, this app helps companies monitor consumer interactions in real time and spot patterns that result in unhappy customers, such as lack of knowledge about a particular product or agent behavior that escalates disputes.</td>
</tr>
<tr>
<td>Finalist</td>
<td>Team Scrantonicity</td>
<td><a href="https://www.youtube.com/watch?v=4bWxRz0ufwY">RAID</a></td>
<td>Most compelling IntegrationHub spoke</td>
<td>RAID (Request Automated In-office Delivery). With this app, workers can use the Amazon Alexa voice assistant to order office supplies or personal protective equipment such as masks and have a drone deliver those items right to their desk.</td>
</tr>
<tr>
<td>Finalist</td>
<td>ServiceNow's Gaming Division</td>
<td><a href="https://www.youtube.com/watch?v=9w_yimPFgBE">Virtua Agent</a></td>
<td>Best use of Now Intelligence</td>
<td>This app transformed the chatbot into a type of digital game show host that can enable messages from one user to another, moderate Q&As, and assign roles to users that dynamically change.</td>
</tr>
<tr>
<td>Mentioned</td>
<td>Alpha Monksters</td>
<td><a href="https://www.youtube.com/watch?v=5MANTvFGYgg">Back2School</a></td>
<td></td>
<td>What if we tell you that your day-to-day role as a student/teacher/parent would become much easier to manage by just a few configuration adjustments via cloud-based platform utilizing Mobile UI/Web Page UI as well a Chat UI? Furthermore, imagine leveraging this for universities with affiliated colleges through platform domain separation? Why stop there? Perhaps make it available for trainings in Corporate Industry?</td>
</tr>
<tr>
<td>Mentioned</td>
<td>Volteoans</td>
<td><a href="https://drive.google.com/file/d/1LNFE91PaJquWufCtwWUz2hvJEU1DG7PV/view">ShipmentNow</a></td>
<td></td>
<td>ShipmentNow is a digital shipping management solution built on ServiceNow to make your enterprise shipment booking, tendering, tracking easier and efficient with simple configuration and automation.</td>
</tr>
<tr>
<td>Mentioned</td>
<td>Les 3 FrC(res</td>
<td><a href="https://youtu.be/2uorx8j668U">SPORTal</a></td>
<td></td>
<td>SPORTal brings people together: Be Healthy, Be Social Pick your sport & participate in the events that suit you best.</td>
</tr>
<tr>
<td>Mentioned</td>
<td>AECON</td>
<td><a href="https://drive.google.com/file/d/18JZ4nUaFC1MJXG4XysxocxpIp1ZHcRg_/view">LMS Now</a></td>
<td></td>
<td>This application will bridge the gap between HRs and employees by digitizing the leave tracker system - Will reduce management efforts. increase team productivity - Integrable application will ensure greater visibility towards organization KPIs, better project planning by the Project management department Cost management by payroll and invoicing departments wrt billable hours and non-billable hours IT department can take this as a feeder into the on-call scheduler and critical/priority task assignments</td>
</tr>
<tr>
<td>Mentioned</td>
<td>KMD - TalentLab</td>
<td><a href="https://youtu.be/X2YZe16mDjU">Extended User Profile</a></td>
<td></td>
<td>“Extended User Profile is a response to the lack of interaction at the workplace due to the worldwide shift to remote work. As colleagues hide behind their computer screens, they do not form close bonds with one another, which can lead to decreased motivation, worse results and low overall incentive. The introduction of Extended User Profile - highly customizable, interactive user profiles - can be a starting point towards better employee interactions, increased workplace visibility and company-wide initiatives. As a result, employees get to express themselves freely and proactively reach out to other colleagues that share their backgrounds and interests. Other functions include social media integration, visual effects, nicknames, and more.</td>
</tr>
<tr>
<td>Mentioned</td>
<td>CG Squad</td>
<td><a href="https://drive.google.com/drive/folders/1q6nlIFxc5YxSKqArFSVWMYuDrhuIDTYM">Educator 3000</a></td>
<td></td>
<td>Educator 3000 brings the power of the Now Platform to solving the issue of education during COVID-19. Students, Teachers, classes, courses, school work, and grades can now be managed and automated using the Now Platform giving the students and teacher the space to focus on what really matters.</td>
</tr>
<tr>
<td>Mentioned</td>
<td>Auranx</td>
<td><a href="https://www.youtube.com/watch?v=6KZVwVfR4OU">WantedApp</a></td>
<td></td>
<td>WantedApp makes the recruitement process easier by making all the different steps accessible from one toom (technical tests, HR meetings, etc.)</td>
</tr>
<tr>
<td>Mentioned</td>
<td>Wampa SNOW Beasts</td>
<td><a href="https://drive.google.com/file/d/1ZrgOpIk1Rrlovd0FQ609si_ZLCojA2vL/view">LevelUp!</a></td>
<td></td>
<td>What is the purpose of the product for the business? Yes probably to make $ but speak to monetization, pricing strategy(s). Some products are about driving customer counts, some are competition blockers.</td>
</tr>
<tr>
<td>Mentioned</td>
<td>Nuvolo</td>
<td><a href="https://youtu.be/X-qkHRPbLk4">ServiceNow Voice</a></td>
<td></td>
<td>“We are building a Smart Vernacular Video/Audio Conference Platform using ServiceNow Agents and UI form builder & Mobile Platform. It enable users too have conversation in any respective language & translate all Audio & text conversation on the fly. This will help users to have cross border support without worrying about language as a barrier. For the current business use case we will be implementing this solution to the health care domain, where information and knowledge can be shared across borders in real time. Doctors and Researchers can create their ServiceNow pages using UI builder, then they will be able to schedule a web conference call, where ServiceNow Agents api can help them to translate their voice on the fly.”</td>
</tr>
</tbody>
</table>
<!--EndFragment-->How to restart a workflow2019-04-05T22:56:19Zhttps://jace.pro/post/2019-04-05-restarting-workflows/Jace Benson<!--StartFragment-->
<p>Restarting a workflow is sometimes needed. I found myself looking at how<br />
to to do this today.</p>
<p>I'm posting this so I don't have to re-do this again.</p>
<p>There are 2 ways to restart workflows.</p>
<ol>
<li>
<p>No code.</p>
<ul>
<li>Delete the workflow context record. I do this by going to the record in question. E.g. <code>/sc_req_item.do?sysparm_query=number=RITM0012345</code></li>
<li>Click into the "Show Workflow Context" UI Action Link (above the related lists)</li>
<li>Click Delete on the top right of the workflow context record !!! BE SURE YOU'RE ON THE WF_CONTEXT !!!</li>
<li>Goto the RITM and update the stage to <code>request_approved</code></li>
<li>That's it.</li>
</ul>
</li>
<li>
<p>With Code.</p>
<ul>
<li>Delete the workflow context record. I do this by going to the record in question. E.g. <code>/sc_req_item.do?sysparm_query=number=RITM0012345</code></li>
<li>Click into the "Show Workflow Context" UI Action Link (above the related lists)</li>
<li>Click Delete on the top right of the workflow context record !!! BE SURE YOU'RE ON THE WF_CONTEXT !!!</li>
<li>Goto the <code>wf_workflow.list</code> table and find the workflow you want to start, copy it's <code>sys_id</code>.</li>
<li>Run this script in a background script;</li>
</ul>
</li>
</ol>
<pre class="language-javascript"><code class="language-javascript"> <span class="token keyword">var</span> current <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'sc_req_item'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> current<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'number'</span><span class="token punctuation">,</span><span class="token string">'RITM0012345'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> id <span class="token operator">=</span> <span class="token string">'cfe7a62f13958340f415345fd144b075'</span><span class="token punctuation">;</span><span class="token comment">//wf_workflow sys_id here</span><br /> <span class="token keyword">var</span> w <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Workflow</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> context <span class="token operator">=</span> w<span class="token punctuation">.</span><span class="token function">startFlow</span><span class="token punctuation">(</span>id<span class="token punctuation">,</span> current<span class="token punctuation">,</span> current<span class="token punctuation">.</span><span class="token function">operation</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">var</span> vars <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span><br /> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">var</span> n <span class="token keyword">in</span> current<span class="token punctuation">.</span>variables<span class="token punctuation">)</span> <br /> vars<span class="token punctuation">[</span>n<span class="token punctuation">]</span> <span class="token operator">=</span> current<span class="token punctuation">.</span>variables<span class="token punctuation">[</span>n<span class="token punctuation">]</span><span class="token punctuation">;</span><br /> <span class="token keyword">return</span> vars<span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p>Further Reading:<br />
<a href="https://docs.servicenow.com/bundle/madrid-application-development/page/app-store/dev_portal/API_reference/Workflow/concept/c_Workflow_api.html#r_WF-startFlow_String_GR_S_A">https://docs.servicenow.com/bundle/sandiego-application-development/page/app-store/dev_portal/API_reference/Workflow/concept/c_Workflow_api.html#r_WF-startFlow_String_GR_S_A</a></p>
<!--EndFragment-->Advanced Reported with Related List Conditions2019-03-20T22:55:14Zhttps://jace.pro/post/2019-03-19-reporting-/Jace Benson<p>The other day I was asked, "Hey, how can I find all the access controls with NO related roles?"</p>
<p>Reporting on the lack of something is really tough (generally). In this case though Related List Condition queries shine. You can access them in the report interface on ServiceNow.</p>
<!--StartFragment-->
<table>
<thead>
<tr>
<th>Requirement</th>
<th>Suggested Approach</th>
</tr>
</thead>
<tbody>
<tr>
<td>CIs with more than 1 Active Incident</td>
<td>Related List Condition</td>
</tr>
<tr>
<td>CIs with no outages last month</td>
<td>Related List Condition</td>
</tr>
<tr>
<td>Active Incidents with No Active Tasks</td>
<td>Related List Condition</td>
</tr>
<tr>
<td>Incidents assigned to a manager</td>
<td>Related List Condition * / Scripted Filter + Dynamic Filter Option</td>
</tr>
<tr>
<td>Users in my assignment groups with no active incidents assigned to them</td>
<td>Scripted Filter + Dynamic Filter Option</td>
</tr>
</tbody>
</table>
<!--EndFragment-->Finding globally available things2019-03-13T22:52:23Zhttps://jace.pro/post/2019-03-13-finding-global-things/Jace Benson<!--StartFragment-->
<p>I was in the middle of restoring my PC and thought "I wonder if I can<br />
view all the globally accessible things?"</p>
<p>Turns out, you can.</p>
<!--EndFragment-->
<!--StartFragment-->
<pre class="language-javascript"><code class="language-javascript">Object<span class="token punctuation">.</span><span class="token function">keys</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">forEach</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">thing</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /><span class="token keyword">try</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> type_of_thing <span class="token operator">=</span> <span class="token function">eval</span><span class="token punctuation">(</span><span class="token string">'typeof '</span> <span class="token operator">+</span> thing<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span><span class="token punctuation">(</span>type_of_thing <span class="token operator">===</span> <span class="token string">'object'</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">var</span> prop <span class="token keyword">in</span> thing<span class="token punctuation">)</span><span class="token punctuation">{</span><br /> gs<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span><span class="token string">'-: '</span> <span class="token operator">+</span> prop<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /> gs<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span>thing <span class="token operator">+</span> <span class="token string">': '</span> <span class="token operator">+</span> <span class="token function">eval</span><span class="token punctuation">(</span><span class="token string">'typeof '</span> <span class="token operator">+</span> thing<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span> <span class="token keyword">catch</span><span class="token punctuation">(</span>e<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> gs<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span><span class="token string">'error'</span><span class="token punctuation">,</span><span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">stringify</span><span class="token punctuation">(</span>e<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span><br /><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<!--EndFragment-->
<!--StartFragment-->
<p>In an out of box instance I get a big output. Alot of these are old<br />
"Global Business Rules" but some are weird.</p>
<h1>Globally available</h1>
<ul>
<li>
<p>SNString</p>
<pre class="language-javascript"><code class="language-javascript"> <span class="token keyword">function</span> <span class="token function">String</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token string">"[native code for String.String, arity=1]"</span><br /> <span class="token punctuation">}</span></code></pre>
</li>
<li>
<p>SNRegExp</p>
<pre class="language-javascript"><code class="language-javascript"> <span class="token keyword">function</span> <span class="token function">RegExp</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token string">"[native code, arity=0]"</span><br /> <span class="token punctuation">}</span></code></pre>
</li>
<li>
<p>GlideArrayRecord</p>
<ul>
<li>Seems to work just like GlideRecord.</li>
</ul>
</li>
<li>
<p>sys_meta</p>
<ul>
<li>This is super interseting. <code>sys_meta</code> has a property for every<br />
table. <code>sys_meta.sys_user</code> has a property for every field.<br />
<code>sys_meta.sys_user.date_format</code> has then a property for the<br />
sys_dictionary record. The type is<br />
<code>com.glide.script.FieldGlideDescriptor</code></li>
</ul>
</li>
<li>
<p>system</p>
<ul>
<li>This is super interesting. This might be what UI Actions have<br />
available to them with the <code>action</code> variable. <code>system</code> has one<br />
<code>JavaObject</code> called action. <code>system.action</code> has many things.</li>
<li>canPop</li>
<li>canRunAction</li>
<li>enforceMandatoryOnUpdate</li>
<li>equals</li>
<li>get</li>
<li>getActionName</li>
<li>getActionSysId</li>
<li>getBody</li>
<li>getCategory</li>
<li>getClass</li>
<li>getCondition</li>
<li>getFromType</li>
<li>getGRList</li>
<li>getGlideURI</li>
<li>getGotoURL</li>
<li>getLabel</li>
<li>getName</li>
<li>getOnClick</li>
<li>getOnClickEscaped</li>
<li>getRedirectURL</li>
<li>getRef</li>
<li>getReturnURL</li>
<li>getRunAt</li>
<li>getTableName</li>
<li>getTarget</li>
<li>getType</li>
<li>getUniqueFieldValue</li>
<li>getValues</li>
<li>hashCode</li>
<li>isInsert</li>
<li>isNextRecord</li>
<li>isPreviousRecord</li>
<li>isRedirect</li>
<li>notify</li>
<li>notifyAll</li>
<li>openGlideRecord</li>
<li>process</li>
<li>setCategory</li>
<li>setFromType</li>
<li>setGRList</li>
<li>setGotoURL</li>
<li>setNoPop</li>
<li>setRedirectURL</li>
<li>setRequest</li>
<li>setReturnURL</li>
<li>setTarget</li>
<li>setType</li>
<li>setUniqueField</li>
<li>toString</li>
<li>wait()| Function | |</li>
<li>class| JavaObject | |</li>
<li>glideURI| JavaObject | "snd_xplore.do?" |</li>
<li>values| JavaObject | "{}" |</li>
<li>noPop| undefined | undefined |</li>
<li>request| undefined | undefined |</li>
<li>uniqueField| undefined | undefined |</li>
<li>actionSysId| null | null |</li>
<li>category| null | null |</li>
<li>redirectURL| null | null |</li>
<li>returnURL| null | null |</li>
<li>GRList</li>
<li>actionName</li>
<li>body</li>
<li>condition</li>
<li>fromType</li>
<li>gotoURL</li>
<li>insert</li>
<li>label</li>
<li>name</li>
<li>nextRecord</li>
<li>onClick</li>
<li>onClickEscaped</li>
<li>previousRecord</li>
<li>redirect</li>
<li>ref</li>
<li>runAt</li>
<li>tableName</li>
<li>target</li>
<li>type</li>
<li>uniqueFieldValue</li>
</ul>
</li>
<li>
<p>gs</p>
<ul>
<li><code>gs</code> seems to be a copy of the above<br />
(<code>system.action</code>)[#system]</li>
</ul>
</li>
<li>
<p>global <em><strong>SPECIAL</strong></em></p>
</li>
<li>
<p>GlideDBObjectManager <em><strong>SPECIAL</strong></em></p>
</li>
<li>
<p>GlideNumberManager <em><strong>SPECIAL</strong></em></p>
</li>
<li>
<p>getUsersForRoleDelegation</p>
</li>
<li>
<p>getRoleDelegatorGroupOptions</p>
</li>
<li>
<p>getRoleDelegatorOptions</p>
</li>
<li>
<p>getMyRoleDelegationGroups</p>
</li>
<li>
<p>getDelegatableRoles</p>
</li>
<li>
<p>cmn_notif_device_listGetViewName</p>
</li>
<li>
<p>cmn_notif_deviceGetViewName</p>
</li>
<li>
<p>cxs_table_config_srch_as_fldGetChoices</p>
</li>
<li>
<p>getBaseFilter</p>
</li>
<li>
<p>getUserHomepages</p>
</li>
<li>
<p>getRefColumnDictionary</p>
</li>
<li>
<p>getMyRequestIDs</p>
</li>
<li>
<p>closeChange</p>
</li>
<li>
<p>closeProblem</p>
</li>
<li>
<p>closeIncident</p>
</li>
<li>
<p>closeRelatedTasks</p>
</li>
<li>
<p>getStatsOptions</p>
</li>
<li>
<p>dmn_demand_stageGetChoices</p>
</li>
<li>
<p>getNextObjNumber</p>
</li>
<li>
<p>saListCis</p>
</li>
<li>
<p>getAllMembersOfMyGroups</p>
</li>
<li>
<p>getGroupMembersGivenGroupID</p>
</li>
<li>
<p>getGroupMembersGivenGroupName</p>
</li>
<li>
<p>hasAccessToDocument</p>
</li>
<li>
<p>global_simple_events</p>
</li>
<li>
<p>global_events</p>
</li>
<li>
<p>GetIDValue</p>
</li>
<li>
<p>emailsToUsers</p>
</li>
<li>
<p>getUserDashboards</p>
</li>
<li>
<p>lastWeek</p>
</li>
<li>
<p>nowDateTime</p>
</li>
<li>
<p>now</p>
</li>
<li>
<p>isAdvancedUI</p>
</li>
<li>
<p>getWeekStart</p>
</li>
<li>
<p>notifDeviceRefQual</p>
</li>
<li>
<p>getGroupsInHierarchy</p>
</li>
<li>
<p>getRelatedGroup</p>
</li>
<li>
<p>getRelatedCI</p>
</li>
<li>
<p>getRelatedRecords</p>
</li>
<li>
<p>workflowTaskTemplateReferenceQualifier</p>
</li>
<li>
<p>GetGroupFilter</p>
</li>
<li>
<p>getDefaultDeliveryPlan</p>
</li>
<li>
<p>getDisplayValueOf</p>
</li>
<li>
<p>limitFieldLength</p>
</li>
<li>
<p>v_field_editor_lengthGetChoices</p>
</li>
<li>
<p>v_ws_field_editor_lengthGetChoices</p>
</li>
<li>
<p>restrictCatItemsForGuides</p>
</li>
<li>
<p>trim</p>
</li>
<li>
<p>addChoiceType</p>
</li>
<li>
<p>limitFieldType</p>
</li>
<li>
<p>v_field_editor_typeGetChoices</p>
</li>
<li>
<p>sys_userGetEmailAddress</p>
</li>
<li>
<p>incidentGetCaller</p>
</li>
<li>
<p>incident_listGetViewName</p>
</li>
<li>
<p>incidentGetViewName</p>
</li>
<li>
<p>padObjNumber</p>
</li>
<li>
<p>getNextObjNumberPadded</p>
</li>
<li>
<p>cmdbCIChildren</p>
</li>
<li>
<p>getDefaultContentType</p>
</li>
<li>
<p>sys_dictionary_elementCanWrite</p>
</li>
<li>
<p>sys_dictionary_nameCanWrite</p>
</li>
<li>
<p>getDictionaryEntry</p>
</li>
<li>
<p>doesEntryFloat</p>
</li>
<li>
<p>cmdb_rel_type_suggest_relationshipGetChoices</p>
</li>
<li>
<p>rm_release_phase_ProcessFlowList</p>
</li>
<li>
<p>idea_stageGetChoices</p>
</li>
<li>
<p>rm_release_ProcessFlowList</p>
</li>
<li>
<p>ProposedChangesExist</p>
</li>
<li>
<p>sc_req_item_stage_DeliveryPlanChoices</p>
</li>
<li>
<p>sc_req_item_stageGetChoices</p>
</li>
<li>
<p>getKBMandatoryFields</p>
</li>
<li>
<p>dmn_demand_ProcessFlowList</p>
</li>
<li>
<p>GetReasonForChange</p>
</li>
<li>
<p>cxs_table_field_config_fieldGetChoices</p>
</li>
<li>
<p>getRoleListIds</p>
</li>
<li>
<p>getRoledUsers</p>
</li>
<li>
<p>addWFVariables</p>
</li>
<li>
<p>addDefaultVariables</p>
</li>
<li>
<p>addVariables</p>
</li>
<li>
<p>addVariableSets</p>
</li>
<li>
<p>wf_variables</p>
</li>
<li>
<p>getPrimaryCompany</p>
</li>
<li>
<p>getBannerSrc</p>
</li>
<li>
<p>recurseImageParents</p>
</li>
<li>
<p>getBannerText</p>
</li>
<li>
<p>recurseParents</p>
</li>
<li>
<p>getMyGroups</p>
</li>
<li>
<p>deleteAllRecords</p>
</li>
<li>
<p>getCurrencyFilter</p>
</li>
<li>
<p>populatedFilterRefQual</p>
</li>
<li>
<p>getLDAPSources</p>
</li>
<li>
<p>isMandatoryNotification</p>
</li>
<li>
<p>dynamicUserCreation</p>
</li>
<li>
<p>sys_sg_master_item_tableGetChoices</p>
</li>
<li>
<p>checkAllApprovers</p>
</li>
<li>
<p>isApprovalMine</p>
</li>
<li>
<p>getMyAssignments</p>
</li>
<li>
<p>getMyApprovals</p>
</li>
<li>
<p>getApplicableTemplates</p>
</li>
<li>
<p>getMobileLayoutCatalogs</p>
</li>
<li>
<p>sys_trigger_system_idGetChoices</p>
</li>
<li>
<p>getDefaultKB</p>
</li>
<li>
<p>checkForUnscheduled</p>
</li>
<li>
<p>createProblem</p>
</li>
<li>
<p>globalListen</p>
</li>
<li>
<p>getGroupQualifier</p>
</li>
<li>
<p>getDateFilterOptions</p>
</li>
<li>
<p>historyRecordPresent</p>
</li>
<li>
<p>recordHasUpdateXML</p>
</li>
<li>
<p>areAllPreviewProblemsIgnored</p>
</li>
<li>
<p>updateSetPreviewInstalled</p>
</li>
<li>
<p>kbGetText</p>
</li>
<li>
<p>kbWriteComment</p>
</li>
<li>
<p>homeGetViewName</p>
</li>
<li>
<p>sc_cat_itemGetViewName</p>
</li>
<li>
<p>sc_req_itemGetViewName</p>
</li>
<li>
<p>NumberManager</p>
</li>
</ul>
<h1><a href="https://jace.pro/post/2019-03-13-finding-global-things/#available-in-script-includes">Available in Script Includes</a></h1>
<p>If you define these in a script include it may cause an issue.</p>
<ul>
<li>CALLABLE_PREFIX</li>
<li>gc</li>
<li>getChars</li>
<li>getDocument</li>
<li>getName</li>
<li>getParameter</li>
<li>getRootElement</li>
<li>getType</li>
<li>getValue</li>
<li>initialize</li>
<li>newItem</li>
<li>process</li>
<li>request</li>
<li>responseXML</li>
<li>setAnswer</li>
<li>setError</li>
<li>type</li>
</ul>
<!--EndFragment-->Import Sets. Use them.2019-03-01T23:49:52Zhttps://jace.pro/post/2019-03-01-using-import-sets-always/Jace Benson<!--StartFragment-->
<p>I was asked to present a lab I submitted to <a href="https://jace.pro/post/2018-12-02-k19-proposals/">K19</a> at the local Minnesota ServiceNow User Group. I thought this would be great so I went down the path of making this small lab about using import sets.</p>
<p>Here's a link to the <a href="https://sndevs.github.io/meetups/decks/integrate-faster-import-sets">deck</a>.</p>
<p>The short version of this is;</p>
<p>Always use import sets for data from another system, and always store all the data you can see in that import set so you don't have to get into the integration to do modifications.</p>
<p>You may hear reasons to not do this;</p>
<p><strong>Objection:</strong> "This is just a small SolarWinds import to add to our network devices, It would be just as fast to write to the table in a script include."</p>
<p><strong>What you should think:</strong> "Sure, but then the moment they change their data or want to coalesce on something else, you'll have to re-interrogate the data to map it."</p>
<p><strong>What you should say:</strong> "Any integration needs to come in to a import set table where we will hold the data for a few days so we can transform the data to our values regardless how the data in that other system exists.</p>
<p><strong>Objection:</strong> "I've done plenty of integrations and this one just runs on demand to get the start date of a new employee, literally just populating the variables on RITM"</p>
<p><strong>What you should think:</strong> "Sure, until they change their mind and want it to do something more with some other element they were sharing."</p>
<p><strong>What you should say:</strong> "We store all data seen from the integration for future use in case the need arises to use them based on future work. This simplifies the integration later for other to work on it.</p>
<p><strong>Objection:</strong> "This just adds overhead to what would otherwise be a simple integration."</p>
<p><strong>What you should think:</strong> "It's only overhead if you don't do <strong>all</strong> your integrations that way. By being consistent anyone on your team should be able to quickly identify what needs to be changed.</p>
<p><strong>What you should say:</strong> "Being consistent on this lets anyone on the team quickly work on the same integration without having to explain every nuance about the integration."</p>
<p><strong>Objection:</strong> Bringing in data from a nested source like JSON or XML doesn't make sense.</p>
<p><strong>What you should should think:</strong> There's common ways to flatten that down.</p>
<p><strong>What you should say:</strong> Below are examples of how to flatten JSON.</p>
<!--EndFragment-->
<!--StartFragment-->
<pre class="language-javascript"><code class="language-javascript"><span class="token keyword">var</span> <span class="token function-variable function">flatten</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">data</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> result <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span><br /> <span class="token keyword">function</span> <span class="token function">recurse</span> <span class="token punctuation">(</span><span class="token parameter">cur<span class="token punctuation">,</span> prop</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">Object</span><span class="token punctuation">(</span>cur<span class="token punctuation">)</span> <span class="token operator">!==</span> cur<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> result<span class="token punctuation">[</span>prop<span class="token punctuation">]</span> <span class="token operator">=</span> cur<span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>Array<span class="token punctuation">.</span><span class="token function">isArray</span><span class="token punctuation">(</span>cur<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">var</span> i<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">,</span> l<span class="token operator">=</span>cur<span class="token punctuation">.</span>length<span class="token punctuation">;</span> i<span class="token operator"><</span>l<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span><br /> <span class="token function">recurse</span><span class="token punctuation">(</span>cur<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">,</span> prop <span class="token operator">+</span> <span class="token string">"["</span> <span class="token operator">+</span> i <span class="token operator">+</span> <span class="token string">"]"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>l <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span><br /> result<span class="token punctuation">[</span>prop<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> isEmpty <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span><br /> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">var</span> p <span class="token keyword">in</span> cur<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> isEmpty <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span><br /> <span class="token function">recurse</span><span class="token punctuation">(</span>cur<span class="token punctuation">[</span>p<span class="token punctuation">]</span><span class="token punctuation">,</span> prop <span class="token operator">?</span> prop<span class="token operator">+</span><span class="token string">"."</span><span class="token operator">+</span>p <span class="token operator">:</span> p<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>isEmpty <span class="token operator">&&</span> prop<span class="token punctuation">)</span><br /> result<span class="token punctuation">[</span>prop<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /> <span class="token function">recurse</span><span class="token punctuation">(</span>data<span class="token punctuation">,</span> <span class="token string">""</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">return</span> result<span class="token punctuation">;</span><br /><span class="token punctuation">}</span><br /><span class="token keyword">var</span> obj <span class="token operator">=</span> <span class="token punctuation">{</span><br /> <span class="token literal-property property">name</span><span class="token operator">:</span> <span class="token punctuation">{</span><br /> <span class="token literal-property property">first</span><span class="token operator">:</span> <span class="token string">"Jace"</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">last</span><span class="token operator">:</span> <span class="token string">"Benson"</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">website</span><span class="token operator">:</span> <span class="token string">"https://blog.jace.pro"</span><br /><span class="token punctuation">}</span><span class="token punctuation">;</span><br />gs<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span><span class="token string">'Normal:'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br />gs<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span><span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">stringify</span><span class="token punctuation">(</span>obj<span class="token punctuation">)</span><span class="token punctuation">)</span><br />gs<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span><span class="token string">'Flattened:'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br />gs<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span><span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">stringify</span><span class="token punctuation">(</span><span class="token function">flatten</span><span class="token punctuation">(</span>obj<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><br />gs<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span><span class="token string">'XMLtoJSON Flattened:'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token keyword">var</span> xmlStr <span class="token operator">=</span> <span class="token string">""</span><span class="token punctuation">;</span><br />xmlStr <span class="token operator">+=</span> <span class="token string">"<Person>"</span><span class="token punctuation">;</span><br />xmlStr <span class="token operator">+=</span> <span class="token string">" <Name>"</span><span class="token punctuation">;</span><br />xmlStr <span class="token operator">+=</span> <span class="token string">" <First>Jace</First>"</span><span class="token punctuation">;</span><br />xmlStr <span class="token operator">+=</span> <span class="token string">" <Last>Benson</Last>"</span><span class="token punctuation">;</span><br />xmlStr <span class="token operator">+=</span> <span class="token string">" </Name>"</span><span class="token punctuation">;</span><br />xmlStr <span class="token operator">+=</span> <span class="token string">" <Site>"</span><span class="token punctuation">;</span><br />xmlStr <span class="token operator">+=</span> <span class="token string">" https://blog.jace.pro"</span><span class="token punctuation">;</span><br />xmlStr <span class="token operator">+=</span> <span class="token string">" </Site>"</span><span class="token punctuation">;</span><br />xmlStr <span class="token operator">+=</span> <span class="token string">"</Person>"</span><span class="token punctuation">;</span><br /><br /><span class="token keyword">var</span> xmlObj <span class="token operator">=</span> gs<span class="token punctuation">.</span><span class="token function">xmlToJSON</span><span class="token punctuation">(</span>xmlStr<span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token comment">//gs.info(JSON.stringify(xmlObj,'',' '));</span><br />gs<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span><span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">stringify</span><span class="token punctuation">(</span><span class="token function">flatten</span><span class="token punctuation">(</span>xmlObj<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><br /><span class="token comment">/*** Script: Normal:<br />*** Script: <br />{<br /> "name": {<br /> "first":"Jace",<br /> "last":"Benson"<br /> },<br /> "website":"https://blog.jace.pro"<br />}<br />*** Script: Flattened:<br />*** Script: <br />{<br /> "name.first":"Jace",<br /> "name.last":"Benson",<br /> "website":"https://blog.jace.pro"<br />}<br />*** Script: XMLtoJSON Flattened:<br />*** Script: <br />{<br /> "Person.Site":"https://blog.jace.pro",<br /> "Person.Name.Last":"Benson",<br /> "Person.Name.First":"Jace"<br />}<br />***/</span></code></pre>
<!--EndFragment-->Multirow Variable Sets in code2019-02-04T22:44:32Zhttps://jace.pro/post/2019-02-04-multi-row-variable-sets-in-code/Jace Benson<!--StartFragment-->
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Anyone out there in <a href="https://twitter.com/hashtag/ServiceNow?src=hash&ref_src=twsrc%5Etfw">#ServiceNow</a> / <a href="https://twitter.com/hashtag/ServiceNowDev?src=hash&ref_src=twsrc%5Etfw">#ServiceNowDev</a> ever built anything that allows you to print the RITM and include variables? Special bonus if it can do it with London's multi-line variable set feature.</p>— Rob (@rfedoruk) <a href="https://twitter.com/rfedoruk/status/1092322323364003840?ref_src=twsrc%5Etfw">February 4, 2019</a></blockquote> <script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<!--EndFragment-->
<!--StartFragment-->
<p>In our discussions we found this new table <code>sc_multi_row_question_answer</code>. I needed to post this before I forget, as it's useful. Eventually I'll update my variable scripts to pull from there too.</p>
<p>UPDATE: This now is pulled in the <a href="https://devtoolbox.jace.pro/#variable-parser">Dev Toolbox Scoped app</a></p>
<!--EndFragment-->Password variable for service catalog2019-01-17T22:40:36Zhttps://jace.pro/post/2019-01-17-catalog-password-variable/Jace Benson<!--StartFragment-->
<p>I was asked to add a password field on a catalog item and I was appalled<br />
to find this isn't an out of box variable type. I went ahead and made a<br />
widget to make one that is secure but I feel we shouldn't have to.</p>
<p>So in my case I wanted the following;</p>
<ul>
<li>2 Masked Password fields that verified they matched and that they<br />
match a regex expression.</li>
<li>Store the password as a <a href="https://sn.jace.pro/glideencrypter/">encrypted</a> value so I can<br />
use is later but keep it <em>secure</em>.</li>
</ul>
<p>Here's the end result;</p>
<!--EndFragment-->
<p><img src="https://jace.pro/static/img/2019-01-17-catalog-password-variable.gif" alt="" /></p>
<!--StartFragment-->
<p>To make this follow these steps;</p>
<ol>
<li>Make a variable type of string, variable name of <code>password</code>.</li>
<li>Make a variable type of macro with label, variable name of<br />
<code>password_macro</code>.</li>
<li>Make a Service Portal Widget with these values;</li>
</ol>
<h2>HTML Template</h2>
<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation attr-equals">=</span> <span class="token punctuation">"</span>form-group ng-scope ng-isolate-scope<span class="token punctuation">"</span></span> <span class="token special-attr"><span class="token attr-name">style</span> <span class="token attr-value"><span class="token punctuation attr-equals">=</span> <span class="token punctuation">"</span><span class="token punctuation">"</span></span></span> <span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>label</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>field-label ng-binding ng-scope<span class="token punctuation">"</span></span> <span class="token attr-name">title</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token punctuation">"</span></span> <span class="token attr-name">tooltip-right</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>true<span class="token punctuation">"</span></span> <span class="token attr-name">data-original-title</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>span</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>field-decorations<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>span</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>fa fa-asterisk mandatory ng-hide<span class="token punctuation">"</span></span> <br /> <span class="token attr-name">title</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Mandatory<span class="token punctuation">"</span></span> <br /> <span class="token special-attr"><span class="token attr-name">style</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token value css language-css"><span class="token property">padding-right</span><span class="token punctuation">:</span> 0.25em<span class="token punctuation">;</span></span><span class="token punctuation">"</span></span></span> <br /> <span class="token attr-name">aria-label</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Mandatory <span class="token punctuation">"</span></span> <br /> <span class="token attr-name">aria-hidden</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>true<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>span</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>span</span><span class="token punctuation">></span></span><br /> Enter Password<br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>span</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>sr-only ng-binding<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>span</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>label</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>span</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>type-string field-actual<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>span</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>ng-scope<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>input</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>pwd1<span class="token punctuation">"</span></span> <br /> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>password<span class="token punctuation">"</span></span><br /> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>form-control ng-pristine ng-untouched ng-valid ng-scope ng-valid-maxlength ng-empty<span class="token punctuation">"</span></span> <br /> <span class="token attr-name">maxlength</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token punctuation">"</span></span> <br /> <span class="token attr-name">ng-model</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>c.data.passwordInput1<span class="token punctuation">"</span></span> <br /> <span class="token attr-name">ng-change</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>setPassword('password')<span class="token punctuation">"</span></span><br /> <span class="token punctuation">/></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>span</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>span</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>label</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>field-label ng-binding ng-scope<span class="token punctuation">"</span></span> <span class="token attr-name">title</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token punctuation">"</span></span> <span class="token attr-name">tooltip-right</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>true<span class="token punctuation">"</span></span> <span class="token attr-name">data-original-title</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>span</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>field-decorations<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>span</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>fa fa-asterisk mandatory ng-hide<span class="token punctuation">"</span></span> <br /> <span class="token attr-name">title</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Mandatory<span class="token punctuation">"</span></span> <br /> <span class="token special-attr"><span class="token attr-name">style</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token value css language-css"><span class="token property">padding-right</span><span class="token punctuation">:</span> 0.25em<span class="token punctuation">;</span></span><span class="token punctuation">"</span></span></span> <br /> <span class="token attr-name">aria-label</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Mandatory <span class="token punctuation">"</span></span> <br /> <span class="token attr-name">aria-hidden</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>true<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>span</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>span</span><span class="token punctuation">></span></span><br /> Repeat Password<br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>span</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>sr-only ng-binding<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>span</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>label</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>span</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>type-string field-actual<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>span</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>ng-scope<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>input</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>pwd2<span class="token punctuation">"</span></span> <br /> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>password<span class="token punctuation">"</span></span><br /> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>form-control ng-pristine ng-untouched ng-valid ng-scope ng-valid-maxlength ng-empty<span class="token punctuation">"</span></span> <br /> <span class="token attr-name">maxlength</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token punctuation">"</span></span> <br /> <span class="token attr-name">ng-model</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>c.data.passwordInput2<span class="token punctuation">"</span></span> <br /> <span class="token attr-name">ng-change</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>setPassword('password')<span class="token punctuation">"</span></span><br /> <span class="token punctuation">/></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>span</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>span</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">ng-show</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>field.messages<span class="token punctuation">"</span></span> <span class="token attr-name">aria-hidden</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>true<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>ng-hide<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span></code></pre>
<!--EndFragment-->
<h2>Client Script</h2>
<!--StartFragment-->
<pre class="language-javascript"><code class="language-javascript"><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">$scope</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token comment">//This is the controller, we've included $scope in the function above because it's easy to work with</span><br /> <span class="token keyword">var</span> c <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">;</span><br /> c<span class="token punctuation">.</span>data<span class="token punctuation">.</span>passwordInput <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">;</span><br /> <span class="token comment">//Simplify accessing g_form within the client script by setting it as a variable named g_form</span><br /> <span class="token keyword">var</span> g_form <span class="token operator">=</span> $scope<span class="token punctuation">.</span>page<span class="token punctuation">.</span>g_form<span class="token punctuation">;</span><br /> $scope<span class="token punctuation">.</span>g_form <span class="token operator">=</span> $scope<span class="token punctuation">.</span>page<span class="token punctuation">.</span>g_form<span class="token punctuation">;</span><br /> $scope<span class="token punctuation">.</span><span class="token function-variable function">setPassword</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">varname</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token comment">/*<br /> console.log(JSON.stringify({<br /> "c.data.passwordInput1": c.data.passwordInput1,<br /> "c.data.passwordInput2": c.data.passwordInput2<br /> },' '));<br /> */</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>c<span class="token punctuation">.</span>data<span class="token punctuation">.</span>passwordInput1 <span class="token operator">==</span> c<span class="token punctuation">.</span>data<span class="token punctuation">.</span>passwordInput2<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>c<span class="token punctuation">.</span>data<span class="token punctuation">.</span>passwordInput1<span class="token punctuation">.</span><span class="token function">match</span><span class="token punctuation">(</span><span class="token regex"><span class="token regex-delimiter">/</span><span class="token regex-source language-regex">^([a-zA-Z0-9]{16,})$</span><span class="token regex-delimiter">/</span><span class="token regex-flags">g</span></span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> c<span class="token punctuation">.</span>server<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token punctuation">{</span><br /> <span class="token literal-property property">passwordInput</span><span class="token operator">:</span> c<span class="token punctuation">.</span>data<span class="token punctuation">.</span>passwordInput1<br /> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">r</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> g_form<span class="token punctuation">.</span><span class="token function">setValue</span><span class="token punctuation">(</span>varname<span class="token punctuation">,</span> r<span class="token punctuation">.</span>data<span class="token punctuation">.</span>passwordEncrypted<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> g_form<span class="token punctuation">.</span><span class="token function">hideFieldMsg</span><span class="token punctuation">(</span><span class="token string">"password_macro"</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//hides all messages</span><br /> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> errorShort <span class="token operator">=</span> <span class="token string">"Passwords must be at least 16 characters and only allow a alphanumeric value."</span><span class="token punctuation">;</span><br /> g_form<span class="token punctuation">.</span><span class="token function">hideFieldMsg</span><span class="token punctuation">(</span><span class="token string">"password_macro"</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//hides all messages</span><br /> g_form<span class="token punctuation">.</span><span class="token function">showFieldMsg</span><span class="token punctuation">(</span><span class="token string">"password_macro"</span><span class="token punctuation">,</span> errorShort<span class="token punctuation">,</span> <span class="token string">"error"</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> errorMatch <span class="token operator">=</span> <span class="token string">"Passwords must be at least 16 characters and only allow a alphanumeric value."</span><span class="token punctuation">;</span><br /> g_form<span class="token punctuation">.</span><span class="token function">clearValue</span><span class="token punctuation">(</span>varname<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> g_form<span class="token punctuation">.</span><span class="token function">hideFieldMsg</span><span class="token punctuation">(</span><span class="token string">"password_macro"</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//hides all messages</span><br /> g_form<span class="token punctuation">.</span><span class="token function">showFieldMsg</span><span class="token punctuation">(</span><span class="token string">"password_macro"</span><span class="token punctuation">,</span> errorMatch<span class="token punctuation">,</span> <span class="token string">"error"</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span></code></pre>
<!--EndFragment-->
<h2>Server Script</h2>
<!--StartFragment-->
<pre class="language-javascript"><code class="language-javascript"><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">if</span><span class="token punctuation">(</span>input <span class="token operator">&&</span> input<span class="token punctuation">.</span>passwordInput<span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">var</span> encrypter <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideEncrypter</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> data<span class="token punctuation">.</span>passwordEncrypted <span class="token operator">=</span> encrypter<span class="token punctuation">.</span><span class="token function">encrypt</span><span class="token punctuation">(</span>input<span class="token punctuation">.</span>passwordInput<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<!--EndFragment-->Approvals for Knowledge and how they dont work2019-01-12T22:35:53Zhttps://jace.pro/post/2019-01-12-kb-approvals/Jace Benson<!--StartFragment-->
<p>A few days ago Derek was asking about approvals, specifically approvals for Knowledge articles and why they don't work out of the box. It's weird and here I'll go through it. So it seems ServiceNow started to make this work out of the box but just never finished it. Here's the list of things they did;</p>
<ul>
<li>
<p>Workflow <code>Knowledge - Approval Publish</code> creates an approval</p>
</li>
<li>
<p>A business rule called <code>Approval Events (Non-Task)</code> triggers an event for the state based on the table. So searching for <code>kb_knowledge.approval.inserted</code> comes up empty. Here's the code;</p>
<pre class="language-javascript"><code class="language-javascript"><span class="token function">sendEventsNonTask</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><br /><span class="token keyword">function</span> <span class="token function">sendEventsNonTask</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>current<span class="token punctuation">.</span>state<span class="token punctuation">.</span><span class="token function">changes</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <br /> <span class="token keyword">return</span><span class="token punctuation">;</span><br /><br /> <span class="token keyword">var</span> event <span class="token operator">=</span> current<span class="token punctuation">.</span>source_table<span class="token punctuation">;</span><br /> <span class="token keyword">switch</span> <span class="token punctuation">(</span>current<span class="token punctuation">.</span>state <span class="token operator">+</span> <span class="token string">""</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <br /> <span class="token keyword">case</span> <span class="token string">'cancelled'</span><span class="token operator">:</span><br /> event <span class="token operator">+=</span> <span class="token string">".approval.cancelled"</span><span class="token punctuation">;</span><br /> gs<span class="token punctuation">.</span><span class="token function">eventQueue</span><span class="token punctuation">(</span>event<span class="token punctuation">,</span> current<span class="token punctuation">,</span> gs<span class="token punctuation">.</span><span class="token function">getUserID</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> gs<span class="token punctuation">.</span><span class="token function">getUserName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">break</span><span class="token punctuation">;</span><br /> <span class="token keyword">case</span> <span class="token string">'requested'</span><span class="token operator">:</span><br /> event <span class="token operator">+=</span> <span class="token string">".approval.inserted"</span><span class="token punctuation">;</span><br /> gs<span class="token punctuation">.</span><span class="token function">eventQueue</span><span class="token punctuation">(</span>event<span class="token punctuation">,</span> current<span class="token punctuation">,</span> gs<span class="token punctuation">.</span><span class="token function">getUserID</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> gs<span class="token punctuation">.</span><span class="token function">getUserName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token function">updateRecord</span><span class="token punctuation">(</span>current<span class="token punctuation">,</span> current<span class="token punctuation">.</span>approver<span class="token punctuation">.</span><span class="token function">getDisplayValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">" requested to approve task"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">break</span><span class="token punctuation">;</span><br /> <span class="token keyword">case</span> <span class="token string">'rejected'</span><span class="token operator">:</span><br /> event <span class="token operator">+=</span> <span class="token string">".approval.rejected"</span><span class="token punctuation">;</span><br /> gs<span class="token punctuation">.</span><span class="token function">eventQueue</span><span class="token punctuation">(</span>event<span class="token punctuation">,</span> current<span class="token punctuation">,</span> current<span class="token punctuation">.</span>state<span class="token punctuation">,</span> previous<span class="token punctuation">.</span>state<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token function">updateRecord</span><span class="token punctuation">(</span>current<span class="token punctuation">,</span> current<span class="token punctuation">.</span>approver<span class="token punctuation">.</span><span class="token function">getDisplayValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">" rejected the task."</span><span class="token punctuation">,</span> <br /> current<span class="token punctuation">.</span>comments<span class="token punctuation">.</span><span class="token function">getJournalEntry</span><span class="token punctuation">(</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token function">notifyMyFriends</span><span class="token punctuation">(</span>current<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">break</span><span class="token punctuation">;</span><br /> <span class="token keyword">case</span> <span class="token string">'approved'</span><span class="token operator">:</span><br /> <span class="token function">updateRecord</span><span class="token punctuation">(</span>current<span class="token punctuation">,</span> current<span class="token punctuation">.</span>approver<span class="token punctuation">.</span><span class="token function">getDisplayValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">" approved the task."</span><span class="token punctuation">,</span> <br /> current<span class="token punctuation">.</span>comments<span class="token punctuation">.</span><span class="token function">getJournalEntry</span><span class="token punctuation">(</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">break</span><span class="token punctuation">;</span><br /> <span class="token keyword">default</span><span class="token operator">:</span> <br /> <span class="token punctuation">}</span> <br /> <span class="token punctuation">}</span><br /> <span class="token comment">/*Omitted remaining code...*/</span></code></pre>
</li>
<li>
<p>No notification is built but you could just create a new one based on the template called <code>change.itil.approve.role</code>\</p>
<p>Subject: ${sysapproval.sys_class_name} ${sysapproval} Approval Request\</p>
<!--StartFragment-->
<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span>Short Description: ${sysapproval.short_description}<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span>Priority: ${sysapproval.priority}<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span>Category: ${sysapproval.category}<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span><span class="token entity named-entity" title=" ">&nbsp;</span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>hr</span> <span class="token punctuation">/></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span>${mail_script:change_request_summary}<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span><span class="token entity named-entity" title=" ">&nbsp;</span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span>Comments:<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span>${sysapproval.description}<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>hr</span> <span class="token punctuation">/></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span>${mailto:mailto.approval}<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>hr</span> <span class="token punctuation">/></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span>${mailto:mailto.rejection}<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>hr</span> <span class="token punctuation">/></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span>Approval Activity:<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span>${mail_script:approval_activity}<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>hr</span> <span class="token punctuation">/></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span>Click here to view Approval Request: ${URI}<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span>Click here to view ${sysapproval.sys_class_name}: ${sysapproval.URI}<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span></code></pre>
</li>
<li>
<p>I'd probably start with something like this\</p>
<!--StartFragment-->
<p>Subject: ${document_id.short_description} ${document_id.number} Approval Request</p>
<!--EndFragment-->\
<!--StartFragment-->
<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span>Short Description: ${document_id.short_description}<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span><span class="token entity named-entity" title=" ">&nbsp;</span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>hr</span> <span class="token punctuation">/></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span>${mailto:mailto.approval}<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>hr</span> <span class="token punctuation">/></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span>${mailto:mailto.rejection}<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>hr</span> <span class="token punctuation">/></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span>Click here to view Approval Request: ${URI}<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span>Click here to view ${document_id.sys_class_name}: ${document_id.URI}<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span></code></pre>
<!--EndFragment-->
</li>
</ul>
<!--StartFragment-->
<p>They made it really close. Just never finished it.</p>
<p>In any case, thanks Derek for the idea for the post.</p>
<!--EndFragment-->ServiceNow Order of operations2019-01-04T22:03:49Zhttps://jace.pro/post/2019-01-04-order-of-operations/Jace Benson<!--StartFragment-->
<p>Understanding <strong>when</strong> something runs is critical when building these systems. ServiceNow has a very simple and great image that captures that for <a href="https://docs.servicenow.com/bundle/geneva-servicenow-platform/page/script/business_rules/reference/r_HowBusinessRulesWork.html">business rules</a>.<br />
However that doesn't help with other scripts in the system. Bas @ Logicalis wrote something up about this on<br />
<a href="http://www.snc-blog.com/2017/02/02/script-execution-flow/">snc-blog</a> but I thought I could improve on it. Also messing with things is a way I<br />
remember better.</p>
<p>I try to keep all the common diagrams I use on <a href="https://workflow.jace.pro/?flow=BusinessRuleOrderSequence#">https://workflow.jace.pro/</a> but I realize I don't really share when that changes.</p>
<p>Here I've been messing with this and I thought now is a great time to share this diagram I keep out there.</p>
<!--EndFragment-->
<p><a href="https://workflow.jace.pro/#/edit/eyJjb2RlIjoic2VxdWVuY2VEaWFncmFtXG4gIHBhcnRpY2lwYW50IHV4dXggYXMgVXNlciBJbnRlcmFjdGlvbnNcbiAgcGFydGljaXBhbnQgY3N1cCBhcyBVSSBQb2xpY3lcbiAgcGFydGljaXBhbnQgY3NjcyBhcyBDbGllbnQgU2NyaXB0XG4gIHBhcnRpY2lwYW50IHNzc3MgYXMgU2VydmVyIFNpZGVcbiAgcGFydGljaXBhbnQgZWVlZSBhcyBFbmdpbmVzXG4gIHBhcnRpY2lwYW50IGRiZGIgYXMgRGF0YWJhc2VcbiAgdXh1eC0-PnNzc3M6IEZvcm0gUmVxdWVzdFxuICBzc3NzLT4-ZGJkYjogUXVlcnkgQnVzaW5lc3MgUnVsZXNcbiAgZGJkYi0-PnNzc3M6IERpc3BsYXkgQnVzaW5lc3MgUnVsZXNcbiAgc3Nzcy0-PmNzY3M6IE9uTG9hZCBDbGllbnQgU2NyaXB0c1xuICBjc2NzLT4-Y3N1cDogT25Mb2FkIFVJIFBvbGljaWVzXG4gIGNzdXAtPj51eHV4OiBGb3JtIGxvYWRlZFxuICBsb29wIEV2ZXJ5IENoYW5nZVxuICAgICAgdXh1eC0-PnNzc3M6IHJlZl9xdWFsX2VsZW1lbnQgZmllbGQgY2hhbmdlc1xuICAgICAgc3Nzcy0-PmNzY3M6IE9uQ2hhbmdlIENsaWVudCBTY3JpcHRzXG4gICAgICBjc2NzLT4-Y3N1cDogT25DaGFuZ2UgVUkgUG9saWNpZXNcbiAgICAgIGNzdXAtPj51eHV4OiBGb3JtIFVwZGF0ZWRcbiAgZW5kXG4gIHV4dXgtPj5jc3VwOiBGb3JtIFN1Ym1pdChjbGllbnQpXG4gIGNzdXAtPj5jc2NzOiBPblN1Ym1pdCBDbGllbnQgU2NyaXB0c1xuICBjc2NzLT4-c3NzczogRm9ybSBTdWJtaXQoc2VydmVyKVxuICBzc3NzLT4-ZWVlZTogQmVmb3JlIEJ1c2luZXNzIFJ1bGVzIDwxMDAwXG4gIGVlZWUtLT5zc3NzOiBBcHByb3ZhbCBlbmdpbmVcbiAgZWVlZS0tPnNzc3M6IEFzc2lnbm1lbnQgcnVsZXMgZW5naW5lXG4gIGVlZWUtLT5zc3NzOiBEYXRhIHBvbGljeSBlbmdpbmVcbiAgZWVlZS0tPnNzc3M6IEVzY2FsYXRpb24gZW5naW5lXG4gIGVlZWUtLT5zc3NzOiBGaWVsZCBub3JtYWxpemF0aW9uIGVuZ2luZVxuICBlZWVlLS0-c3NzczogUm9sZSBlbmdpbmVcbiAgZWVlZS0tPnNzc3M6IEV4ZWN1dGlvbiBwbGFuIGVuZ2luZVxuICBlZWVlLS0-c3NzczogVXBkYXRlIHZlcnNpb24gZW5naW5lXG4gIGVlZWUtLT5zc3NzOiBXb3JrZmxvdyBlbmdpbmUgKGZvciBkZWZhdWx0IHdvcmtmbG93cylcbiAgZWVlZS0-PnNzc3M6IEJlZm9yZSBCdXNpbmVzcyBSdWxlcyA-PTEwMDBcbiAgc3Nzcy0-PmRiZGI6IERhdGFiYXNlIFVwZGF0ZVxuICBkYmRiLT4-c3NzczogQWZ0ZXIgQnVzaW5lc3MgUnVsZXMgPDEwMDBcbiAgc3Nzcy0tPmVlZWU6IExhYmVsIGVuZ2luZVxuICBzc3NzLS0-ZWVlZTogTGlzdGVuZXIgZW5naW5lXG4gIHNzc3MtLT5lZWVlOiBUYWJsZSBub3RpZmljYXRpb25zIGVuZ2luZVxuICBOb3RlIHJpZ2h0IG9mIGVlZWU6IFRoaXMgY3JlYXRlcyBzeXNldmVudHMgdGhhdCBwcm9jZXNzIGxhdGVyXG4gIHNzc3MtLT5lZWVlOiBSb2xlIGVuZ2luZVxuICBzc3NzLS0-ZWVlZTogVGV4dCBpbmRleGluZyBlbmdpbmVcbiAgc3Nzcy0tPmVlZWU6IFVwZGF0ZSBzeW5jIGVuZ2luZVxuICBzc3NzLS0-ZWVlZTogRGF0YSBsb29rdXAgZW5naW5lIGluc2VydHMgb3IgdXBkYXRlc1xuICBzc3NzLS0-ZWVlZTogV29ya2Zsb3cgZW5naW5lIChmb3IgZGVmZXJyZWQgd29ya2Zsb3dzKVxuICBzc3NzLS0-ZWVlZTogVHJpZ2dlciBlbmdpbmUgKGZvciBhbGwgRmxvdyBEZXNpZ25lciBmbG93cylcbiAgZWVlZS0-PnNzc3M6IEFmdGVyIEJ1c2luZXNzIFJ1bGVzID49MTAwMFxuICBzc3NzLT4-ZGJkYjogUXVlcnkgQnVzaW5lc3MgUnVsZXNcbiAgc3Nzcy0tPmRiZGI6IEFzeW5jIEJ1c2luZXNzIFJ1bGVzXG4gIE5vdGUgcmlnaHQgb2YgZWVlZTogVGhpcyBjcmVhdGVzIHN5c190cmlnZ2VycyB0aGF0IHByb2Nlc3MgbGF0ZXJcbiAgZGJkYi0-PnNzc3M6IERpc3BsYXkgQnVzaW5lc3MgUnVsZXNcbiAgc3Nzcy0-PnV4dXg6IFJldHVybiBVSVxuICBcbiAgTm90ZSBvdmVyIHV4dXgsZGJkYjogVGhhbmtzIHRvIGh0dHA6Ly93d3cuc25jLWJsb2cuY29tLzIwMTcvMDIvMDIvc2NyaXB0LWV4ZWN1dGlvbi1mbG93LyIsIm1lcm1haWQiOnsidGhlbWUiOiJkZWZhdWx0In0sInVwZGF0ZUVkaXRvciI6ZmFsc2V9"><img src="https://mermaid.ink/img/eyJjb2RlIjoic2VxdWVuY2VEaWFncmFtXG4gIHBhcnRpY2lwYW50IHV4dXggYXMgVXNlciBJbnRlcmFjdGlvbnNcbiAgcGFydGljaXBhbnQgY3N1cCBhcyBVSSBQb2xpY3lcbiAgcGFydGljaXBhbnQgY3NjcyBhcyBDbGllbnQgU2NyaXB0XG4gIHBhcnRpY2lwYW50IHNzc3MgYXMgU2VydmVyIFNpZGVcbiAgcGFydGljaXBhbnQgZWVlZSBhcyBFbmdpbmVzXG4gIHBhcnRpY2lwYW50IGRiZGIgYXMgRGF0YWJhc2VcbiAgdXh1eC0-PnNzc3M6IEZvcm0gUmVxdWVzdFxuICBzc3NzLT4-ZGJkYjogUXVlcnkgQnVzaW5lc3MgUnVsZXNcbiAgZGJkYi0-PnNzc3M6IERpc3BsYXkgQnVzaW5lc3MgUnVsZXNcbiAgc3Nzcy0-PmNzY3M6IE9uTG9hZCBDbGllbnQgU2NyaXB0c1xuICBjc2NzLT4-Y3N1cDogT25Mb2FkIFVJIFBvbGljaWVzXG4gIGNzdXAtPj51eHV4OiBGb3JtIGxvYWRlZFxuICBsb29wIEV2ZXJ5IENoYW5nZVxuICAgICAgdXh1eC0-PnNzc3M6IHJlZl9xdWFsX2VsZW1lbnQgZmllbGQgY2hhbmdlc1xuICAgICAgc3Nzcy0-PmNzY3M6IE9uQ2hhbmdlIENsaWVudCBTY3JpcHRzXG4gICAgICBjc2NzLT4-Y3N1cDogT25DaGFuZ2UgVUkgUG9saWNpZXNcbiAgICAgIGNzdXAtPj51eHV4OiBGb3JtIFVwZGF0ZWRcbiAgZW5kXG4gIHV4dXgtPj5jc3VwOiBGb3JtIFN1Ym1pdChjbGllbnQpXG4gIGNzdXAtPj5jc2NzOiBPblN1Ym1pdCBDbGllbnQgU2NyaXB0c1xuICBjc2NzLT4-c3NzczogRm9ybSBTdWJtaXQoc2VydmVyKVxuICBzc3NzLT4-ZWVlZTogQmVmb3JlIEJ1c2luZXNzIFJ1bGVzIDwxMDAwXG4gIGVlZWUtLT5zc3NzOiBBcHByb3ZhbCBlbmdpbmVcbiAgZWVlZS0tPnNzc3M6IEFzc2lnbm1lbnQgcnVsZXMgZW5naW5lXG4gIGVlZWUtLT5zc3NzOiBEYXRhIHBvbGljeSBlbmdpbmVcbiAgZWVlZS0tPnNzc3M6IEVzY2FsYXRpb24gZW5naW5lXG4gIGVlZWUtLT5zc3NzOiBGaWVsZCBub3JtYWxpemF0aW9uIGVuZ2luZVxuICBlZWVlLS0-c3NzczogUm9sZSBlbmdpbmVcbiAgZWVlZS0tPnNzc3M6IEV4ZWN1dGlvbiBwbGFuIGVuZ2luZVxuICBlZWVlLS0-c3NzczogVXBkYXRlIHZlcnNpb24gZW5naW5lXG4gIGVlZWUtLT5zc3NzOiBXb3JrZmxvdyBlbmdpbmUgKGZvciBkZWZhdWx0IHdvcmtmbG93cylcbiAgZWVlZS0-PnNzc3M6IEJlZm9yZSBCdXNpbmVzcyBSdWxlcyA-PTEwMDBcbiAgc3Nzcy0-PmRiZGI6IERhdGFiYXNlIFVwZGF0ZVxuICBkYmRiLT4-c3NzczogQWZ0ZXIgQnVzaW5lc3MgUnVsZXMgPDEwMDBcbiAgc3Nzcy0tPmVlZWU6IExhYmVsIGVuZ2luZVxuICBzc3NzLS0-ZWVlZTogTGlzdGVuZXIgZW5naW5lXG4gIHNzc3MtLT5lZWVlOiBUYWJsZSBub3RpZmljYXRpb25zIGVuZ2luZVxuICBOb3RlIHJpZ2h0IG9mIGVlZWU6IFRoaXMgY3JlYXRlcyBzeXNldmVudHMgdGhhdCBwcm9jZXNzIGxhdGVyXG4gIHNzc3MtLT5lZWVlOiBSb2xlIGVuZ2luZVxuICBzc3NzLS0-ZWVlZTogVGV4dCBpbmRleGluZyBlbmdpbmVcbiAgc3Nzcy0tPmVlZWU6IFVwZGF0ZSBzeW5jIGVuZ2luZVxuICBzc3NzLS0-ZWVlZTogRGF0YSBsb29rdXAgZW5naW5lIGluc2VydHMgb3IgdXBkYXRlc1xuICBzc3NzLS0-ZWVlZTogV29ya2Zsb3cgZW5naW5lIChmb3IgZGVmZXJyZWQgd29ya2Zsb3dzKVxuICBzc3NzLS0-ZWVlZTogVHJpZ2dlciBlbmdpbmUgKGZvciBhbGwgRmxvdyBEZXNpZ25lciBmbG93cylcbiAgZWVlZS0-PnNzc3M6IEFmdGVyIEJ1c2luZXNzIFJ1bGVzID49MTAwMFxuICBzc3NzLT4-ZGJkYjogUXVlcnkgQnVzaW5lc3MgUnVsZXNcbiAgc3Nzcy0tPmRiZGI6IEFzeW5jIEJ1c2luZXNzIFJ1bGVzXG4gIE5vdGUgcmlnaHQgb2YgZWVlZTogVGhpcyBjcmVhdGVzIHN5c190cmlnZ2VycyB0aGF0IHByb2Nlc3MgbGF0ZXJcbiAgZGJkYi0-PnNzc3M6IERpc3BsYXkgQnVzaW5lc3MgUnVsZXNcbiAgc3Nzcy0-PnV4dXg6IFJldHVybiBVSVxuICBcbiAgTm90ZSBvdmVyIHV4dXgsZGJkYjogVGhhbmtzIHRvIGh0dHA6Ly93d3cuc25jLWJsb2cuY29tLzIwMTcvMDIvMDIvc2NyaXB0LWV4ZWN1dGlvbi1mbG93LyIsIm1lcm1haWQiOnsidGhlbWUiOiJkZWZhdWx0In0sInVwZGF0ZUVkaXRvciI6ZmFsc2V9" alt="" /></a></p>
Knowledge 19: Proposals to present2018-12-02T21:59:16Zhttps://jace.pro/post/2018-12-02-k19-proposals/Jace Benson<!--StartFragment-->
<p>Below are my K19 proposal's to speak. I'd like to develop these points into posts at some point so I have an embedded survey below the details of these talks</p>
<p><a href="https://www.surveymonkey.com/results/SM-MR75LCJ9V/">Results</a></p>
<h1>Integrate repeatably faster by following these steps</h1>
<h2>Session Abstract</h2>
<h3>Introduction and Problem Statement</h3>
<p>My company is a company like others, with data in a lot of places. In this session, we'll look at how having a consistent integration policy can help make development of those integrations easier.</p>
<h3>Approach and Results</h3>
<p>In this session, I will share how we've;</p>
<ul>
<li>Improved device tracking (azure intune) for compliance, and security reasons.</li>
<li>SolarWinds import to improve discovery</li>
<li>CrashPlan import to drive compliance of legal holds and status in a central system</li>
</ul>
<h3>Attendees will learn how to</h3>
<ul>
<li>Make a import set from a script</li>
<li>Make import set rows from a script</li>
<li>Run transform maps against a import set from a script</li>
</ul>
<h2>What is the objective of your session?</h2>
<p>To show, how and why using some consistent practices around integrations can save you a lot of time and trouble.</p>
<h2>What are the three key takeaways you will want your audience to leave with?</h2>
<ol>
<li>You can follow a common import pattern to drive most integrations to simplify development and further customizations</li>
<li>Rest API integrations that ServiceNow has to ask for data from can follow this pattern</li>
<li>After you do it once or twice you can do it for other integrations</li>
</ol>
<h1>Open Sourcing ATF tests with Github and hacktoberfest</h1>
<h2>Session Abstract</h2>
<h3>Introduction and Problem Statement</h3>
<p>My company is a company like others, we want to upgrade without delay but due to testing are slowed sometimes. In this session, we'll talk about how I started a repo to open source OOB Test Suites to give us a baseline for future upgrades.</p>
<h3>Approach and Results</h3>
<p>In this session, I will share how I started to maintain a repo for test suites in ServiceNow. I found I was participating in my second #hacktoberfest and a thought occurred. How can I get other people to build tests so I don't have to? And it's simple. Make a repo, share it and spread the word.</p>
<h2>Attendees will learn how to</h2>
<ul>
<li>Contribute to an open source project for scoped applications</li>
<li>Avoid nuances for ServiceNow's repos branches</li>
<li>Accept and Reject Pull Requests without breaking and losing data.</li>
<li>Make a project site for the project with Netlify</li>
</ul>
<h2>What is the objective of your session?</h2>
<p>To show, how and why open sourcing some scoped applications can save you time.</p>
<h2>What are the three key takeaways you will want your audience to leave with?</h2>
<ol>
<li>You can open source scoped applications to share with the community work managed on git</li>
<li>Doing so can get other to contribute to help drive the progression of the project</li>
<li>It can help everyone, so, try to share in the future.</li>
</ol>
<h1>Learn by supporting or starting your own local Developer Meetup</h1>
<h2>Session Abstract</h2>
<h3>Introduction and Problem Statement</h3>
<p>Two years ago I started a Developer Meetup for ServiceNow talent to do ad-hoc labs and have happy hours. I didn't want what happened to the SNUG's happening to this event so I volunteered.</p>
<h3>Approach and Results</h3>
<p>Running the event has been a ride and I would do it all over again. In this session I'll go over what it takes to run these events.</p>
<h2>Attendees will learn how to</h2>
<ul>
<li>Identify how often and about what the meetup should meet about.</li>
<li>Finding content to use for labs and / or for happy hour discussions.</li>
<li>Finding hosting locations in your area.</li>
</ul>
<h2>What is the objective of your session?</h2>
<p>To share what it takes to run developer meetups to give attendees information to form their own OR assist their local meetup.</p>
<h2>What are the three key takeaways you will want your audience to leave with?</h2>
<ol>
<li>You don't have to host or run the event to help. There's lot's of opportunity to help out.</li>
<li>Attend it, it's smaller and less formal then your ServiceNow user groups.</li>
<li>Provide feedback, it's always useful.</li>
</ol>
<!--EndFragment-->GlideScriptEditorManager a class to manage APIs2018-11-21T21:57:30Zhttps://jace.pro/post/2018-11-21-api-of-apis/Jace Benson<!--StartFragment-->
<p>This is a way to get the apis listed in the text editors.</p>
<p>The <strong>GlideScriptEditorManager</strong> <strong>getApis</strong> method returns a JSON<br />
string of context-specific APIs. The JSON returned is invalid and<br />
incorrectly escapes <code>"'"</code> as <code>"\'"</code>. The script below fixes this and<br />
outputs formatted JSON.</p>
<!--EndFragment-->
<!--StartFragment-->
<pre class="language-javascript"><code class="language-javascript"><span class="token keyword">var</span> tables <span class="token operator">=</span> <span class="token punctuation">[</span><br /> <span class="token string">"catalog_client_script"</span><span class="token punctuation">,</span><br /> <span class="token string">"sys_script_email"</span><span class="token punctuation">,</span><br /> <span class="token string">"sys_script_include"</span><br /><span class="token punctuation">]</span><span class="token punctuation">;</span><br /><br />tables<span class="token punctuation">.</span><span class="token function">map</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">table</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">try</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> gsem <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideScriptEditorManager</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> gr <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span>table<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> gr<span class="token punctuation">.</span><span class="token function">newRecord</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><br /> <span class="token keyword">var</span> apis <span class="token operator">=</span> gsem<span class="token punctuation">.</span><span class="token function">getApis</span><span class="token punctuation">(</span>table<span class="token punctuation">,</span> <span class="token string">"script"</span><span class="token punctuation">,</span> gr<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token comment">// fix invalid JSON</span><br /> apis <span class="token operator">=</span> apis<span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span><span class="token string">"\\'"</span><span class="token punctuation">,</span> <span class="token string">"'"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> parsed <span class="token operator">=</span> <span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">parse</span><span class="token punctuation">(</span>apis<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> formatted <span class="token operator">=</span> <span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">stringify</span><span class="token punctuation">(</span>parsed<span class="token punctuation">,</span> <span class="token keyword">null</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><br /> gs<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span>table<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> gs<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span>formatted<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>e<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> gs<span class="token punctuation">.</span><span class="token function">error</span><span class="token punctuation">(</span><span class="token string">"ERROR: "</span> <span class="token operator">+</span> e<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p>I've used this code in the past to generate markdown tables for these APIs in the past;</p>
<pre class="language-javascript"><code class="language-javascript"><span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">var</span> thing <span class="token keyword">in</span> api<span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token function">getThings</span><span class="token punctuation">(</span>api<span class="token punctuation">[</span>thing<span class="token punctuation">]</span><span class="token punctuation">)</span><br /><span class="token punctuation">}</span><br /><br /><span class="token keyword">function</span> <span class="token function">getThings</span><span class="token punctuation">(</span><span class="token parameter">obj</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token comment">//console.log(JSON.stringify(obj));</span><br /> <span class="token keyword">var</span> output <span class="token operator">=</span> <span class="token punctuation">[</span><br /><span class="token string">'---'</span><span class="token punctuation">,</span><br /><span class="token string">'date: 2018-11-21'</span><span class="token punctuation">,</span><br /><span class="token string">''</span><span class="token punctuation">,</span><br /><span class="token string">'category: \'\''</span><span class="token punctuation">,</span><br /><span class="token string">'layout: page'</span><span class="token punctuation">,</span><br /><span class="token string">''</span><span class="token punctuation">,</span><br /><span class="token string">'aliases:'</span><span class="token punctuation">,</span><br /><span class="token string">' - "/'</span> <span class="token operator">+</span> thing<span class="token punctuation">.</span><span class="token function">toLowerCase</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">'/"'</span><span class="token punctuation">,</span><br /><span class="token string">'title: '</span> <span class="token operator">+</span> thing<span class="token punctuation">,</span><br /><span class="token string">'---'</span><span class="token punctuation">,</span><br /> <span class="token string">'# '</span> <span class="token operator">+</span> thing<span class="token punctuation">,</span><br /> <span class="token string">''</span><br /> <span class="token punctuation">]</span><span class="token punctuation">;</span><br /> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">var</span> prop <span class="token keyword">in</span> obj<span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">if</span><span class="token punctuation">(</span>prop <span class="token operator">==</span> <span class="token string">'!doc'</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> output<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>obj<span class="token punctuation">[</span>prop<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><br /> output<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token string">'| Property/Method | Description |'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> output<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token string">'| --- | --- |'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">if</span><span class="token punctuation">(</span>prop <span class="token operator">!=</span> <span class="token string">'!doc'</span> <span class="token operator">&&</span> prop <span class="token operator">!=</span> <span class="token string">'!type'</span> <span class="token operator">&&</span> prop <span class="token operator">!=</span> <span class="token string">'prototype'</span> <span class="token operator">&&</span> prop <span class="token operator">!=</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> output<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token string">'| '</span> <span class="token operator">+</span> prop <span class="token operator">+</span> <span class="token string">' | '</span> <span class="token operator">+</span> obj<span class="token punctuation">[</span>prop<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'!doc'</span><span class="token punctuation">]</span> <span class="token operator">+</span> <span class="token string">' |'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">if</span><span class="token punctuation">(</span>prop <span class="token operator">==</span> <span class="token string">'prototype'</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">var</span> pprop <span class="token keyword">in</span> obj<span class="token punctuation">[</span>prop<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> output<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token string">'| '</span> <span class="token operator">+</span> pprop <span class="token operator">+</span> <span class="token string">' | '</span> <span class="token operator">+</span> obj<span class="token punctuation">[</span>prop<span class="token punctuation">]</span><span class="token punctuation">[</span>pprop<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'!doc'</span><span class="token punctuation">]</span> <span class="token operator">+</span> <span class="token string">' |'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>output<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token string">'\n'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span></code></pre>
<!--EndFragment-->UI16: angular.do - What is this?2018-11-05T21:54:12Zhttps://jace.pro/post/2018-11-05-angular-do/Jace Benson<p>The other day I got a report of slowness when using the "Post" button on incident</p>
<p><img src="https://jace.pro/static/img/2018-11-05-angular-do.png" alt="" /></p>
<!--StartFragment-->
<p>Turns out this little functionality uses some undocumented api to <code>/angular.do</code> . In this post I go over what I found out about it and how it's not measured like others.</p>
<p>First place I looked at this report is the transactions table <code>syslog_transactions_list.do</code>, transactions to this endpoint seem to <strong>not</strong> be tracked there or in the new Active Cluster Transactions <code>loading_transactions.do</code>. Which is unfortunate, because that at least shows where the delay is tracked weather it's on a server-side transaction or something on the client or something on the network.</p>
<p>I went ahead asking HI about it;</p>
<blockquote>
<p>I have a user who is reporting slowness when they use the Post button below comment/work notes.... I have looked everywhere I can think of to troubleshoot how long that transaction is taking but it's not logged anywhere. I looked at syslog transactions, and the node file browser but nothing seems to track the POSTs to /angular.do as that hits that endpoint.</p>
<p>How can I see server side these requests and what may be causing that delay?</p>
</blockquote>
<p>They pretty much told me the way to track this down is to look at the info in the console of the browser as the user.</p>
<p>All these transactions should be captured but it seems ServiceNow doesn't seem to share this opinion.</p>
<p>I've <a href="https://jace.pro/post/2018-11-05-angular-do/2018-11-05-angular-do.har">attached (raw JSONP) the HAR record</a> and found a tool online here on <a href="http://www.softwareishard.com/har/viewer/">https://softwareishard.com/har/viewer</a>.</p>
<p>It looks like it takes some URL parameters as well as some post body;</p>
<p>Endpoint;</p>
<p><code>/angular.do?sysparm_type=line_history&action=insert&table=incident&sys_id=aed745a0db1123008096a455ca961992&sysparm_source=from_form&sysparm_timestamp</code></p>
<p>Post Body;</p>
<!--EndFragment-->
<!--StartFragment-->
<pre class="language-json"><code class="language-json"><span class="token punctuation">{</span><br /> <span class="token property">"entries"</span><span class="token operator">:</span><span class="token punctuation">[</span><br /> <span class="token punctuation">{</span><br /> <span class="token property">"field"</span><span class="token operator">:</span><span class="token string">"comments"</span><span class="token punctuation">,</span><span class="token property">"text"</span><span class="token operator">:</span><span class="token string">"Fifth Comment"</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">]</span><br /><span class="token punctuation">}</span></code></pre>
<!--EndFragment-->
<p>Post Response;</p>
<!--StartFragment-->
<pre class="language-json"><code class="language-json"><span class="token punctuation">{</span><br /> <span class="token property">"display_value"</span><span class="token operator">:</span> <span class="token string">"Incident"</span><span class="token punctuation">,</span><br /> <span class="token property">"entries"</span><span class="token operator">:</span> <span class="token punctuation">[</span><br /> <span class="token punctuation">{</span><br /> <span class="token property">"display_value"</span><span class="token operator">:</span> <span class="token string">"INC0010010"</span><span class="token punctuation">,</span><br /> <span class="token property">"short_description"</span><span class="token operator">:</span> <span class="token string">"Tttt"</span><span class="token punctuation">,</span><br /> <span class="token property">"is_email"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span><br /> <span class="token property">"initials"</span><span class="token operator">:</span> <span class="token string">"JB"</span><span class="token punctuation">,</span><br /> <span class="token property">"label"</span><span class="token operator">:</span> <span class="token string">"Incident"</span><span class="token punctuation">,</span><br /> <span class="token property">"document_id"</span><span class="token operator">:</span> <span class="token string">"aed745a0db1123008096a455ca961992"</span><span class="token punctuation">,</span><br /> <span class="token property">"sys_created_on_adjusted"</span><span class="token operator">:</span> <span class="token string">"2018-11-05 06:04:38"</span><span class="token punctuation">,</span><br /> <span class="token property">"entries"</span><span class="token operator">:</span> <span class="token punctuation">{</span><br /> <span class="token property">"journal"</span><span class="token operator">:</span> <span class="token punctuation">[</span><br /> <span class="token punctuation">{</span><br /> <span class="token property">"sys_id"</span><span class="token operator">:</span> <span class="token string">"963491d6db2123008096a455ca961970"</span><span class="token punctuation">,</span><br /> <span class="token property">"sanitized_old_value"</span><span class="token operator">:</span> <span class="token string">""</span><span class="token punctuation">,</span><br /> <span class="token property">"field_label"</span><span class="token operator">:</span> <span class="token string">"Additional comments"</span><span class="token punctuation">,</span><br /> <span class="token property">"is_truncated"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span><br /> <span class="token property">"change_type"</span><span class="token operator">:</span> <span class="token string">"JOURNAL"</span><span class="token punctuation">,</span><br /> <span class="token property">"old_value"</span><span class="token operator">:</span> <span class="token string">""</span><span class="token punctuation">,</span><br /> <span class="token property">"field_type"</span><span class="token operator">:</span> <span class="token string">"journal_input"</span><span class="token punctuation">,</span><br /> <span class="token property">"new_value"</span><span class="token operator">:</span> <span class="token string">"Fifth Comment"</span><span class="token punctuation">,</span><br /> <span class="token property">"sanitized_new_value"</span><span class="token operator">:</span> <span class="token string">"Fifth Comment"</span><span class="token punctuation">,</span><br /> <span class="token property">"field_name"</span><span class="token operator">:</span> <span class="token string">"comments"</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">]</span><span class="token punctuation">,</span><br /> <span class="token property">"custom"</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">,</span><br /> <span class="token property">"changes"</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token property">"writable_journal_fields"</span><span class="token operator">:</span> <span class="token punctuation">[</span><br /> <span class="token string">"comments"</span><br /> <span class="token punctuation">]</span><span class="token punctuation">,</span><br /> <span class="token property">"user_id"</span><span class="token operator">:</span> <span class="token string">"cee12e57db1023008096a455ca961971"</span><span class="token punctuation">,</span><br /> <span class="token property">"sys_created_on"</span><span class="token operator">:</span> <span class="token string">"2018-11-05 14:04:38"</span><span class="token punctuation">,</span><br /> <span class="token property">"sys_timestamp"</span><span class="token operator">:</span> <span class="token number">1541426678000</span><span class="token punctuation">,</span><br /> <span class="token property">"sys_created_by"</span><span class="token operator">:</span> <span class="token string">"Jace Benson"</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token punctuation">{</span><br /> <span class="token property">"display_value"</span><span class="token operator">:</span> <span class="token string">"INC0010010"</span><span class="token punctuation">,</span><br /> <span class="token property">"short_description"</span><span class="token operator">:</span> <span class="token string">"Tttt"</span><span class="token punctuation">,</span><br /> <span class="token property">"is_email"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span><br /> <span class="token property">"initials"</span><span class="token operator">:</span> <span class="token string">"JB"</span><span class="token punctuation">,</span><br /> <span class="token property">"label"</span><span class="token operator">:</span> <span class="token string">"Incident"</span><span class="token punctuation">,</span><br /> <span class="token property">"document_id"</span><span class="token operator">:</span> <span class="token string">"aed745a0db1123008096a455ca961992"</span><span class="token punctuation">,</span><br /> <span class="token property">"sys_created_on_adjusted"</span><span class="token operator">:</span> <span class="token string">"2018-11-05 06:04:26"</span><span class="token punctuation">,</span><br /> <span class="token property">"entries"</span><span class="token operator">:</span> <span class="token punctuation">{</span><br /> <span class="token property">"journal"</span><span class="token operator">:</span> <span class="token punctuation">[</span><br /> <span class="token punctuation">{</span><br /> <span class="token property">"sys_id"</span><span class="token operator">:</span> <span class="token string">"a724d596db2123008096a455ca96196a"</span><span class="token punctuation">,</span><br /> <span class="token property">"sanitized_old_value"</span><span class="token operator">:</span> <span class="token string">""</span><span class="token punctuation">,</span><br /> <span class="token property">"field_label"</span><span class="token operator">:</span> <span class="token string">"Additional\n\n comments"</span><span class="token punctuation">,</span><br /> <span class="token property">"is_truncated"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span><br /> <span class="token property">"change_type"</span><span class="token operator">:</span> <span class="token string">"JOURNAL"</span><span class="token punctuation">,</span><br /> <span class="token property">"old_value"</span><span class="token operator">:</span> <span class="token string">""</span><span class="token punctuation">,</span><br /> <span class="token property">"field_type"</span><span class="token operator">:</span> <span class="token string">"journal_input"</span><span class="token punctuation">,</span><br /> <span class="token property">"new_value"</span><span class="token operator">:</span> <span class="token string">"Fourth Commnet"</span><span class="token punctuation">,</span><br /> <span class="token property">"sanitized_new_value"</span><span class="token operator">:</span> <span class="token string">"Fourth Commnet"</span><span class="token punctuation">,</span><br /> <span class="token property">"field_name"</span><span class="token operator">:</span> <span class="token string">"comments"</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">]</span><span class="token punctuation">,</span><br /> <span class="token property">"custom"</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">,</span><br /> <span class="token property">"changes"</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token property">"writable_journal_fields"</span><span class="token operator">:</span> <span class="token punctuation">[</span><br /> <span class="token string">"comments"</span><br /> <span class="token punctuation">]</span><span class="token punctuation">,</span><br /> <span class="token property">"user_id"</span><span class="token operator">:</span> <span class="token string">"cee12e57db1023008096a455ca961971"</span><span class="token punctuation">,</span><br /> <span class="token property">"sys_created_on"</span><span class="token operator">:</span> <span class="token string">"2018-11-05 14:04:26"</span><span class="token punctuation">,</span><br /> <span class="token property">"sys_timestamp"</span><span class="token operator">:</span> <span class="token number">1541426666000</span><span class="token punctuation">,</span><br /> <span class="token property">"sys_created_by"</span><span class="token operator">:</span> <span class="token string">"Jace Benson"</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token punctuation">{</span><br /> <span class="token property">"display_value"</span><span class="token operator">:</span> <span class="token string">"INC0010010"</span><span class="token punctuation">,</span><br /> <span class="token property">"short_description"</span><span class="token operator">:</span> <span class="token string">"Tttt"</span><span class="token punctuation">,</span><br /> <span class="token property">"is_email"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span><br /> <span class="token property">"initials"</span><span class="token operator">:</span> <span class="token string">"JB"</span><span class="token punctuation">,</span><br /> <span class="token property">"label"</span><span class="token operator">:</span> <span class="token string">"Incident"</span><span class="token punctuation">,</span><br /> <span class="token property">"document_id"</span><span class="token operator">:</span> <span class="token string">"aed745a0db1123008096a455ca961992"</span><span class="token punctuation">,</span><br /> <span class="token property">"sys_created_on_adjusted"</span><span class="token operator">:</span> <span class="token string">"2018-11-05 06:04:13"</span><span class="token punctuation">,</span><br /> <span class="token property">"entries"</span><span class="token operator">:</span> <span class="token punctuation">{</span><br /> <span class="token property">"journal"</span><span class="token operator">:</span> <span class="token punctuation">[</span><br /> <span class="token punctuation">{</span><br /> <span class="token property">"sys_id"</span><span class="token operator">:</span> <span class="token string">"5024d1d2db2123008096a455ca9619fa"</span><span class="token punctuation">,</span><br /> <span class="token property">"sanitized_old_value"</span><span class="token operator">:</span> <span class="token string">""</span><span class="token punctuation">,</span><br /> <span class="token property">"field_label"</span><span class="token operator">:</span> <span class="token string">"Additional comments"</span><span class="token punctuation">,</span><br /> <span class="token property">"is_truncated"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span><br /> <span class="token property">"change_type"</span><span class="token operator">:</span> <span class="token string">"JOURNAL"</span><span class="token punctuation">,</span><br /> <span class="token property">"old_value"</span><span class="token operator">:</span> <span class="token string">""</span><span class="token punctuation">,</span><br /> <span class="token property">"field_type"</span><span class="token operator">:</span> <span class="token string">"journal_input"</span><span class="token punctuation">,</span><br /> <span class="token property">"new_value"</span><span class="token operator">:</span> <span class="token string">"Third Comment"</span><span class="token punctuation">,</span><br /> <span class="token property">"sanitized_new_value"</span><span class="token operator">:</span> <span class="token string">"Third Comment"</span><span class="token punctuation">,</span><br /> <span class="token property">"field_name"</span><span class="token operator">:</span> <span class="token string">"comments"</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">]</span><span class="token punctuation">,</span><br /> <span class="token property">"custom"</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">,</span><br /> <span class="token property">"changes"</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token property">"writable_journal_fields"</span><span class="token operator">:</span> <span class="token punctuation">[</span><br /> <span class="token string">"comments"</span><br /> <span class="token punctuation">]</span><span class="token punctuation">,</span><br /> <span class="token property">"user_id"</span><span class="token operator">:</span> <span class="token string">"cee12e57db1023008096a455ca961971"</span><span class="token punctuation">,</span><br /> <span class="token property">"sys_created_on"</span><span class="token operator">:</span> <span class="token string">"2018-11-05 14:04:13"</span><span class="token punctuation">,</span><br /> <span class="token property">"sys_timestamp"</span><span class="token operator">:</span> <span class="token number">1541426653000</span><span class="token punctuation">,</span><br /> <span class="token property">"sys_created_by"</span><span class="token operator">:</span> <span class="token string">"Jace Benson"</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token punctuation">{</span><br /> <span class="token property">"display_value"</span><span class="token operator">:</span> <span class="token string">"INC0010010"</span><span class="token punctuation">,</span><br /> <span class="token property">"short_description"</span><span class="token operator">:</span> <span class="token string">"Tttt"</span><span class="token punctuation">,</span><br /> <span class="token property">"is_email"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span><br /> <span class="token property">"initials"</span><span class="token operator">:</span> <span class="token string">"JB"</span><span class="token punctuation">,</span><br /> <span class="token property">"label"</span><span class="token operator">:</span> <span class="token string">"Incident"</span><span class="token punctuation">,</span><br /> <span class="token property">"document_id"</span><span class="token operator">:</span> <span class="token string">"aed745a0db1123008096a455ca961992"</span><span class="token punctuation">,</span><br /> <span class="token property">"sys_created_on_adjusted"</span><span class="token operator">:</span> <span class="token string">"2018-11-05 06:01:48"</span><span class="token punctuation">,</span><br /> <span class="token property">"entries"</span><span class="token operator">:</span> <span class="token punctuation">{</span><br /> <span class="token property">"journal"</span><span class="token operator">:</span> <span class="token punctuation">[</span><br /> <span class="token punctuation">{</span><br /> <span class="token property">"sys_id"</span><span class="token operator">:</span> <span class="token string">"70931d96db2123008096a455ca9619f0"</span><span class="token punctuation">,</span><br /> <span class="token property">"sanitized_old_value"</span><span class="token operator">:</span> <span class="token string">""</span><span class="token punctuation">,</span><br /> <span class="token property">"field_label"</span><span class="token operator">:</span> <span class="token string">"Additional comments"</span><span class="token punctuation">,</span><br /> <span class="token property">"is_truncated"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span><br /> <span class="token property">"change_type"</span><span class="token operator">:</span> <span class="token string">"JOURNAL"</span><span class="token punctuation">,</span><br /> <span class="token property">"old_value"</span><span class="token operator">:</span> <span class="token string">""</span><span class="token punctuation">,</span><br /> <span class="token property">"field_type"</span><span class="token operator">:</span> <span class="token string">"journal_input"</span><span class="token punctuation">,</span><br /> <span class="token property">"new_value"</span><span class="token operator">:</span> <span class="token string">"Second Comment"</span><span class="token punctuation">,</span><br /> <span class="token property">"sanitized_new_value"</span><span class="token operator">:</span> <span class="token string">"Second Comment"</span><span class="token punctuation">,</span><br /> <span class="token property">"field_name"</span><span class="token operator">:</span> <span class="token string">"comments"</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">]</span><span class="token punctuation">,</span><br /> <span class="token property">"custom"</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">,</span><br /> <span class="token property">"changes"</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token property">"writable_journal_fields"</span><span class="token operator">:</span> <span class="token punctuation">[</span><br /> <span class="token string">"comments"</span><br /> <span class="token punctuation">]</span><span class="token punctuation">,</span><br /> <span class="token property">"user_id"</span><span class="token operator">:</span> <span class="token string">"cee12e57db1023008096a455ca961971"</span><span class="token punctuation">,</span><br /> <span class="token property">"sys_created_on"</span><span class="token operator">:</span> <span class="token string">"2018-11-05 14:01:48"</span><span class="token punctuation">,</span><br /> <span class="token property">"sys_timestamp"</span><span class="token operator">:</span> <span class="token number">1541426508000</span><span class="token punctuation">,</span><br /> <span class="token property">"sys_created_by"</span><span class="token operator">:</span> <span class="token string">"Jace Benson"</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token punctuation">{</span><br /> <span class="token property">"display_value"</span><span class="token operator">:</span> <span class="token string">"INC0010010"</span><span class="token punctuation">,</span><br /> <span class="token property">"short_description"</span><span class="token operator">:</span> <span class="token string">"Tttt"</span><span class="token punctuation">,</span><br /> <span class="token property">"is_email"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span><br /> <span class="token property">"initials"</span><span class="token operator">:</span> <span class="token string">"JB"</span><span class="token punctuation">,</span><br /> <span class="token property">"label"</span><span class="token operator">:</span> <span class="token string">"Incident"</span><span class="token punctuation">,</span><br /> <span class="token property">"document_id"</span><span class="token operator">:</span> <span class="token string">"aed745a0db1123008096a455ca961992"</span><span class="token punctuation">,</span><br /> <span class="token property">"sys_created_on_adjusted"</span><span class="token operator">:</span> <span class="token string">"2018-11-05 06:01:33"</span><span class="token punctuation">,</span><br /> <span class="token property">"entries"</span><span class="token operator">:</span> <span class="token punctuation">{</span><br /> <span class="token property">"journal"</span><span class="token operator">:</span> <span class="token punctuation">[</span><br /> <span class="token punctuation">{</span><br /> <span class="token property">"sys_id"</span><span class="token operator">:</span> <span class="token string">"d9831d96db2123008096a455ca961939"</span><span class="token punctuation">,</span><br /> <span class="token property">"sanitized_old_value"</span><span class="token operator">:</span> <span class="token string">""</span><span class="token punctuation">,</span><br /> <span class="token property">"field_label"</span><span class="token operator">:</span> <span class="token string">"Additional comments"</span><span class="token punctuation">,</span><br /> <span class="token property">"is_truncated"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span><br /> <span class="token property">"change_type"</span><span class="token operator">:</span> <span class="token string">"JOURNAL"</span><span class="token punctuation">,</span><br /> <span class="token property">"old_value"</span><span class="token operator">:</span> <span class="token string">""</span><span class="token punctuation">,</span><br /> <span class="token property">"field_type"</span><span class="token operator">:</span> <span class="token string">"journal_input"</span><span class="token punctuation">,</span><br /> <span class="token property">"new_value"</span><span class="token operator">:</span> <span class="token string">"First Comment"</span><span class="token punctuation">,</span><br /> <span class="token property">"sanitized_new_value"</span><span class="token operator">:</span> <span class="token string">"First Comment"</span><span class="token punctuation">,</span><br /> <span class="token property">"field_name"</span><span class="token operator">:</span> <span class="token string">"comments"</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">]</span><span class="token punctuation">,</span><br /> <span class="token property">"custom"</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">,</span><br /> <span class="token property">"changes"</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token property">"writable_journal_fields"</span><span class="token operator">:</span> <span class="token punctuation">[</span><br /> <span class="token string">"comments"</span><br /> <span class="token punctuation">]</span><span class="token punctuation">,</span><br /> <span class="token property">"user_id"</span><span class="token operator">:</span> <span class="token string">"cee12e57db1023008096a455ca961971"</span><span class="token punctuation">,</span><br /> <span class="token property">"sys_created_on"</span><span class="token operator">:</span> <span class="token string">"2018-11-05 14:01:33"</span><span class="token punctuation">,</span><br /> <span class="token property">"sys_timestamp"</span><span class="token operator">:</span> <span class="token number">1541426493000</span><span class="token punctuation">,</span><br /> <span class="token property">"sys_created_by"</span><span class="token operator">:</span> <span class="token string">"Jace Benson"</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token punctuation">{</span><br /> <span class="token property">"display_value"</span><span class="token operator">:</span> <span class="token string">"INC0010010"</span><span class="token punctuation">,</span><br /> <span class="token property">"short_description"</span><span class="token operator">:</span> <span class="token string">"Tttt"</span><span class="token punctuation">,</span><br /> <span class="token property">"is_email"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span><br /> <span class="token property">"initials"</span><span class="token operator">:</span> <span class="token string">"JB"</span><span class="token punctuation">,</span><br /> <span class="token property">"label"</span><span class="token operator">:</span> <span class="token string">"Incident"</span><span class="token punctuation">,</span><br /> <span class="token property">"document_id"</span><span class="token operator">:</span> <span class="token string">"aed745a0db1123008096a455ca961992"</span><span class="token punctuation">,</span><br /> <span class="token property">"sys_created_on_adjusted"</span><span class="token operator">:</span> <span class="token string">"2018-10-18 09:26:37"</span><span class="token punctuation">,</span><br /> <span class="token property">"entries"</span><span class="token operator">:</span> <span class="token punctuation">{</span><br /> <span class="token property">"journal"</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">,</span><br /> <span class="token property">"custom"</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">,</span><br /> <span class="token property">"changes"</span><span class="token operator">:</span> <span class="token punctuation">[</span><br /> <span class="token punctuation">{</span><br /> <span class="token property">"sys_id"</span><span class="token operator">:</span> <span class="token string">"3c731996db2123008096a455ca96193e"</span><span class="token punctuation">,</span><br /> <span class="token property">"sanitized_old_value"</span><span class="token operator">:</span> <span class="token string">""</span><span class="token punctuation">,</span><br /> <span class="token property">"field_label"</span><span class="token operator">:</span> <span class="token string">"Impact"</span><span class="token punctuation">,</span><br /> <span class="token property">"is_truncated"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span><br /> <span class="token property">"change_type"</span><span class="token operator">:</span> <span class="token string">"AUDIT"</span><span class="token punctuation">,</span><br /> <span class="token property">"old_value"</span><span class="token operator">:</span> <span class="token string">""</span><span class="token punctuation">,</span><br /> <span class="token property">"field_type"</span><span class="token operator">:</span> <span class="token string">"integer"</span><span class="token punctuation">,</span><br /> <span class="token property">"new_value"</span><span class="token operator">:</span> <span class="token string">"3 - Low"</span><span class="token punctuation">,</span><br /> <span class="token property">"sanitized_new_value"</span><span class="token operator">:</span> <span class="token string">"3 - Low"</span><span class="token punctuation">,</span><br /> <span class="token property">"field_name"</span><span class="token operator">:</span> <span class="token string">"impact"</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token punctuation">{</span><br /> <span class="token property">"sys_id"</span><span class="token operator">:</span> <span class="token string">"78731996db2123008096a455ca96193f"</span><span class="token punctuation">,</span><br /> <span class="token property">"sanitized_old_value"</span><span class="token operator">:</span> <span class="token string">""</span><span class="token punctuation">,</span><br /> <span class="token property">"field_label"</span><span class="token operator">:</span> <span class="token string">"Incident state"</span><span class="token punctuation">,</span><br /> <span class="token property">"is_truncated"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span><br /> <span class="token property">"change_type"</span><span class="token operator">:</span> <span class="token string">"AUDIT"</span><span class="token punctuation">,</span><br /> <span class="token property">"old_value"</span><span class="token operator">:</span> <span class="token string">""</span><span class="token punctuation">,</span><br /> <span class="token property">"field_type"</span><span class="token operator">:</span> <span class="token string">"integer"</span><span class="token punctuation">,</span><br /> <span class="token property">"new_value"</span><span class="token operator">:</span> <span class="token string">"New"</span><span class="token punctuation">,</span><br /> <span class="token property">"sanitized_new_value"</span><span class="token operator">:</span> <span class="token string">"New"</span><span class="token punctuation">,</span><br /> <span class="token property">"field_name"</span><span class="token operator">:</span> <span class="token string">"incident_state"</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token punctuation">{</span><br /> <span class="token property">"sys_id"</span><span class="token operator">:</span> <span class="token string">"38731996db2123008096a455ca96193e"</span><span class="token punctuation">,</span><br /> <span class="token property">"sanitized_old_value"</span><span class="token operator">:</span> <span class="token string">""</span><span class="token punctuation">,</span><br /> <span class="token property">"field_label"</span><span class="token operator">:</span> <span class="token string">"Opened by"</span><span class="token punctuation">,</span><br /> <span class="token property">"is_truncated"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span><br /> <span class="token property">"change_type"</span><span class="token operator">:</span> <span class="token string">"AUDIT"</span><span class="token punctuation">,</span><br /> <span class="token property">"old_value"</span><span class="token operator">:</span> <span class="token string">""</span><span class="token punctuation">,</span><br /> <span class="token property">"field_type"</span><span class="token operator">:</span> <span class="token string">"reference"</span><span class="token punctuation">,</span><br /> <span class="token property">"new_value"</span><span class="token operator">:</span> <span class="token string">"Jace Benson"</span><span class="token punctuation">,</span><br /> <span class="token property">"sanitized_new_value"</span><span class="token operator">:</span> <span class="token string">"Jace Benson"</span><span class="token punctuation">,</span><br /> <span class="token property">"field_name"</span><span class="token operator">:</span> <span class="token string">"opened_by"</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token punctuation">{</span><br /> <span class="token property">"sys_id"</span><span class="token operator">:</span> <span class="token string">"bc731996db2123008096a455ca96193e"</span><span class="token punctuation">,</span><br /> <span class="token property">"sanitized_old_value"</span><span class="token operator">:</span> <span class="token string">""</span><span class="token punctuation">,</span><br /> <span class="token property">"field_label"</span><span class="token operator">:</span> <span class="token string">"Priority"</span><span class="token punctuation">,</span><br /> <span class="token property">"is_truncated"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span><br /> <span class="token property">"change_type"</span><span class="token operator">:</span> <span class="token string">"AUDIT"</span><span class="token punctuation">,</span><br /> <span class="token property">"old_value"</span><span class="token operator">:</span> <span class="token string">""</span><span class="token punctuation">,</span><br /> <span class="token property">"field_type"</span><span class="token operator">:</span> <span class="token string">"integer"</span><span class="token punctuation">,</span><br /> <span class="token property">"new_value"</span><span class="token operator">:</span> <span class="token string">"5 - Planning"</span><span class="token punctuation">,</span><br /> <span class="token property">"sanitized_new_value"</span><span class="token operator">:</span> <span class="token string">"5 - Planning"</span><span class="token punctuation">,</span><br /> <span class="token property">"field_name"</span><span class="token operator">:</span> <span class="token string">"priority"</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">]</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token property">"writable_journal_fields"</span><span class="token operator">:</span> <span class="token punctuation">[</span><br /> <span class="token string">"comments"</span><br /> <span class="token punctuation">]</span><span class="token punctuation">,</span><br /> <span class="token property">"user_id"</span><span class="token operator">:</span> <span class="token string">"cee12e57db1023008096a455ca961971"</span><span class="token punctuation">,</span><br /> <span class="token property">"sys_created_on"</span><span class="token operator">:</span> <span class="token string">"2018-10-18 16:26:37"</span><span class="token punctuation">,</span><br /> <span class="token property">"sys_timestamp"</span><span class="token operator">:</span> <span class="token number">1539879997000</span><span class="token punctuation">,</span><br /> <span class="token property">"sys_created_by"</span><span class="token operator">:</span> <span class="token string">"Jace Benson"</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">]</span><span class="token punctuation">,</span><br /> <span class="token property">"primary_fields"</span><span class="token operator">:</span> <span class="token punctuation">[</span><br /> <span class="token string">"comments"</span><br /> <span class="token punctuation">]</span><span class="token punctuation">,</span><br /> <span class="token property">"fields"</span><span class="token operator">:</span> <span class="token punctuation">[</span><br /> <span class="token punctuation">{</span><br /> <span class="token property">"plural"</span><span class="token operator">:</span> <span class="token string">"Assigned\n\n to"</span><span class="token punctuation">,</span><br /> <span class="token property">"color"</span><span class="token operator">:</span> <span class="token string">"background-color: transparent"</span><span class="token punctuation">,</span><br /> <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"assigned_to"</span><span class="token punctuation">,</span><br /> <span class="token property">"isJournal"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span><br /> <span class="token property">"canWrite"</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span><br /> <span class="token property">"label"</span><span class="token operator">:</span> <span class="token string">"Assigned to"</span><span class="token punctuation">,</span><br /> <span class="token property">"isActive"</span><span class="token operator">:</span> <span class="token boolean">true</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token punctuation">{</span><br /> <span class="token property">"plural"</span><span class="token operator">:</span> <span class="token string">"Configuration items"</span><span class="token punctuation">,</span><br /> <span class="token property">"color"</span><span class="token operator">:</span> <span class="token string">"background-color: transparent"</span><span class="token punctuation">,</span><br /> <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"cmdb_ci"</span><span class="token punctuation">,</span><br /> <span class="token property">"isJournal"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span><br /> <span class="token property">"canWrite"</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span><br /> <span class="token property">"label"</span><span class="token operator">:</span> <span class="token string">"Configuration item"</span><span class="token punctuation">,</span><br /> <span class="token property">"isActive"</span><span class="token operator">:</span> <span class="token boolean">true</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token punctuation">{</span><br /> <span class="token property">"plural"</span><span class="token operator">:</span> <span class="token string">"Incident states"</span><span class="token punctuation">,</span><br /> <span class="token property">"color"</span><span class="token operator">:</span> <span class="token string">"background-color: transparent"</span><span class="token punctuation">,</span><br /> <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"incident_state"</span><span class="token punctuation">,</span><br /> <span class="token property">"isJournal"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span><br /> <span class="token property">"canWrite"</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span><br /> <span class="token property">"label"</span><span class="token operator">:</span> <span class="token string">"Incident state"</span><span class="token punctuation">,</span><br /> <span class="token property">"isActive"</span><span class="token operator">:</span> <span class="token boolean">true</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token punctuation">{</span><br /> <span class="token property">"plural"</span><span class="token operator">:</span> <span class="token string">"Impact"</span><span class="token punctuation">,</span><br /> <span class="token property">"color"</span><span class="token operator">:</span> <span class="token string">"background-color\n\n: transparent"</span><span class="token punctuation">,</span><br /> <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"impact"</span><span class="token punctuation">,</span><br /> <span class="token property">"isJournal"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span><br /> <span class="token property">"canWrite"</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span><br /> <span class="token property">"label"</span><span class="token operator">:</span> <span class="token string">"Impact"</span><span class="token punctuation">,</span><br /> <span class="token property">"isActive"</span><span class="token operator">:</span> <span class="token boolean">true</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token punctuation">{</span><br /> <span class="token property">"plural"</span><span class="token operator">:</span> <span class="token string">"Priorities"</span><span class="token punctuation">,</span><br /> <span class="token property">"color"</span><span class="token operator">:</span> <span class="token string">"background-color: transparent"</span><span class="token punctuation">,</span><br /> <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"priority"</span><span class="token punctuation">,</span><br /> <span class="token property">"isJournal"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span><br /> <span class="token property">"canWrite"</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span><br /> <span class="token property">"label"</span><span class="token operator">:</span> <span class="token string">"Priority"</span><span class="token punctuation">,</span><br /> <span class="token property">"isActive"</span><span class="token operator">:</span> <span class="token boolean">true</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token punctuation">{</span><br /> <span class="token property">"plural"</span><span class="token operator">:</span> <span class="token string">"Opened by"</span><span class="token punctuation">,</span><br /> <span class="token property">"color"</span><span class="token operator">:</span> <span class="token string">"background-color: transparent"</span><span class="token punctuation">,</span><br /> <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"opened_by"</span><span class="token punctuation">,</span><br /> <span class="token property">"isJournal"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span><br /> <span class="token property">"canWrite"</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span><br /> <span class="token property">"label"</span><span class="token operator">:</span> <span class="token string">"Opened by"</span><span class="token punctuation">,</span><br /> <span class="token property">"isActive"</span><span class="token operator">:</span> <span class="token boolean">true</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token punctuation">{</span><br /> <span class="token property">"plural"</span><span class="token operator">:</span> <span class="token string">"Work notes"</span><span class="token punctuation">,</span><br /> <span class="token property">"color"</span><span class="token operator">:</span> <span class="token string">"gold"</span><span class="token punctuation">,</span><br /> <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"work_notes"</span><span class="token punctuation">,</span><br /> <span class="token property">"isJournal"</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span><br /> <span class="token property">"canWrite"</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span><br /> <span class="token property">"label"</span><span class="token operator">:</span> <span class="token string">"Work notes"</span><span class="token punctuation">,</span><br /> <span class="token property">"isActive"</span><span class="token operator">:</span> <span class="token boolean">false</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token punctuation">{</span><br /> <span class="token property">"plural"</span><span class="token operator">:</span> <span class="token string">"Additional comments"</span><span class="token punctuation">,</span><br /> <span class="token property">"color"</span><span class="token operator">:</span> <span class="token string">"transparent"</span><span class="token punctuation">,</span><br /> <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"comments"</span><span class="token punctuation">,</span><br /> <span class="token property">"isJournal"</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span><br /> <span class="token property">"canWrite"</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span><br /> <span class="token property">"label"</span><span class="token operator">:</span> <span class="token string">"Additional comments"</span><span class="token punctuation">,</span><br /> <span class="token property">"isActive"</span><span class="token operator">:</span> <span class="token boolean">true</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token punctuation">{</span><br /> <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"*Email*"</span><span class="token punctuation">,</span><br /> <span class="token property">"isJournal"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span><br /> <span class="token property">"label"</span><span class="token operator">:</span> <span class="token string">"Sent/Received Emails"</span><span class="token punctuation">,</span><br /> <span class="token property">"isActive"</span><span class="token operator">:</span> <span class="token boolean">true</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token punctuation">{</span><br /> <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"*Relations*"</span><span class="token punctuation">,</span><br /> <span class="token property">"isJournal"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span><br /> <span class="token property">"label"</span><span class="token operator">:</span> <span class="token string">"Relationship\n\n Changes"</span><span class="token punctuation">,</span><br /> <span class="token property">"isActive"</span><span class="token operator">:</span> <span class="token boolean">true</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token punctuation">{</span><br /> <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"*Attachments*"</span><span class="token punctuation">,</span><br /> <span class="token property">"isJournal"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span><br /> <span class="token property">"label"</span><span class="token operator">:</span> <span class="token string">"Attachments"</span><span class="token punctuation">,</span><br /> <span class="token property">"isActive"</span><span class="token operator">:</span> <span class="token boolean">true</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token punctuation">{</span><br /> <span class="token property">"plural"</span><span class="token operator">:</span> <span class="token string">"Resolution codes"</span><span class="token punctuation">,</span><br /> <span class="token property">"color"</span><span class="token operator">:</span> <span class="token string">"background-color: transparent"</span><span class="token punctuation">,</span><br /> <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"close_code"</span><span class="token punctuation">,</span><br /> <span class="token property">"isJournal"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span><br /> <span class="token property">"canWrite"</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span><br /> <span class="token property">"label"</span><span class="token operator">:</span> <span class="token string">"Resolution code"</span><span class="token punctuation">,</span><br /> <span class="token property">"isActive"</span><span class="token operator">:</span> <span class="token boolean">true</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token punctuation">{</span><br /> <span class="token property">"plural"</span><span class="token operator">:</span> <span class="token string">"Close notes"</span><span class="token punctuation">,</span><br /> <span class="token property">"color"</span><span class="token operator">:</span> <span class="token string">"background-color\n\n: transparent"</span><span class="token punctuation">,</span><br /> <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"close_notes"</span><span class="token punctuation">,</span><br /> <span class="token property">"isJournal"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span><br /> <span class="token property">"canWrite"</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span><br /> <span class="token property">"label"</span><span class="token operator">:</span> <span class="token string">"Resolution notes"</span><span class="token punctuation">,</span><br /> <span class="token property">"isActive"</span><span class="token operator">:</span> <span class="token boolean">true</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">]</span><span class="token punctuation">,</span><br /> <span class="token property">"sys_timestamp"</span><span class="token operator">:</span> <span class="token number">1541426678000</span><br /><span class="token punctuation">}</span></code></pre>
<!--EndFragment-->
<!--StartFragment-->
<p>KB0655923: <a href="https://hi.service-now.com/kb_view.do?sysparm_article=KB0655923">https://hi.service-now.com/kb_view.do?sysparm_article=KB0655923</a></p>
<!--EndFragment-->Hacktoberfest 2018 - Self contained ATF application2018-10-24T20:52:45Zhttps://jace.pro/post/2018-10-24-atf/Jace Benson<!--StartFragment-->
<p>DigitalOcean and Github put together an event called "Hactoberfest" where you can sign up and get a shirt after 5 pull requests.</p>
<p>I've made a repo to build out tests for ServiceNow's tool to help everyone get there.</p>
<p>Check it out <a href="https://atf.jace.pro/">on Github</a>.</p>
<p>To contribute you need a personal developer instance and the drive to make a test and / or suite to test some OOB functionality.</p>
<p>All tests should be self contained. What do I mean by that? Well, anything you reference in the test may need to be created like the user you want to impersonate, and their group memberships/roles.</p>
<p>I do intend on making a custom test as part of this to make the generation of these artifacts easier but I am still learning how the code works for those tests.<br />
<a href="https://community.servicenow.com/community?id=community_blog&sys_id=398d6669dbd0dbc01dcaf3231f9619d2">This post</a> at least is a decent example of someone doing a custom test step.</p>
<!--EndFragment-->MermaidJS: Lets render that workflow in an opinionated way2018-10-04T20:49:17Zhttps://jace.pro/post/2018-10-04-mermaidjs-wf/Jace Benson<!--StartFragment-->
<p>The other day I was looking at my mermaidjs flows and wanted to see how<br />
they would render a servicenow workflow.</p>
<p>I created a UI page to do this, you have to pass it a context<br />
<code>sys_id</code> today but this could be improved.</p>
<!--EndFragment-->
<h2>UI Action</h2>
<!--StartFragment-->
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">/*<br />Name: Show Mermaid<br />Table: Workflow Context[wf_context]<br />Client: [True]<br />OnClick: showWorkflowContextMermaid();<br />Script:<br />*/</span><br /><span class="token keyword">function</span> <span class="token function">showWorkflowContextMermaid</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> id <span class="token operator">=</span> g_form<span class="token punctuation">.</span><span class="token function">getUniqueValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> url <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideURL</span><span class="token punctuation">(</span><span class="token string">'/mermaid.do'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> url<span class="token punctuation">.</span><span class="token function">addParam</span><span class="token punctuation">(</span><span class="token string">'sysparm_stack'</span><span class="token punctuation">,</span> <span class="token string">'no'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> url<span class="token punctuation">.</span><span class="token function">addParam</span><span class="token punctuation">(</span><span class="token string">'context'</span><span class="token punctuation">,</span> id<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> g_navigation<span class="token punctuation">.</span><span class="token function">open</span><span class="token punctuation">(</span>url<span class="token punctuation">.</span><span class="token function">getURL</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">"_blank"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span></code></pre>
<!--EndFragment-->
<h2>UI Page</h2>
<!--StartFragment-->
<pre class="language-xml"><code class="language-xml"><span class="token prolog"><?xml version="1.0" encoding="utf-8" ?></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">j:</span>jelly</span> <span class="token attr-name">trim</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>false<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xmlns:</span>j</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>jelly:core<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xmlns:</span>g</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>glide<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xmlns:</span>j2</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>null<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xmlns:</span>g2</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>null<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>body</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">g:</span>evaluate</span><span class="token punctuation">></span></span><br />var output = [];<br />var wf_context = new GlideRecord('wf_context');<br /> if(wf_context.get(RP.getParameterValue('context'))){<br /> var wf_activity = new GlideRecord("wf_activity");<br /> wf_activity.addQuery('workflow_version', wf_context.getValue('workflow_version'));<br /> wf_activity.orderBy('x');<br /> // wf_activity.orderBy('y');<br /> var query = wf_activity.getEncodedQuery();<br /> wf_activity.query();<br /> while(wf_activity.next()){<br /> // gs.info(wf_activity.getValue('sys_id') + '(' + wf_activity.name.toString().replace(/\"/g,'') + ')');<br /> output.push(wf_activity.getValue('sys_id') + '(' + wf_activity.name.toString().replace(/\"/g,'') + ')');<br /> var transitions = new GlideRecord('wf_transition');<br /> transitions.addQuery('from',wf_activity.getValue('sys_id'));<br /> transitions.query();<br /> while(transitions.next()){<br /> // output.push(wf_activity.getValue('sys_id') + '-->' + transitions.getValue('to'));<br /> output.push(wf_activity.getValue('sys_id') + '--' + transitions.condition.name.toString() + '-->' + transitions.getValue('to'));<br /> }<br /> }<br /> gs.info(output.toString().replace(/\,/g,'\n'));<br />output = output.toString().replace(/\,/g,'\n')<br /> } else {<br /> var query = 'No Workflow Found';<br /> }<br />gs.info(query);<br /><span class="token tag"><span class="token tag"><span class="token punctuation"></</span><span class="token namespace">g:</span>evaluate</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>mermaid<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> graph TD<br /> ${output}<br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>hidden<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> graph TD<br /> ${output}<br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>https://unpkg.com/mermaid@7.1.0/dist/mermaid.js<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span><span class="token script"><span class="token language-javascript"><br /><span class="token operator"><</span>script<span class="token operator">></span><br /><span class="token comment">// mermaid.initialize({startOnLoad:true});</span><br /></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>script</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>body</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"></</span><span class="token namespace">j:</span>jelly</span><span class="token punctuation">></span></span></code></pre>
<!--EndFragment-->
<p><img src="https://jace.pro/static/img/mermaidjs-wf-1.png" alt="" /></p>
Getting the next N approvals2018-09-24T20:45:44Zhttps://jace.pro/post/2018-09-24-get-next-n-approvals/Jace Benson<!--StartFragment-->
<p>I was talking with someone they were asking how to get the next x approvals up to 10. You can't always control the environment you work in. He was trying to get the next x approvals. I came up with this script;</p>
<!--EndFragment-->
<!--StartFragment-->
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">// start debugging</span><br /><span class="token keyword">var</span> current <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span><br />current<span class="token punctuation">.</span>variables <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span><br />current<span class="token punctuation">.</span>variables<span class="token punctuation">.</span>user <span class="token operator">=</span> gs<span class="token punctuation">.</span><span class="token function">getUserID</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token comment">// end debugging</span><br /><br /><span class="token keyword">function</span> <span class="token function">getManager</span><span class="token punctuation">(</span><span class="token parameter">user<span class="token punctuation">,</span>display</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">var</span> m <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'sys_user'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>m<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>user<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token comment">// gs.print(m.manager.getDisplayValue() + ' : ' + m.getValue('manager')); </span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>display<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">return</span> m<span class="token punctuation">.</span><span class="token function">getDisplayValue</span><span class="token punctuation">(</span><span class="token string">'manager'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><br /> <span class="token keyword">return</span> m<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token string">'manager'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span><br /><span class="token keyword">var</span> approvals <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span><br /><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">var</span> x<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">;</span> x<span class="token operator"><=</span><span class="token number">10</span><span class="token punctuation">;</span> x<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>x<span class="token operator">===</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> approvals<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token punctuation">{</span><br /> <span class="token literal-property property">x</span><span class="token operator">:</span> x<span class="token punctuation">,</span><br /> <span class="token literal-property property">name</span><span class="token operator">:</span> <span class="token function">getManager</span><span class="token punctuation">(</span>current<span class="token punctuation">.</span>variables<span class="token punctuation">.</span>user<span class="token punctuation">,</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">sys_id</span><span class="token operator">:</span> <span class="token function">getManager</span><span class="token punctuation">(</span>current<span class="token punctuation">.</span>variables<span class="token punctuation">.</span>user<span class="token punctuation">,</span><span class="token boolean">false</span><span class="token punctuation">)</span><br /> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><br /> approvals<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token punctuation">{</span><br /> <span class="token literal-property property">x</span><span class="token operator">:</span> x<span class="token punctuation">,</span><br /> <span class="token literal-property property">name</span><span class="token operator">:</span> <span class="token function">getManager</span><span class="token punctuation">(</span>approvals<span class="token punctuation">[</span>x<span class="token operator">-</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">.</span>sys_id<span class="token punctuation">,</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">sys_id</span><span class="token operator">:</span> <span class="token function">getManager</span><span class="token punctuation">(</span>approvals<span class="token punctuation">[</span>x<span class="token operator">-</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">.</span>sys_id<span class="token punctuation">,</span><span class="token boolean">false</span><span class="token punctuation">)</span><br /> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token comment">// gs.print('level ' + x + ' ' + approvals[x]);</span><br /><span class="token punctuation">}</span><br /><br />gs<span class="token punctuation">.</span><span class="token function">print</span><span class="token punctuation">(</span><span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">stringify</span><span class="token punctuation">(</span>approvals<span class="token punctuation">,</span><span class="token string">''</span><span class="token punctuation">,</span><span class="token string">' '</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<!--EndFragment-->Naming your update sets2018-09-20T20:43:52Zhttps://jace.pro/post/2018-09-20-update-set-naming/Jace Benson<!--StartFragment-->
<p>Update set names should be somewhat meaningful without having to look at<br />
the contents of the XML. ServiceNow has some recommendations on <a href="https://hi.service-now.com/kb_view.do?sysparm_article=KB0552854">HI</a> and on the <a href="https://docs.servicenow.com/bundle/kingston-application-development/page/build/system-update-sets/reference/get-started-update-sets.html">Docs</a> site.</p>
<p>With that being said, generally best to have initials, date, some key (task) or description.</p>
<h1><a href="https://jace.pro/post/2018-09-20-update-set-naming/#update-set-naming-convention">Update Set Naming Convention</a></h1>
<ul>
<li>
<p>Make the names meaningful to the task at hand. The update set name should consist of the following.</p>
<ul>
<li>Related task record, version, release or sprint number</li>
<li>Brief description</li>
<li>Developer's initials</li>
</ul>
</li>
<li>
<p>For example, if working on Incident Management form layout from a Story. The update set name could be<br />
<code>STRY00123_Incident Mgmt Form Layout_ABC</code></p>
<ul>
<li>Update Set Description</li>
</ul>
</li>
<li>
<p>Put in as much detail as needed to ensure that if another member of the team looks at the update set record they can see what the contents are.</p>
</li>
<li>
<p>This becomes especially important when working on an entire track. If you are working on Incident Management as a whole with multiple stories assigned to you, you should list all related stories in the description of the update set record.</p>
</li>
<li>
<p>The update set name should consist of the following if working on an entire track:</p>
<ul>
<li>Date, version, release or sprint number</li>
<li>Brief description</li>
<li>Developer's initials</li>
<li>Example: <code>JB-2018-09-20 Combine both inc record producers</code></li>
</ul>
</li>
</ul>
<p>We added some JavaScript to pre-fill the initials, and date for consistency on the name field. Below makes the following output;<br />
<code>JB-2018-09-20</code></p>
<pre class="language-javascript"><code class="language-javascript"><span class="token literal-property property">javascript</span><span class="token operator">:</span> <span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">var</span> r <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> u <span class="token operator">=</span> gs<span class="token punctuation">.</span><span class="token function">getUser</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> r <span class="token operator">+=</span> <span class="token punctuation">(</span>u<span class="token punctuation">.</span><span class="token function">getFirstName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">;</span><br /> r <span class="token operator">+=</span> <span class="token punctuation">(</span>u<span class="token punctuation">.</span><span class="token function">getLastName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">;</span><br /> r <span class="token operator">+=</span> <span class="token string">'-'</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> d <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideDateTime</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> ms <span class="token operator">=</span> d<span class="token punctuation">.</span><span class="token function">getNumericValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> r <span class="token operator">+=</span> <span class="token keyword">new</span> <span class="token class-name">Date</span><span class="token punctuation">(</span>ms<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toISOString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">split</span><span class="token punctuation">(</span><span class="token string">'T'</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">;</span><br /> r <span class="token operator">+=</span> <span class="token string">' '</span><span class="token punctuation">;</span><span class="token keyword">return</span> r<span class="token punctuation">;</span><span class="token punctuation">}</span><br /> <span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token punctuation">)</span></code></pre>
<!--EndFragment-->Code Collaboration tools seem to always go away, so I made one that wont2018-09-13T20:43:08Zhttps://jace.pro/post/2018-09-13-code-collab-tool/Jace Benson<!--StartFragment-->
<p>After issues with CollabEdit, I am now hosting my own FirePad instance on <a href="https://code.jace.pro/">code.jace.pro</a>.</p>
<p>Feel free to use this but note that as of right now its using the FirePad db from the <a href="https://firepad.io/docs/#api">FirePad project</a>.</p>
<!--EndFragment-->Service Catalog: Auto ordering variables2018-09-07T20:41:59Zhttps://jace.pro/post/2018-09-07-variable-ordering-trick/Jace Benson<!--StartFragment-->
<p>Today I learned a trick that would have saved me hours had I known about it years ago.</p>
<p>From time to time you find yourself working on a catalog item with variables. Sometimes those variables orders are to close together to allow for new variables. It would be great if you could press a button and have the order be fixed at 100s. You could write something custom... Or you could follow these steps;</p>
<ol>
<li>Preview Item</li>
<li>Right-click header</li>
<li>Configure variables</li>
<li>Change the order of one variable</li>
<li>OK</li>
<li>Change the order back.</li>
</ol>
<p>Now the variables are spaced in 100s</p>
<!--EndFragment-->Difference between ${URI} and ${URI_REF}2018-09-06T20:39:16Zhttps://jace.pro/post/2018-09-06-uri-and-uri-ref/Jace Benson<!--StartFragment-->
<p>All this talk about notifications had me poking around and I learned about using <code>${URI_REF}</code> instead of <code>${URI}</code>. It's magical.</p>
<ul>
<li>
<p><code>${URI_REF}</code> creates a link to the current record using the records display value. It's essentially... the same as;</p>
<pre class="language-javascript"><code class="language-javascript"><span class="token keyword">var</span> link <span class="token operator">=</span> <span class="token string">'https://'</span><span class="token punctuation">;</span><br />link <span class="token operator">+=</span> gs<span class="token punctuation">.</span><span class="token function">getProperty</span><span class="token punctuation">(</span><span class="token string">'instance_name'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br />link <span class="token operator">+=</span> <span class="token string">'.service-now.com/'</span><span class="token punctuation">;</span><br />link <span class="token operator">+=</span> current<span class="token punctuation">.</span><span class="token function">getLink</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token keyword">var</span> display <span class="token operator">=</span> current<span class="token punctuation">.</span><span class="token function">getDisplayValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><br />template<span class="token punctuation">.</span><span class="token function">print</span><span class="token punctuation">(</span><span class="token string">'<a href="'</span> <span class="token operator">+</span> url <span class="token operator">+</span> <span class="token string">'">'</span> <span class="token operator">+</span> display <span class="token operator">+</span> <span class="token string">'</a>'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
</li>
<li>
<p><code>${URI}</code> creates a link to the current record using the text "Link".</p>
</li>
</ul>
<!--EndFragment-->ServiceNow: How to harden your instance2018-09-05T20:37:36Zhttps://jace.pro/post/2018-09-05-harden-instance/Jace Benson<!--StartFragment-->
<p>I had to prepare an instance for some penetration testing. Turns out this is pretty easy.</p>
<p>To start with you need to know what ServiceNow requires of you. Here's that <a href="https://hi.service-now.com/kb_view.do?sysparm_article=KB0538598">KB</a>.</p>
<p>At the time of writing you need these pre-requirements;</p>
<ul>
<li>Instance must be on most recent patch of supported family.</li>
<li>Instance must be unpinned.</li>
<li>Instance cannot be production.</li>
<li>Instance must have High Security Plugin enabled.</li>
<li><a href="https://hi.service-now.com/kb_view.do?sysparm_article=KB0550654">Instance must be hardened</a>.</li>
<li>You can test once per calendar year, extra testing incurs cost.</li>
</ul>
<p>That hardening guide on the <s>HI site</s> <a href="https://docs.servicenow.com/bundle/paris-platform-administration/page/administer/security/reference/instance-security-hardening-settings.html">Docs</a> is thorough. We needed HI to "Check Whitelist Package Calls" and "Check Whitelist Member Calls". This will be an issue if you've been granted access to use something the like <a href="https://stackoverflow.com/questions/48190244/read-zip-file-contents-using-zipfile-java-class-inside-script/48196453#48196453">ZipFile java class</a> to zip some files from the server.</p>
<p>There's a great <a href="https://developer.servicenow.com/app.do#!/share/contents/7852853_security_best_practice_audit?v=3.02&t=PRODUCT_DETAILS">share</a> (<a href="https://blog.jace.pro/uploads/SecurityBestPractiesAudit-V3_1.xml">my copy</a>) that gets you most the way there. I'd suggest starting there. You may<br />
need to configure some properties like what file extensions you'll allow but its easier to do this then to manually create each property. Also it checks for default accounts and passwords.</p>
<!--EndFragment-->Service Portal: Viewing what's loaded on the page2018-08-16T20:34:10Zhttps://jace.pro/post/2018-08-16-sp-troubleshooting-widgets/Jace Benson<!--StartFragment-->
<p>This is blatantly taken from <a href="https://hi.service-now.com/kb_view.do?sys_kb_id=cc706ab7db19db4058dcf4621f96194e">HI</a> as this I think is useful enough to re-post nearly verbatim.</p>
<p>If you've ever needed to know which Client Scripts, UI Policies, and UI Actions are loading onto the page when you view a form or Service Catalog item in Service Portal, the information is readily available if<br />
your know where to look.</p>
<p>If you are using the out-of-box "SC Catalog Item" and "Form" widgets, you can find this information in the widgets scope.</p>
<p>To view the widgets scope, hold down the CTRL key and right-click anywhere in the widget. Choose "Log to console: $scope". Open your browser developer tools to the JavaScript console. Expand the "Object"<br />
that has been dumped to the console.</p>
<h1>"Form" widget</h1>
<h3>Client Scripts are located at</h3>
<p><code>data.f.client_script</code></p>
<h3>UI Policies are located at</h3>
<p><code>data.f.policy</code></p>
<h3>UI Actions are located at</h3>
<p><code>data.f._ui_actions</code></p>
<h1>"SC Catalog Item" widget</h1>
<h3>Client Scripts are located at</h3>
<p><code>data.sc_cat_item.client_script</code></p>
<h3>UI Policies are located at</h3>
<p><code>data.sc_cat_item.policy</code></p>
<!--EndFragment-->Service Portal: Validating Date Format2018-08-16T20:32:30Zhttps://jace.pro/post/2018-08-16-sp-g_user_date_format/Jace Benson<!--StartFragment-->
<p>Someone had asked how to do some "<a href="https://community.servicenow.com/community?id=community_question&sys_id=71098fa1db5cdbc01dcaf3231f961929">How to verify a date format in service portal?</a>"</p>
<p>This came up in a chat I was having this week.</p>
<p>To use the <code>g_user_date_format</code>, <code>g_user_date_time_format</code> and <code>getDateFromFormat()</code>, you would have to re-include the JS file that declares these variables.</p>
<p>To do that go to the widget where you get a failure message and add a new dependency to a new UI script where you copy/paste the code from <a href="https://hi.service-now.com/scripts/calendar.js">https://hi.service-now.com/scripts/calendar.js</a>.</p>
<p>Then all your old calls ought to work as described in other posts.</p>
<!--EndFragment-->
<!--StartFragment-->
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">// returns a date object you can test against for date/time </span><br /><span class="token comment">// variables/fields</span><br /><span class="token keyword">new</span> <span class="token class-name">Date</span><span class="token punctuation">(</span><span class="token function">getDateFromFormat</span><span class="token punctuation">(</span>newValue<span class="token punctuation">,</span> g_user_date_time_format<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><br /><span class="token comment">// returns a date object you can test against for date </span><br /><span class="token comment">// variables/fields</span><br /><span class="token keyword">new</span> <span class="token class-name">Date</span><span class="token punctuation">(</span><span class="token function">getDateFromFormat</span><span class="token punctuation">(</span>newValue<span class="token punctuation">,</span> g_user_date_format<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<!--EndFragment-->ServiceNow features I avoid, and you should too2018-08-15T20:27:53Zhttps://jace.pro/post/2018-08-14-avoid-these-things/Jace Benson<!--StartFragment-->
<p>From time to time I get thinking about what I avoid in this system. Below are my notes.</p>
<h2>Controlling variables state with fields</h2>
<p>For example, setting the field as mandatory or readonly on<br />
<code>item_option_new</code>.</p>
<ul>
<li>
<p>Problem with this is that this is yet another place to control this. You have the following already;</p>
<ul>
<li>Variable Settings</li>
<li>Before Business Rule</li>
<li>Catalog UI Policy</li>
<li>Client Script</li>
</ul>
</li>
</ul>
<h2>Controlling fields state with fields</h2>
<p>For example, setting the field as mandatory or readonly on<br />
<code>sys_dictionary</code>.</p>
<ul>
<li>
<p>Problem with this is that this is yet another place to control this. You have the following already;</p>
<ul>
<li>Field Settings</li>
<li>Data Policy (best as it controls the field in both the backend and the front end w/a checkbox)</li>
<li>ACL ()</li>
<li>Before Business Rule</li>
<li>UI Policy</li>
<li>Client Script</li>
</ul>
</li>
</ul>
<h2>"Reverse if false" on UI Policies is sketchy!</h2>
<p>If you have UI policies condition that is based on the value of a select variable you will have problems as they will evaluate in weird ways.</p>
<p>Instead uncheck reverse if false, and make those UI Policies work well when the condition is met and abandon hope on the "Revese if false" bit.</p>
<p>Thanks Mav and Monicask</p>
<h2>Using stage fields for any logic</h2>
<p>I've found that this field is not as clearly set as you might think. So<br />
I've started to use this only for the display of the stage to the user<br />
and not for any other purpose.</p>
<h2>Putting things in workflow</h2>
<ul>
<li>Custom workflow activities (rest activity)</li>
<li>Notification activity > This is another place to configure emails but these emails are not subscribe-able, not easy to re-generate, and difficult to edit as you need to check out your workflow.</li>
<li>Switch activity > I try to minimize my need of this by keeping workflow logic concise. If that's not possible, you can always do something like <a href="https://snprotips.com/blog/2018/3/15/video-custom-output-transition-conditions-from-a-single-workflow-script-activity">this</a> ><br />
Had an issue where a workflow started with a begin then switch, and the switch did not build the context records properly so the workflow hung. Another reason to avoid Switches.</li>
</ul>
<h2>Execution Plans</h2>
<p>These were used before Workflows. At the time I used them they were loaded with a bunch of issues. Workflow has a lot more flexibility.</p>
<h2>Global Business rules</h2>
<p>These are loaded on every. single. record. They are bad, you should include the code you want to run not expect it to be available everywhere.</p>
<h2>Script includes written like Global Business rules</h2>
<p>Here this <a href="https://codecreative.io/servicenow/interface-design-patterns-for-script-includes">post</a> goes over the following patterns;</p>
<ul>
<li>Class Pattern</li>
<li>Function Pattern</li>
<li>Namespace Pattern</li>
<li>Global Include Pattern (not recommended)</li>
<li>Module Pattern</li>
</ul>
<p>Of these, I think the Function and Global Include Patterns should be avoided. The reason being is that they are really no better then a global Business Rule.</p>
<h2>Form Designer</h2>
<p>This gives generic column names to fields. Also this doesn't name sections right, so some functions like <code>g_form.setSectionDisplay('')</code> fails to work.</p>
<h2>Catalog Item Designer</h2>
<p>Issues I've been told of;</p>
<ul>
<li>No logic available. Instead of an item with two varying options that dictate logic, you'll need to make 2 different items for each set of logic.</li>
<li>Variables aren't created on item_option_new, which brings up a slew of other problems.</li>
<li>Variables can't have reference qualifiers.</li>
<li>Every change to the item, makes a new version of the item with a new sys_id so old links now no longer work.</li>
</ul>
<h2>Storing credientials in code</h2>
<p>Always store these in system properties as passwords or as credential records. If you store them in code the are in clear text and that's never a good idea. At least if you put them in a credential record or a system property additional steps have to occur to decrypt the value.</p>
<h2>Outbound Rest Records (go record-less)</h2>
<p>This is extra records to configure. More places to check for errors.</p>
<h2>Dom Manipulation</h2>
<p>These types of changes generally break on any GUI update from SN. They are also unsupported on Service portal and Mobile.</p>
<h2>Avoid using <code>$</code></h2>
<p>It's come up often enough that when folks see <code>$</code> in UI Scripts, UI Pages, and other parts of ServiceNow, they thing jQuery because that became popular and started to use that, ServiceNow assigned <code>$</code> to prototypeJS, and not jQuery, as such, I'd just spell out <code>jQuery()</code> instead to be clear about what you are expecting to use.</p>
<!--EndFragment-->London Feature: Multi-Row Variable Sets2018-08-01T20:25:42Zhttps://jace.pro/post/2018-08-01-london-variable-sets/Jace Benson<!--StartFragment-->
<p>I had to try this out and since the <a href="https://docs.servicenow.com/bundle/london-it-service-management/page/product/service-catalog-management/task/t_CreateAVariableSet.html">docs</a> doesn't show how it works here's screenshot and video.</p>
<p><img src="https://jace.pro/static/img/longon-variable-sets-1.png" alt="" /></p>
<!--StartFragment-->
<p>It's pretty neat the content if you do a <code>g_form.getValue('variableSetName');</code> is a stringified JSON array.</p>
<!--EndFragment-->
<!--StartFragment-->
<pre class="language-javascript"><code class="language-javascript">g_form<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token string">'questions'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// returns below</span><br /><span class="token comment">/*<br />"[<br /> {<br /> \"order\":\"100\",<br /> \"question\":\"What do you need help with?\",<br /> \"required\":\"Yes\",<br /> \"help_text\":\"\"<br /> }<br />]"<br />*/</span></code></pre>
<!--EndFragment-->Service Portal: Setting variables via URL2018-07-15T20:23:18Zhttps://jace.pro/post/2018-07-15-sp-set-variables-via-url/Jace Benson<!--StartFragment-->
<p>The other day, <a href="https://community.servicenow.com/community?id=community_question&sys_id=d1de646cdbc7d74423f4a345ca961916">a post was made, asking how to do this</a><br />
and I had to answer. I knew you could read the URL via <code>$window</code> but that isn't available in client scripts. How can this be done?</p>
<p>I came up with the following solution.</p>
<p>Create a Variable type "macro", with a widget that has the following client script;</p>
<!--StartFragment-->
<pre class="language-javascript"><code class="language-javascript"><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">$scope<span class="token punctuation">,</span> $window</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token comment">// This is the controller, we've included</span><br /> <span class="token comment">// $scope in the function above because</span><br /> <span class="token comment">// it's easy to work with</span><br /> <span class="token keyword">var</span> c <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">;</span><br /> <span class="token comment">// We are going to simplify accessing </span><br /> <span class="token comment">// g_form within the client script by</span><br /> <span class="token comment">// setting it as a variable named g_form</span><br /> <span class="token keyword">var</span> g_form <span class="token operator">=</span> $scope<span class="token punctuation">.</span>page<span class="token punctuation">.</span>g_form<span class="token punctuation">;</span><br /> <span class="token comment">//We are going to simplify accessing</span><br /> <span class="token comment">// g_form within the HTML by setting</span><br /> <span class="token comment">// it as a $scope attribute</span><br /> $scope<span class="token punctuation">.</span>g_form <span class="token operator">=</span> $scope<span class="token punctuation">.</span>page<span class="token punctuation">.</span>g_form<span class="token punctuation">;</span><br /> <span class="token comment">// from here you can iterate over</span><br /> <span class="token comment">// the url params;</span><br /> <span class="token keyword">var</span> params <span class="token operator">=</span> $window<span class="token punctuation">.</span>location<span class="token punctuation">.</span>href<span class="token punctuation">.</span><span class="token function">split</span><span class="token punctuation">(</span><span class="token string">'?'</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span><br /> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>params<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> paramsToString <span class="token operator">=</span> params<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> paramsArr <span class="token operator">=</span> paramsToString<span class="token punctuation">.</span><span class="token function">split</span><span class="token punctuation">(</span><span class="token string">'&'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> paramsArr<span class="token punctuation">.</span><span class="token function">map</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">keyValue</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">var</span> key <span class="token operator">=</span> keyValue<span class="token punctuation">.</span><span class="token function">split</span><span class="token punctuation">(</span><span class="token string">'='</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> value <span class="token operator">=</span> keyValue<span class="token punctuation">.</span><span class="token function">split</span><span class="token punctuation">(</span>key <span class="token operator">+</span> <span class="token string">'='</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> value <span class="token operator">=</span> <span class="token function">decodeURIComponent</span><span class="token punctuation">(</span>value<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">try</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> message <span class="token operator">=</span> <span class="token string">'Setting '</span> <span class="token operator">+</span> key <span class="token operator">+</span> <span class="token string">' to '</span><span class="token punctuation">;</span><br /> message <span class="token operator">+=</span> value <span class="token operator">+</span> <span class="token string">' from url parameter.'</span><span class="token punctuation">;</span><br /> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>message<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> $scope<span class="token punctuation">.</span>g_form<span class="token punctuation">.</span><span class="token function">setValue</span><span class="token punctuation">(</span>key<span class="token punctuation">,</span>value<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>error<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'Error setting field'</span><span class="token punctuation">,</span> error<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span></code></pre>
<!--EndFragment-->
<!--StartFragment-->
<p>This will try to set all the attributes on the form so in the following url;</p>
<p><code>https://dev32369.service-now.com/sp?id=sc_cat_item&sys_id=b480811a0f021300fc69cdbce1050ece&description=test</code></p>
<p>The following will tried to be set;</p>
<table>
<thead>
<tr>
<th>Parameter</th>
<th>Value</th>
</tr>
</thead>
<tbody>
<tr>
<td>id</td>
<td><code>sc_cat_item</code></td>
</tr>
<tr>
<td>sys_id</td>
<td><code>b480811a0f021300fc69cdbce1050ece</code></td>
</tr>
<tr>
<td>description</td>
<td><code>test</code></td>
</tr>
</tbody>
</table>
<p>P.S. Laurent Chicoine pointed out another way to do this for an individual variable. Thank you Laurent!</p>
<p>If you set the default value of the variable in question to this, then you can default it differently based on weather or not <code>$sp</code> exists.</p>
<pre class="language-javascript"><code class="language-javascript"><span class="token literal-property property">javascript</span><span class="token operator">:</span> <span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">try</span><span class="token punctuation">{</span><br /> <span class="token comment">// Service Portal</span><br /> <span class="token comment">// if $sp exists do this</span><br /> <span class="token keyword">return</span> $sp<span class="token punctuation">.</span><span class="token function">getParameter</span><span class="token punctuation">(</span><span class="token string">'var_short_description'</span><span class="token punctuation">)</span> <span class="token operator">||</span> <span class="token string">''</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">catch</span><span class="token punctuation">(</span>e<span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token comment">// UI16</span><br /> <span class="token comment">// if $sp causes an error cause its not defined do this</span><br /> <span class="token keyword">return</span> <span class="token constant">RP</span><span class="token punctuation">.</span><span class="token function">getParameterValue</span><span class="token punctuation">(</span><span class="token string">'var_short_description'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token punctuation">)</span></code></pre>
<!--EndFragment-->Service Portal: Add to cart is a PITA2018-07-15T20:20:33Zhttps://jace.pro/post/2018-07-15-sp-add-to-cart/Jace Benson<p>So it seems the first thing a lot of places have to do when setting up<br />
the service portal is to re-setup two-step-checkout.</p>
<p>I don't like looking it up. Here's the steps I've followed to set it up;</p>
<h2>Adding "Add Cart" on the form</h2>
<ol>
<li>On your catalog item widget, ctrl + right click the widget and open<br />
the widget instance options.</li>
<li>Check "Show Add Cart Button"</li>
</ol>
<p><img src="https://jace.pro/static/img/sp-add-to-cart-1.png" alt="" /></p>
<!--StartFragment-->
<h2>Adding "Cart" on the header</h2>
<ol>
<li>From the Service Portal configuration page, select the Portal editor.</li>
<li>Goto the SP Header Menu</li>
<li>in the <em>Additional options</em> section ensure you have the following content;</li>
</ol>
<!--StartFragment-->
<pre class="language-json"><code class="language-json"><span class="token punctuation">{</span><br /> <span class="token property">"enable_cart"</span><span class="token operator">:</span> <span class="token punctuation">{</span><br /> <span class="token property">"displayValue"</span><span class="token operator">:</span> <span class="token string">"true"</span><span class="token punctuation">,</span><br /> <span class="token property">"value"</span><span class="token operator">:</span> <span class="token string">"true"</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span></code></pre>
<p><a href="https://docs.servicenow.com/bundle/istanbul-servicenow-platform/page/build/service-portal/concept/enable-shopping-cart.html">Docs</a></p>
Creating actionable email links2018-07-03T20:18:31Zhttps://jace.pro/post/2018-07-03-email-links-that-do-things/Jace Benson<!--StartFragment-->
<p>The other day <a href="https://community.servicenow.com/community?id=community_question&sys_id=37113a00dbc39704d58ea345ca9619e8">Chris Perry asked</a> how to create a link in a notification to assign a record to themselves and load up the newly assigned record.</p>
<p>To do this you'd have change your email to the user, so show the link and then load a page that knew the task and have it redirect. This is what I came up with. A UI page with the following code does it.</p>
<!--EndFragment-->
<!--StartFragment-->
<pre class="language-xml"><code class="language-xml"><span class="token prolog"><?xml version="1.0" encoding="utf-8" ?></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">j:</span>jelly</span> <span class="token attr-name">trim</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>false<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xmlns:</span>j</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>jelly:core<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xmlns:</span>g</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>glide<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xmlns:</span>j2</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>null<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xmlns:</span>g2</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>null<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">g2:</span>evaluate</span> <span class="token attr-name">var</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>jvar_unwrapped_url<span class="token punctuation">"</span></span> <span class="token attr-name">jelly</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>true<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> var currentUser = gs.getUserID();<br /> var incidentFromURL = RP.getParameterValue('incident');<br /> var link = '';<br /> var incident = new GlideRecord('incident');<br /> if(incident.get('number', incidentFromURL)) {<br /> incident.setValue('assigned_to', currentUser);<br /> incident.update();<br /> gs.addInfoMessage(incident.getDisplayValue() + ' has been updated.');<br /> //gs.sendRedirect(incident.getLink());<br /> link = incident.getLink();<br /> }<br /> link || 'incident.do?sysparm_query=number=' + incidentFromURL;<br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span><span class="token namespace">g2:</span>evaluate</span><span class="token punctuation">></span></span><br /> ${gs.getMessage("Redirecting to your the incident")}...<br /><span class="token tag"><span class="token tag"><span class="token punctuation"></</span><span class="token namespace">j:</span>jelly</span><span class="token punctuation">></span></span></code></pre>
<!--EndFragment-->
<h2>Client Script</h2>
<!--StartFragment-->
<pre class="language-javascript"><code class="language-javascript">document<span class="token punctuation">.</span>location<span class="token punctuation">.</span>href <span class="token operator">=</span> <span class="token string">"$[JS:jvar_unwrapped_url]"</span><span class="token punctuation">;</span></code></pre>
<!--EndFragment-->Zing Search engine doesn't respect underscore2018-06-14T20:17:31Zhttps://jace.pro/post/2018-06-14-text-search/Jace Benson<!--StartFragment-->
<p>I opened a HI ticket about this and they communicated that the global text search does not respect more non-alphanumeric characters.</p>
<p>It turns out that the keyword search doesn't respect <code>_</code> characters.</p>
<p><br />
Meaning if you search for "<code>this_custom_word</code>" and you expect to find results, if one of those words is on the Stop list tables (<code>ts_index_stop</code>, and <code>ts_stop</code>). It may not show up.</p>
<p>Something HI made me aware of. I askd if they have other delimiters, but they said <code>_</code> and space are delimiters.</p>
<p>If I get more information I'll update this.</p>
<!--EndFragment-->Creating a ServiceNow Property Page that rocks2018-06-12T03:41:48Zhttps://jace.pro/post/2018-06-11-custom-property-page/Ben Phillips<!--StartFragment-->
<p>Sometimes you want a nice looking property page. <a href="https://community.servicenow.com/community?id=community_user_profile&user=68211265db981fc09c9ffb651f96192d">Ben Phillips</a> was nice enough to type this out in a slack channel. So I took it and put it here so I wouldn't forget.</p>
<p>It is recommended/required to create a properties page for any custom applications you may make.</p>
<h2><a href="https://jace.pro/post/2018-06-11-custom-property-page/#setting-up-the-module">Setting up the module</a></h2>
<p>Setting this up is pretty simple if you don't need anything fancy. Just point the link to "<code>system_properties_ui.do</code>" UI Page. Your link will look something like <code>system_properties_ui.do?sysparm_title=MyTitleHere&sysparm_category=MyCategoryHere</code></p>
<p><img src="https://jace.pro/static/img/custom-property-page-2.png" alt="" /></p>
<p>And the resulting properties page will look like this:</p>
<p><img src="https://jace.pro/static/img/custom-property-page-3.png" alt="" /></p>
<h2>Making a custom page</h2>
<p>What if this doesn't include all the things to verify you've configured<br />
your options, or doesn't look how you think it should? No worries.</p>
<p>You can simply make a UI Page to handle this.</p>
<p>To get your properties dynamically on your page, most of the magic is<br />
done with just one glide jelly include:</p>
<p><code><g2:system_properties_categorized category="MyCategoryHere"/></code></p>
<p>This automatically prints out some HTML with the properties and values<br />
from your property category. Since we don't have access to alter the<br />
elements this outputs and they are not styled like we want, I copied the<br />
CSS from the Style Guide and pasted them into my custom properties UI<br />
page. Here we've copied the props box styling from <code>/login.do</code>.</p>
<p>The form tag with the action and method is important because that tells<br />
the form to run <code>system_properties_update.do</code> when the user clicks Save,<br />
more OOB functionality you can't seem to touch. The referrer is also<br />
important to guide what page loads after they click save.</p>
<p>Here's an agnostic version of Ben's markup in the HTML field of my UI<br />
Page. Client Script and Processing Script panes are empty.</p>
<!--EndFragment-->
<pre class="language-xml"><code class="language-xml"><span class="token prolog"><?xml version="1.0" encoding="utf-8" ?></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">j:</span>jelly</span> <span class="token attr-name">trim</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>false<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xmlns:</span>j</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>jelly:core<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xmlns:</span>g</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>glide<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xmlns:</span>j2</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>null<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xmlns:</span>g2</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>null<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>script</span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"><br /> <span class="token comment">/* here I can script what happens onclick of the "connect" button. */</span><br /> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>script</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>style</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>text/css<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token style"><span class="token language-css"><br /> <span class="token selector">.props</span> <span class="token punctuation">{</span><br /> <span class="token property">width</span><span class="token punctuation">:</span> 34em<span class="token punctuation">;</span><br /> <span class="token property">margin</span><span class="token punctuation">:</span> 0 auto<span class="token punctuation">;</span><br /> <span class="token property">margin-top</span><span class="token punctuation">:</span> 1em<span class="token punctuation">;</span><br /> <span class="token property">padding</span><span class="token punctuation">:</span> 1em<span class="token punctuation">;</span><br /> <span class="token property">padding-top</span><span class="token punctuation">:</span> 0<span class="token punctuation">;</span><br /> <span class="token property">border</span><span class="token punctuation">:</span> 1px solid lightgrey<span class="token punctuation">;</span><br /> <span class="token property">border-radius</span><span class="token punctuation">:</span> 4px<span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token selector">#logo</span> <span class="token punctuation">{</span><br /> <span class="token property">padding</span><span class="token punctuation">:</span> 3em 1em 1em 1em<span class="token punctuation">;</span><br /> <span class="token property">margin</span><span class="token punctuation">:</span> auto<span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token selector">label</span> <span class="token punctuation">{</span><br /> <span class="token property">font-size</span><span class="token punctuation">:</span> 18px<span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token selector">input, select</span> <span class="token punctuation">{</span><br /> <span class="token property">display</span><span class="token punctuation">:</span> block<span class="token punctuation">;</span><br /> <span class="token property">width</span><span class="token punctuation">:</span> 100% <span class="token important">!important</span><span class="token punctuation">;</span> <br /> <span class="token property">height</span><span class="token punctuation">:</span> 32px<span class="token punctuation">;</span><br /> <span class="token property">padding</span><span class="token punctuation">:</span> 6px 9px<span class="token punctuation">;</span><br /> <span class="token property">font-size</span><span class="token punctuation">:</span> 13px<span class="token punctuation">;</span><br /> <span class="token property">line-height</span><span class="token punctuation">:</span> 1.42857<span class="token punctuation">;</span><br /> <span class="token property">color</span><span class="token punctuation">:</span> #343d47<span class="token punctuation">;</span><br /> <span class="token property">background-color</span><span class="token punctuation">:</span> #fff<span class="token punctuation">;</span><br /> <span class="token property">background-image</span><span class="token punctuation">:</span> none<span class="token punctuation">;</span><br /> <span class="token property">border</span><span class="token punctuation">:</span> 1px solid #bdc0c4<span class="token punctuation">;</span><br /> <span class="token property">border-radius</span><span class="token punctuation">:</span> 3px<span class="token punctuation">;</span><br /> <span class="token property">box-shadow</span><span class="token punctuation">:</span> inset 0 1px 1px <span class="token function">rgba</span><span class="token punctuation">(</span>0<span class="token punctuation">,</span> 0<span class="token punctuation">,</span> 0<span class="token punctuation">,</span> 0.075<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token property">transition</span><span class="token punctuation">:</span> border-color ease-in-out 0.15s<span class="token punctuation">,</span> box-shadow ease-in-out 0.15s<span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token selector">.center</span> <span class="token punctuation">{</span><br /> <span class="token property">display</span><span class="token punctuation">:</span> block<span class="token punctuation">;</span><br /> <span class="token property">margin-left</span><span class="token punctuation">:</span> auto<span class="token punctuation">;</span><br /> <span class="token property">margin-right</span><span class="token punctuation">:</span> auto<span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>style</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>form</span> <span class="token attr-name">action</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>system_properties_update.do<span class="token punctuation">"</span></span> <span class="token attr-name">method</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>POST<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>input</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>referer<span class="token punctuation">"</span></span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>referer<span class="token punctuation">"</span></span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>HIDDEN<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>/this_ui_pages_url.do<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>props<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>logo<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>img</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>your_logo_135w.png<span class="token punctuation">"</span></span> <span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>135<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>center<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">g2:</span>system_properties_categorized</span> <span class="token attr-name">category</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Your Property Category Name<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>form-group<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>form-field input_controls<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>button</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>listactions btn btn-primary<span class="token punctuation">"</span></span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>submit<span class="token punctuation">"</span></span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>action<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>${gs.getMessage("Save")}<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>button</span><span class="token punctuation">></span></span><br /> $[SP]$[SP]<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>button</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>btn btn-default<span class="token punctuation">"</span></span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>connect<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Test Connection<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>button</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>form</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"></</span><span class="token namespace">j:</span>jelly</span><span class="token punctuation">></span></span></code></pre>
<!--StartFragment-->
<p><img src="https://jace.pro/static/img/custom-property-page-1.png" alt="" /></p>
<p>Special thanks to <a href="https://community.servicenow.com/community?id=community_user_profile&user=68211265db981fc09c9ffb651f96192d">Ben Phillips</a> and @nabil for the work on this.</p>
<!--EndFragment-->How to do reminders in ServiceNow2018-06-07T03:40:16Zhttps://jace.pro/post/2018-06-06-email-scheduled-reminders/Jace Benson<!--StartFragment-->
<p>This has come up often enough that it merits a post. Reminders of sorts can be set up a four ways in ServiceNow. This is the pros and cons of each.</p>
<p>There's a four ways I know of doing this;</p>
<ul>
<li>Scheduled Report</li>
<li>SLA Notifications</li>
<li>Scheduled Job (much like incident auto close)</li>
<li>Scheduled Events</li>
</ul>
<p>Each of these have their pro's and con's, lets get into it.</p>
<h2>Scheduled Report</h2>
<p>Probably the easiest to set up as it requires a report, and a scheduled report.</p>
<table>
<thead>
<tr>
<th>Pro</th>
<th>Con</th>
</tr>
</thead>
<tbody>
<tr>
<td>A Report, and Scheduled Report</td>
<td>Occurs at the frequency it scheduled</td>
</tr>
<tr>
<td>No coding required</td>
<td>Less configurable</td>
</tr>
<tr>
<td>No email template to set up</td>
<td>Email is set based on report sharing</td>
</tr>
</tbody>
</table>
<h2>SLA Notifications</h2>
<table>
<thead>
<tr>
<th>Pro</th>
<th>Con</th>
</tr>
</thead>
<tbody>
<tr>
<td>No coding required</td>
<td>Occurs at the frequency it scheduled</td>
</tr>
<tr>
<td></td>
<td>Specific to tasks</td>
</tr>
</tbody>
</table>
<h2>Scheduled Job</h2>
<table>
<thead>
<tr>
<th>Pro</th>
<th>Con</th>
</tr>
</thead>
<tbody>
<tr>
<td>Requires Scheduled Job, Event, Notification</td>
<td>Occurs at the frequency it scheduled</td>
</tr>
<tr>
<td>Configurable due to coding</td>
<td>Requires coding</td>
</tr>
</tbody>
</table>
<h2>Scheduled Events</h2>
<table>
<thead>
<tr>
<th>Pro</th>
<th>Con</th>
</tr>
</thead>
<tbody>
<tr>
<td>Triggers when it's supposed to</td>
<td>Requires Event, Notification, Business Rules, and possibly it's own event queue</td>
</tr>
<tr>
<td>Configurable</td>
<td>Requires coding</td>
</tr>
<tr>
<td></td>
<td>Requires managing the scheduled events if the date/time changes</td>
</tr>
</tbody>
</table>
<h2>Scheduled Flow Trigger</h2>
<table>
<thead>
<tr>
<th>Pro</th>
<th>Con</th>
</tr>
</thead>
<tbody>
<tr>
<td>Access be delegated using Scoped App and Flow Designer content filtering</td>
<td>Delegates can reak havoc, shouldn't create them directly in prod.</td>
</tr>
</tbody>
</table>
<p>Thansks @milligna!</p>
<!--EndFragment-->Search trick on table2018-05-26T03:38:48Zhttps://jace.pro/post/2018-05-25-table-trick/Jace Benson<!--StartFragment-->
<p>During one the Let's code happy hours, Josh Nerius made a point to call out this tip while looking for a table.</p>
<p>If you are used to typing <code>sys_user</code> or <code>user</code> and then scrolling and picking the table, this will save time. Try typing <code>[sys_user]</code> instead as it will have an better match.</p>
<!--EndFragment-->Slightlooney2018-05-25T03:37:07Zhttps://jace.pro/post/2018-05-24-slightlylooney/Jace Benson<!--StartFragment-->
<p>A long time ago a man called "<a href="https://community.servicenow.com/community?id=community_user_profile&user=6d5e8ae5dbd41fc09c9ffb651f96191a">SlightlyLooney</a>" used to write posts about some pretty awesome things.<br />
I took some time a few weeks ago and made a list of his posts I rather enjoyed and thought other's might find these posts useful. Without further ado;</p>
<h2>Posts</h2>
<ul>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=ac5e2aaddbd0dbc01dcaf3231f961941">Why setters and getter are important</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=a60e2e2ddbd0dbc01dcaf3231f961931">JS Question how do parseInt work</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=b14d2229dbd0dbc01dcaf3231f961917">String Coercion</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=55bd6aa9dbd0dbc01dcaf3231f961900">Boolean Coercion</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=e35c6aa1dbd0dbc01dcaf3231f961941">JSUtil pitch</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=9e2e2a6ddbd0dbc01dcaf3231f96190b">How business rules used to be cluttering global</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=067c62e1dbd0dbc01dcaf3231f9619e5">How packages used to be</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=ee7ca2e1dbd0dbc01dcaf3231f9619be">JS Undefined</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=9adce665dbd0dbc01dcaf3231f9619f7">Weirdness with Java Strings coming into things</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=5d1deea5dbd0dbc01dcaf3231f961968">GlideAggregate goodness</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=b5cc2265dbd0dbc01dcaf3231f9619c3">AddQuery using dot walking</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=7fcce265dbd0dbc01dcaf3231f9619ad">Dedupe array by using object</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=8c0e2a2ddbd0dbc01dcaf3231f961941">Closures</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=a56ceaa1dbd0dbc01dcaf3231f9619fc">Function to take any num of arguments</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=ca2ea66ddbd0dbc01dcaf3231f9619c2">Chunking work in gliderecords</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=adcd22e9dbd0dbc01dcaf3231f96194a">DeleteRecord and deleteMultiple</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=05cc2265dbd0dbc01dcaf3231f961918">How sys_id is determined</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=aadc2a65dbd0dbc01dcaf3231f96196c">Typeof and instanceof</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=518d2669dbd0dbc01dcaf3231f9619b2">Representing things in js p1</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=decc6265dbd0dbc01dcaf3231f9619eb">Representing things in js p2</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=c1bd2aa9dbd0dbc01dcaf3231f9619fe">For in loops</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=b5bcea25dbd0dbc01dcaf3231f9619b2">Global br vs script include</a></li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide">JS Guide</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=7e8de669dbd0dbc01dcaf3231f96195d">Mid Server Heartbeats</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=1d1deea5dbd0dbc01dcaf3231f961967">More weirdness with Java Strings</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=3f5c6aa1dbd0dbc01dcaf3231f961987">Javascript semicolon insertion</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=c1fca2a5dbd0dbc01dcaf3231f961961">More GlideAggregate</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=7bbd6ea9dbd0dbc01dcaf3231f9619cc">Variable Scoping</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=e94deee5dbd0dbc01dcaf3231f9619be">Array goodness</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=00ccae25dbd0dbc01dcaf3231f9619ff">Regex Series p1</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=3a3deae5dbd0dbc01dcaf3231f9619e3">Regex Series p2</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=0eac2625dbd0dbc01dcaf3231f9619a6">Regex Series p3</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=917dee29dbd0dbc01dcaf3231f9619aa">Regex Series p4</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=91bd6aa9dbd0dbc01dcaf3231f961981">Regex Series p5</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=290daaa5dbd0dbc01dcaf3231f961981">Regex Series p6</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=289ceae1dbd0dbc01dcaf3231f96192e">Jelly 01</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=517dee29dbd0dbc01dcaf3231f961926">Jelly 02</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=15bd2aa9dbd0dbc01dcaf3231f9619ff">Jelly 03</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=a83eea6ddbd0dbc01dcaf3231f9619da">Jelly 04</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=cafce2a5dbd0dbc01dcaf3231f9619c4">Jelly 05</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=3fcce265dbd0dbc01dcaf3231f9619ac">Jelly 06</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=6cecea65dbd0dbc01dcaf3231f961961">Jelly 07</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=168da669dbd0dbc01dcaf3231f96198a">Jelly 08</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=ae7ca2e1dbd0dbc01dcaf3231f9619bd">Jelly 09</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=049d6a69dbd0dbc01dcaf3231f96195d">Jelly 10</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=91ada2a9dbd0dbc01dcaf3231f961914">Jelly 11</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=b84ee2addbd0dbc01dcaf3231f961903">Jelly 12</a></li>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=613daae5dbd0dbc01dcaf3231f961947">Jelly 13</a></li>
</ul>
<!--EndFragment-->Prepare for an interview - it'll be fun2018-05-18T03:32:15Zhttps://jace.pro/post/2018-05-16-interview/Jace Benson<!--StartFragment-->
<p>This is a extensive list of questions for both interviewers and interviewees when ServiceNow Development is involved.</p>
<h1>Interview Preparation</h1>
<p>Interviewing is exciting. It's a way to get uncomfortable and see what is available in job-land. Something to keep in mind, interviews are a way for you and your employer to find a great fit for this position. <br />
The employer may be happy to have you, but you may not be happy in that position, so it's crucial to get information from the interview to tell you about the technology, team, and the expectations they'll have. The expectations should have been set on the job posting, but it's good to ask specifics about any you question. With that being said, when the technical questions are being asked, you should be able to see they understand the question and answer.</p>
<p>Interviews... You want to interview for a job as a ServiceNow Developer.</p>
<h2>Before you continue I urge you to read this first</h2>
<p><a href="https://www.kalzumeus.com/2012/01/23/salary-negotiation/">https://www.kalzumeus.com/2012/01/23/salary-negotiation/</a></p>
<h2>Questions to ask the interviewer</h2>
<h3>Technology Questions</h3>
<ol>
<li>What release are you folks on?</li>
<li>How many licensed users are on the environment?</li>
<li>What are next major initiatives of the team?</li>
<li>What is your role in relation to the team?</li>
<li>How many people are on the team I'll be working on?</li>
<li>What is the team culture like?</li>
<li>How does your team communicate and share ideas/files/code/assist one<br />
another?</li>
</ol>
<h3>Getting Expectations Questions</h3>
<ol>
<li>What is the release process/schedule here?</li>
<li>Would the duties in this position require me to be on-call in any capacity?</li>
<li>Is this a work from home position or does it have this as a full or part time option?</li>
<li>What role would I be filling?</li>
</ol>
<h2>Questions to be prepared to answer</h2>
<h3>Behavioral Questions</h3>
<ol>
<li>Tell me about a time you've had to do something you disagreed with and how that interaction went.</li>
<li>Tell me about a time you've had been asked to fulfill a requirement and you went above and beyond.</li>
<li>Tell me about a time you've made a commitment and then failed to deliver.</li>
<li>Tell us about a project that didn't have a positive outcome and how you handled the situation.</li>
<li>How would you handle a complaint brought to your attention?</li>
<li>What do you see that would be challenges working here?</li>
<li>Why should we hire you over the next candidate?</li>
<li>Why do you want to work here?</li>
<li>Have you worked on a on-call capacity before?</li>
<li>How do you educate yourself?</li>
</ol>
<h3>Technical Questions</h3>
<h4>General Programming Questions</h4>
<p>In all my interviews, I think I've only had a few of these, however they show up all the time on GlassDoor.</p>
<ol>
<li>How do you iterate over an array?</li>
<li>How can you give an object a dynamic property?</li>
<li>Given an array as an input: [1,2,3,4,5], return an array of modified values * 2 [1,4,6,8,10] e.g.</li>
<li>Sum the first n Fibonacci numbers [0,1,1,2,34,8,13,21,34,55,89,144,...]</li>
<li>find the first non repeating character from the string. e.g. [aaabbbcccdeee] returns d</li>
<li>Write javascript function for add(3)(4);? <code>function(a,b){return a+b;}</code></li>
<li>Given a list 1,0,3,5,0,0,34,5,0,36 push all the zeroes to the end. Develop an in-place algorithm</li>
<li>How to Split a string <code>var str = 'Left Right';str.split(' ');</code></li>
<li>Print integers 1-100 except for multiples of 3, print "Fizz", multiples of 5 print "Buzz", multiples of both print "FizzBuzz"</li>
<li>You have a function rand7() that generates a random integer from 1 to 7. Use it to write a function rand5() that generates a random integer from 1 to 5.</li>
</ol>
<h4>Javascript Questions</h4>
<ol>
<li>What are the primitive types of JavaScript?</li>
<li>What's the difference between a Value and a Reference?</li>
<li>What is variable hoisting?</li>
<li>Closures --- Know that a function retains access to the scope that it was created in. Know what this lets us do, such as data hiding, memoization, and dynamic function generation.</li>
<li><code>this</code> --- Know the rules of this binding. Know how it works, know how to figure out what it will be equal to in function, and know why it's useful.</li>
<li><code>new</code> --- Know how it relates to object oriented programming. Know what happens to a function called with new. Understand how the object generated by using new inherits from the function's prototype property.</li>
<li><code>apply</code>, <code>call</code>, <code>bind</code> --- Know how each of these functions work. Know how to use them. Know what they do to this.</li>
<li>Prototypes & Inheritance --- Understand that inheritance in JavaScript works through the [[Prototype]] chain. Understand how to set up inheritance through functions and objects and how new helps us implement it. Know what the <strong>proto</strong> and prototype properties are and what they do.</li>
<li>Asynchronous JS --- Understand the event loop. Understand how the browser deals with user input, web requests, and events in general. Know how to recognize and correctly implement asynchronous code. Understand how JavaScript is both asynchronous and single-threaded.</li>
<li>Higher Order Functions --- Understand that functions are first-class objects in JavaScript and what that means. Know that returning a function from another function is perfectly legal. Understand the techniques that closures and higher order functions allow us to use.</li>
<li>Understand how objects, arrays, and functions are copied and passed into functions. Know that the reference is what's being copied. Understand that primitives are copied and passed by copying the value.</li>
<li>What's the difference between global scope, function scope, and block scope?</li>
<li>Understand which variables are available where. Know how the JavaScript engine performs a variable lookup.</li>
<li>Understand that variable and function declarations are hoisted to the top of their available scope. Understand that function expressions are not hoisted.</li>
<li>Difference between <code>==</code> and <code>===</code></li>
</ol>
<h4>CSS Questions</h4>
<ol>
<li>What is the difference between display:none and visibility:hidden?</li>
<li>What can you tell me about Bootstrap?</li>
</ol>
<h4>XML Questions</h4>
<ol>
<li>What is XML?</li>
<li>What is XPath?</li>
</ol>
<h4>Web Services Questions</h4>
<ol>
<li>What is REST?</li>
<li>What is SOAP?</li>
<li>What protocol does REST use?</li>
<li>What are the differences between REST and SOAP?</li>
</ol>
<h4>ServiceNow Service Catalog Questions</h4>
<ol>
<li>What does Order guide refer to in Service Catalog?</li>
<li>What is the use of an Order Guide?</li>
<li>How will you define a Service catalog workflow?</li>
<li>What is a Content Item of service catalog?</li>
<li>What Service catalog displays?</li>
<li>Tell me about some Service catalog variable types.</li>
<li>What is workflow in relation to the catalog items and when it will<br />
execute?</li>
<li>What is represented by order in Service catalog?</li>
<li>What is Catalog request workflow?</li>
<li>Which module is used for create a new Catalog item?</li>
<li>What is types of things are generally on a catalog?</li>
</ol>
<h4>ServiceNow Workflow Questions</h4>
<ol>
<li>Where are workflow versions captured?</li>
<li>If workflow is not published, only checked out will it be captured in update sets?</li>
<li>What does workflow timelines represent?</li>
<li>If prefix of Incident (e.g. INC) needs to be changed, how would I do that?</li>
<li>Workflow editor and Service catalog differs in approval methodology? YES/NO, If yes, give explanation.</li>
<li>Can we validate workflow before publish?</li>
<li>If workflow checked out, can it be modified by any user? If yes or no, how?</li>
<li>What is true about Service catalog variables?</li>
<li>What is the true about SlushBucket?</li>
<li>Can you restart a workflow at a specific activity?</li>
</ol>
<h4><a href="https://jace.pro/post/2018-05-16-interview/#servicenow-update-sets-questions">ServiceNow Update Sets Questions</a></h4>
<ol>
<li>Which field should be there in table that identifies that it should be captured in Update Sets?</li>
<li>Where are customizations stored?</li>
<li>What things are tracked in customizations?</li>
<li>What is the use of an Update Set?</li>
<li>Where update sets are stored?</li>
<li>What changes out of below would be applied in case of a merge update set?</li>
<li>What changes are not captured in update sets?</li>
</ol>
<h4>ServiceNow Email Questions</h4>
<ol>
<li>What is the default email size limit of inbound emails?</li>
<li>How ServiceNow system is configured to send an email notification after system Upgrade?</li>
<li>What all actions can be performed with inbound email?</li>
</ol>
<h4>ServiceNow GUI Questions</h4>
<ol>
<li>Scenario when an Interceptor can be used?</li>
<li>How to make an UI Policy global?</li>
<li>Button, Related Links and Context Menu these are?</li>
<li>How to define field attributes?</li>
<li>When does the "Submit" button appear on a form?</li>
<li>When do "UI Actions" appear on the form?</li>
<li>In which part of UI will you find help (link to wiki) option?</li>
<li>What is Icon of reference?</li>
<li>How to set display value for any field</li>
<li>If User customizes the Homepage, what happens?</li>
<li>How to change background color?</li>
<li>After save on form, which fields get stored in activities log?</li>
<li>Global Search option can be found in which part of UI?</li>
<li>How applications appear?</li>
<li>How do you modify the field behavior?</li>
<li>How do you enhance Homepage performance in case of gauges?</li>
<li>Where will you find option to edit a list?</li>
<li>What is listing in HomePage icon?</li>
<li>How to change the Development and Production instance color?</li>
<li>In which place admin can edit the HomePage?</li>
</ol>
<h4>ServiceNow Security Questions</h4>
<ol>
<li>What is security_admin role?</li>
<li>What do you mean by Elevated Privileges?</li>
<li>Why we need to impersonate?</li>
<li>If a user is not given filter_global or filter_admin role, what will be the impact?</li>
<li>ACLs can evaluate on what types of things?</li>
<li>How do ACLs executes, what are the steps they check?</li>
<li>ACL applies on?</li>
<li>In Service now which role is get option for approval a request or<br />
same etc.?</li>
<li>What is a SSO integration?</li>
<li>What is Delegate User?</li>
</ol>
<h4>ServiceNow Database/Integrations Questions</h4>
<ol>
<li>What is Coalesce in import set?</li>
<li>Which is parent table for INC, CHG, PRB?</li>
<li>DB name for custom table?</li>
<li>Example for One to many relationship in table?</li>
<li>What is a Column and row in a table?</li>
<li>What is there stored in CMDB?</li>
<li>Where is data stored?</li>
<li>How can you import data into ServiceNow?</li>
<li>What is a sys_id?</li>
<li>Which module is used to see column structure in a table?</li>
</ol>
<h4>ServiceNow Service Level Agreement Questions</h4>
<ol>
<li>What is SLA-Retroactive start?</li>
<li>What is Pause condition in SLA?</li>
<li>What is Table for SLA task?</li>
<li>What is Table for SLA Definitions?</li>
<li>SLA, OLA and UC are configured in which module?</li>
<li>What is the benefit of SLA?</li>
</ol>
<h4>ServiceNow Other</h4>
<ol>
<li>How to arrange the Applications in left navigation to user?</li>
<li>How to see the current version of instance as an Admin?</li>
<li>Where can scripting occur in ServiceNow?</li>
<li>What is the difference between GlideRecord and GlideAggregate</li>
<li>Can you describe the different types of business rules?</li>
<li>What is the difference between a UI policy and UI action?</li>
</ol>
<h2>Inspired by</h2>
<ul>
<li><a href="https://www.servicenowguru.com/showcase/service-now-jedi/">Are YOU a ServiceNow jedi?</a></li>
<li><a href="https://tekslate.com/servicenow-interview-questions-and-answers">ServiceNow Interview Question & Answers</a></li>
<li><a href="https://servicenowstar.wordpress.com/2016/03/13/servicenow-intertview-question-anwers/">servicenowstar</a></li>
</ul>
<!--EndFragment-->Debugging with fix scripts2018-05-14T03:26:49Zhttps://jace.pro/post/2018-05-13-debugging/Jace Benson<!--StartFragment-->
<p>Debugging for me always starts with isolating the parts of the failing code.</p>
<p>The quickest way for me to find the issue varies but it almost always includes some variation of order of some of these;</p>
<table>
<thead>
<tr>
<th>Question</th>
<th>Debugging Tool</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>Any errors or logs?</td>
<td>System Log</td>
<td>Navigate to System Logs > System Log. You can place alert statements in your business rule which can write information to the log.</td>
</tr>
<tr>
<td>Any errors or logs?</td>
<td>Debug Business Rule (Details)</td>
<td>Navigate to System Diagnostics > Debug Business Rule (Details). This debugging module displays the results business rules. Use this module to see if conditions are being met and values are being set as expected.</td>
</tr>
<tr>
<td>Did anything about this change?</td>
<td><code>sys_update_xml</code> record list</td>
<td></td>
</tr>
<tr>
<td>Can you reproduce the problem?</td>
<td>Background Scripts / Fix Scripts</td>
<td>See <a href="https://jace.pro/post/2018-05-13-debugging/#simulating-the-script">Simulating the Script</a></td>
</tr>
</tbody>
</table>
<h2>Simulating the script</h2>
<p>Different area's have different variables available to them;</p>
<p>I'd copy the appropriate script, and then paste your code in the run function.</p>
<h2>Business Rules</h2>
<!--EndFragment-->
<pre class="language-javascript"><code class="language-javascript"><span class="token keyword">var</span> table <span class="token operator">=</span> <span class="token string">'incident'</span><span class="token punctuation">;</span><span class="token comment">//pick a table here</span><br /><span class="token keyword">var</span> sysId <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">;</span><span class="token comment">//pick a record with a sysid here</span><br /><br /><span class="token keyword">var</span> current <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span>table<span class="token punctuation">)</span><span class="token punctuation">;</span><br />current<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>sysId<span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token keyword">var</span> previous <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span>table<span class="token punctuation">)</span><span class="token punctuation">;</span><br />previous<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>sysId<span class="token punctuation">)</span><span class="token punctuation">;</span><br /><br /><span class="token keyword">try</span> <span class="token punctuation">{</span><br /> <span class="token comment">// paste your code below here</span><br /><br /> <span class="token comment">// paste your code above here</span><br /><span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>error<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> gs<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span>error<span class="token punctuation">.</span>message<span class="token punctuation">,</span> <span class="token string">"fix script "</span> <span class="token operator">+</span> gs<span class="token punctuation">.</span><span class="token function">getUserName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span></code></pre>
<h2>Inbound Emails</h2>
<pre class="language-javascript"><code class="language-javascript"><span class="token keyword">var</span> emailSysId <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">;</span><span class="token comment">//pick a sys_email record's sysid here</span><br /><br /><span class="token keyword">var</span> email <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'sys_email'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token keyword">if</span><span class="token punctuation">(</span>email<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>emailSysId<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">var</span> current <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span>email<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token string">'target_table'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> current<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>email<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token string">'instance'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> email<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token string">'body_text'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">split</span><span class="token punctuation">(</span><span class="token string">'\n'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">map</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">line</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">var</span> lineArray <span class="token operator">=</span> line<span class="token punctuation">.</span><span class="token function">split</span><span class="token punctuation">(</span><span class="token string">':'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> email<span class="token punctuation">[</span>lineArray<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">=</span> lineArray<span class="token punctuation">.</span><span class="token function">pop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token string">':'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span><br /><span class="token keyword">var</span> event <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span><br /><span class="token keyword">try</span> <span class="token punctuation">{</span><br /> <span class="token comment">// paste your code below here</span><br /><br /> <span class="token comment">// paste your code above here</span><br /><span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>error<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> gs<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span>error<span class="token punctuation">.</span>message<span class="token punctuation">,</span> <span class="token string">"fix script "</span> <span class="token operator">+</span> gs<span class="token punctuation">.</span><span class="token function">getUserName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span></code></pre>
<h2>Script Actions</h2>
<pre class="language-javascript"><code class="language-javascript"><span class="token keyword">var</span> eventSysId <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">;</span><span class="token comment">//pick a sysevent record's sysid here</span><br /><br /><span class="token keyword">var</span> event <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'sysevent'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token keyword">if</span><span class="token punctuation">(</span>event<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>eventSysId<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">var</span> current <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span>event<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token string">'table'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> current<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>event<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token string">'instance'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span><br /><br /><span class="token keyword">try</span> <span class="token punctuation">{</span><br /> <span class="token comment">// paste your code below here</span><br /><br /> <span class="token comment">// paste your code above here</span><br /><span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>error<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> gs<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span>error<span class="token punctuation">.</span>message<span class="token punctuation">,</span> <span class="token string">"fix script "</span> <span class="token operator">+</span> gs<span class="token punctuation">.</span><span class="token function">getUserName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span></code></pre>
<h2>Workflow Activity</h2>
<pre class="language-javascript"><code class="language-javascript"><span class="token keyword">var</span> workflowContextSysId <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">;</span><br /><span class="token keyword">var</span> workflowContext <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'wf_context'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token keyword">if</span><span class="token punctuation">(</span>workflowContext<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>workflowContextSysId<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">var</span> current <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span>workflowContext<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token string">'table'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> current<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>workflowConext<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token string">'id'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> workflow <span class="token operator">=</span> <span class="token punctuation">{</span><br /> <span class="token literal-property property">scratchpad</span><span class="token operator">:</span> <span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">parse</span><span class="token punctuation">(</span>workflowContext<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token string">'scratchpad'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span><br /><br /><span class="token keyword">try</span> <span class="token punctuation">{</span><br /> <span class="token comment">// paste your code below here</span><br /><br /> <span class="token comment">// paste your code above here</span><br /><span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>error<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> gs<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span>error<span class="token punctuation">.</span>message<span class="token punctuation">,</span> <span class="token string">"fix script "</span> <span class="token operator">+</span> gs<span class="token punctuation">.</span><span class="token function">getUserName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span></code></pre>
<h2>Transform Scripts</h2>
<pre class="language-javascript"><code class="language-javascript"><span class="token keyword">var</span> importSetRowSysId <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">;</span><span class="token comment">//sysid from your import table</span><br /><span class="token keyword">var</span> targetTable <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">;</span><span class="token comment">// table to set the field on</span><br /><span class="token keyword">var</span> targetSysId <span class="token operator">=</span> <span class="token keyword">null</span><span class="token punctuation">;</span> <span class="token comment">// doesn't need to be set but if you know the record, you can set this sysid</span><br /><br /><span class="token keyword">var</span> importTable <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'sys_import_set_row'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token keyword">if</span><span class="token punctuation">(</span>importTable<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>importSetRowSysId<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">var</span> source <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span>importTable<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token string">'sys_class_name'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> source<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>importTable<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token string">'sys_id'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> target <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span>targetTable<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span><span class="token punctuation">(</span>targetSysId <span class="token operator">!=</span> <span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> target<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>targetSysId<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><br /> target<span class="token punctuation">.</span><span class="token function">newRecord</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span><br /><br /><span class="token keyword">try</span> <span class="token punctuation">{</span><br /> <span class="token comment">// paste your code below here (source, and target are set up from above)</span><br /><br /> <span class="token comment">// paste your code above here</span><br /><span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>error<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> gs<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span>error<span class="token punctuation">.</span>message<span class="token punctuation">,</span> <span class="token string">"fix script "</span> <span class="token operator">+</span> gs<span class="token punctuation">.</span><span class="token function">getUserName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span></code></pre>
<h2>Relationship Scripts</h2>
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">/* global GlideAggregate, GlideRecord, gs */</span><br /><span class="token keyword">var</span> parent <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//applies to table</span><br />parent<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'ad6ce161db560740d9ca72ec0f9619f5'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//specific record to test.</span><br /><span class="token keyword">var</span> current <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'task'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//queries from table</span><br /><span class="token comment">//set the above gr's to have access like you would on the form.</span><br /><br /><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token function">refineQuery</span> <span class="token punctuation">(</span><span class="token parameter">current<span class="token punctuation">,</span> parent</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">try</span> <span class="token punctuation">{</span><br /> <span class="token comment">// paste your code below here</span><br /><br /> <span class="token comment">// paste your code above here</span><br /> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>error<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> gs<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span>error<span class="token punctuation">.</span>message<span class="token punctuation">,</span> <span class="token string">"relationship "</span> <span class="token operator">+</span> gs<span class="token punctuation">.</span><span class="token function">getUserName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">(</span>current<span class="token punctuation">,</span> parent<span class="token punctuation">)</span><span class="token punctuation">;</span><br />current<span class="token punctuation">.</span><span class="token function">query</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<!--EndFragment-->
<h2>Mail Scripts</h2>
<pre class="language-javascript"><code class="language-javascript"><span class="token keyword">var</span> table <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">;</span><span class="token comment">//set the current table name</span><br /><span class="token keyword">var</span> sysid <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">;</span><span class="token comment">//set the current sysid</span><br /><span class="token keyword">var</span> eventsysid <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">;</span><span class="token comment">//set to the event sysid on a past sysevent</span><br /><span class="token comment">//current, template, email, email_action, event</span><br /><span class="token keyword">var</span> event<span class="token punctuation">;</span><br /><span class="token keyword">if</span><span class="token punctuation">(</span>eventsysid<span class="token punctuation">.</span>length<span class="token operator">></span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> event <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'sysevent'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> event<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>eventsysid<span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span><br /><span class="token keyword">var</span> current <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span>table<span class="token punctuation">)</span><span class="token punctuation">;</span><br />current<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>sysid<span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token keyword">var</span> template <span class="token operator">=</span> <span class="token punctuation">{</span><br /> <span class="token function-variable function">print</span><span class="token operator">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">text</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> gs<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span>text<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token function-variable function">space</span><span class="token operator">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">num</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">var</span> returnStr <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">;</span><br /> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">var</span> x<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>x<span class="token operator"><</span>num<span class="token punctuation">;</span>x<span class="token operator">++</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> returnStr <span class="token operator">+=</span> <span class="token string">' '</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">return</span> returnStr<span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span><br /><span class="token keyword">var</span> email <span class="token operator">=</span> <span class="token punctuation">{</span><br /> <span class="token function-variable function">addAddress</span><span class="token operator">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token function-variable function">setBody</span><span class="token operator">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token function-variable function">setFrom</span><span class="token operator">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token function-variable function">setReplyTo</span><span class="token operator">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">reply</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> gs<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span><span class="token string">'Set ReplyTo: '</span> <span class="token operator">+</span> reply<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token function-variable function">setSubject</span><span class="token operator">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">subj</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> gs<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span><span class="token string">'Set Subject to: '</span> <span class="token operator">+</span> subj<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token function-variable function">addAddress</span><span class="token operator">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">a<span class="token punctuation">,</span>b<span class="token punctuation">,</span>c</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token comment">//doing nothing this is a placeholder</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token function">setBody</span><span class="token punctuation">(</span><span class="token parameter">html</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> gs<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span>html<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span><span class="token punctuation">;</span><br /><span class="token keyword">try</span> <span class="token punctuation">{</span><br /> <span class="token comment">// paste your code below here</span><br /><br /> <span class="token comment">// paste your code above here</span><br /><span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>error<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> gs<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span>error<span class="token punctuation">.</span>message<span class="token punctuation">,</span> <span class="token string">"relationship "</span> <span class="token operator">+</span> gs<span class="token punctuation">.</span><span class="token function">getUserName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span></code></pre>
<h2>Debugging Tools</h2>
<!--StartFragment-->
<table>
<thead>
<tr>
<th>Debugging Tool</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>System Dictionary</td>
<td>Navigate to System Definition > Dictionary. The dictionary provides a list of all tables within your instance and can be invaluable when trying to locate information. One example is verifying the column exists on the table or a parent table of your record.</td>
</tr>
<tr>
<td>System Log</td>
<td>Navigate to System Logs > System Log. You can place alert statements in your business rule which can write information to the log.</td>
</tr>
<tr>
<td>Debug Business Rule (Details)</td>
<td>Navigate to System Diagnostics > Debug Business Rule (Details). This debugging module displays the results business rules. Use this module to see if conditions are being met and values are being set as expected.</td>
</tr>
<tr>
<td>Alert Messages</td>
<td>There are system functions that allow you to print messages to the page, the field or the log file. See Scripting alert, info, and error messages.</td>
</tr>
<tr>
<td>Business Rule Examples</td>
<td>Sometimes you can find what you're looking for in scripts others have written, including business rule error messages, or by building an OR query.</td>
</tr>
<tr>
<td>GlideRecord Information</td>
<td>This is the basic syntax used to query the database for information. See Using GlideRecord to query tables. GlideRecord also includes aggregation support.</td>
</tr>
</tbody>
</table>
<!--EndFragment-->Create Item from Script2018-05-14T03:20:00Zhttps://jace.pro/post/2018-05-12-create-item-from-script/Jace Benson<!--StartFragment-->
<p>I made this a while ago to save me some time of having to interact with the GUI. Works well enough, and will get updates to become a scoped app or script include... It's a start.</p>
<p>Toss it in a fix script and adjust the bottom to your details while in the correct scope/update set. Then you have to figure out containers.</p>
<!--EndFragment-->
<pre class="language-javascript"><code class="language-javascript"><span class="token keyword">function</span> <span class="token function">createCatalog</span><span class="token punctuation">(</span><span class="token parameter">name</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token comment">/*<br /> * Expecting a string (name)<br /> */</span><br /> <span class="token keyword">var</span> catalogExists <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'sc_catalog'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> catalogExists<span class="token punctuation">.</span><span class="token function">addQuery</span><span class="token punctuation">(</span><span class="token string">'title'</span><span class="token punctuation">,</span> name<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> catalogExists<span class="token punctuation">.</span><span class="token function">query</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>catalogExists<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">return</span> catalogExists<span class="token punctuation">.</span>sys_id<span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> sc_catalog <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'sc_catalog'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> sc_catalog<span class="token punctuation">.</span><span class="token function">initialize</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> sc_catalog<span class="token punctuation">.</span>description <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">;</span><br /> <span class="token comment">//sc_catalog.sys_name = name;</span><br /> sc_catalog<span class="token punctuation">.</span>title <span class="token operator">=</span> name<span class="token punctuation">;</span><br /> sc_catalog<span class="token punctuation">.</span>active <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span><br /> <span class="token keyword">return</span> sc_catalog<span class="token punctuation">.</span><span class="token function">insert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span><br /><br /><span class="token keyword">function</span> <span class="token function">createCategory</span><span class="token punctuation">(</span><span class="token parameter">name<span class="token punctuation">,</span> catalogId</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token comment">/*<br /> * Expecting a string (name)<br /> * Expecting a string (catalogId)<br /> */</span><br /> <span class="token keyword">var</span> categoryExists <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'sc_catalog'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> categoryExists<span class="token punctuation">.</span><span class="token function">addQuery</span><span class="token punctuation">(</span><span class="token string">'title'</span><span class="token punctuation">,</span> name<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> categoryExists<span class="token punctuation">.</span><span class="token function">query</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>categoryExists<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">return</span> categoryExists<span class="token punctuation">.</span>sys_id<span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> sc_category <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'sc_category'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> sc_category<span class="token punctuation">.</span><span class="token function">initialize</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> sc_category<span class="token punctuation">.</span>sc_catalog <span class="token operator">=</span> catalogId<span class="token punctuation">;</span><br /> sc_category<span class="token punctuation">.</span>sys_name <span class="token operator">=</span> name<span class="token punctuation">;</span><br /> sc_category<span class="token punctuation">.</span>title <span class="token operator">=</span> name<span class="token punctuation">;</span><br /> <span class="token keyword">return</span> sc_category<span class="token punctuation">.</span><span class="token function">insert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span><br /><br /><span class="token keyword">function</span> <span class="token function">createItem</span><span class="token punctuation">(</span><span class="token parameter">itemObj<span class="token punctuation">,</span> categoryId<span class="token punctuation">,</span> catalogId</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token comment">/*<br /> * Expecting an object (itemObj)<br /> * name<br /> * short_description<br /> * .<br /> * Expecting a string (categoryId)<br /> * Expecting a string (catalogId)<br /> */</span><br /> <span class="token keyword">var</span> itemExists <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'sc_cat_item'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> itemExists<span class="token punctuation">.</span><span class="token function">addQuery</span><span class="token punctuation">(</span><span class="token string">'name'</span><span class="token punctuation">,</span> itemObj<span class="token punctuation">.</span>name<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> itemExists<span class="token punctuation">.</span><span class="token function">addQuery</span><span class="token punctuation">(</span><span class="token string">'category'</span><span class="token punctuation">,</span> categoryId<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> itemExists<span class="token punctuation">.</span><span class="token function">addQuery</span><span class="token punctuation">(</span><span class="token string">'sc_catalogs'</span><span class="token punctuation">,</span> catalogId<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> itemExists<span class="token punctuation">.</span><span class="token function">query</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>itemExists<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">return</span> itemExists<span class="token punctuation">.</span>sys_id<span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> sc_cat_item <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'sc_cat_item'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> sc_cat_item<span class="token punctuation">.</span><span class="token function">initialize</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> sc_cat_item<span class="token punctuation">.</span>category <span class="token operator">=</span> categoryId<span class="token punctuation">;</span><br /> sc_cat_item<span class="token punctuation">.</span>sc_catalogs <span class="token operator">=</span> catalogId<span class="token punctuation">;</span><br /> sc_cat_item<span class="token punctuation">.</span>name <span class="token operator">=</span> itemObj<span class="token punctuation">.</span>name<span class="token punctuation">;</span><br /> sc_cat_item<span class="token punctuation">.</span>short_description <span class="token operator">=</span> itemObj<span class="token punctuation">.</span>short_description<span class="token punctuation">;</span><br /> sc_cat_item<span class="token punctuation">.</span>description <span class="token operator">=</span> itemObj<span class="token punctuation">.</span>short_description<span class="token punctuation">;</span><br /> <span class="token keyword">return</span> sc_cat_item<span class="token punctuation">.</span><span class="token function">insert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span><br /><br /><span class="token keyword">function</span> <span class="token function">createVariables</span><span class="token punctuation">(</span><span class="token parameter">varArr<span class="token punctuation">,</span> itemId</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token comment">/*<br /> * Expecting an array of object containing;<br /> * name (String)<br /> * question_text (String)<br /> * order (Number)<br /> * value (String)<br /> * type (Number)<br /> * * 1 = Yes/No<br /> * * 2 = MultiLine Text<br /> * * 3 = Multiple Choice (required "choices" = array {"name","value","order"})<br /> * * 4 = Numeric Scale (optional "numericScaleMin", "numericScaleMax")<br /> * * 5 = Select Box (required "choices" = array {"name","value","order"})<br /> * * 6 = Single Line Text<br /> * * 7 = Checkbox<br /> * * 8 = Reference (requires "table", "qual")<br /> * * 9 = Date<br /> * * 10 = Date/Time<br /> * * 11 = Label<br /> * * 12 = Break<br /> * * 13 = UNLISTED<br /> * * 14 = Macro<br /> * * 15 = UI Page<br /> * * 17 = Macro with Label<br /> * * 18 = Lookup Select Box (requires "table", "qual")<br /> * * 19 = Container Start<br /> * * 20 = Container End<br /> * * 21 = List Collector<br /> * * 22 = Lookup Multiple Choice<br /> * below are the additional required sometimes things<br /> * table (string)<br /> * choices (array) of {name, value, order}<br /> * qual (string)<br /> */</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">typeof</span> varArr<span class="token punctuation">.</span>name <span class="token operator">===</span> <span class="token string">"string"</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> varArr <span class="token operator">=</span> <span class="token punctuation">[</span>varArr<span class="token punctuation">]</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> varArr<span class="token punctuation">.</span><span class="token function">map</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">varObj</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">var</span> variableSysid<span class="token punctuation">;</span><br /> <span class="token keyword">var</span> variableExists <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'item_option_new'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> variableExists<span class="token punctuation">.</span><span class="token function">addQuery</span><span class="token punctuation">(</span><span class="token string">'name'</span><span class="token punctuation">,</span> varObj<span class="token punctuation">.</span>name<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> variableExists<span class="token punctuation">.</span><span class="token function">addQuery</span><span class="token punctuation">(</span><span class="token string">'cat_item'</span><span class="token punctuation">,</span> itemId<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>variableExists<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token comment">//return variableExists.sys_id;</span><br /> variableSysid <span class="token operator">=</span> variableExists<span class="token punctuation">.</span>sys_id<span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> variable <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'item_option_new'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> variable<span class="token punctuation">.</span><span class="token function">initialize</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> variable<span class="token punctuation">.</span>cat_item <span class="token operator">=</span> itemId<span class="token punctuation">;</span><br /> variable<span class="token punctuation">.</span>name <span class="token operator">=</span> varObj<span class="token punctuation">.</span>name<span class="token punctuation">.</span><span class="token function">split</span><span class="token punctuation">(</span><span class="token string">' '</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token string">'_'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">typeof</span> varObj<span class="token punctuation">.</span>question_text <span class="token operator">===</span> <span class="token string">'undefined'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token comment">//varObj.question_text = varObj.name.replace(/_/g, ' ');</span><br /> <span class="token keyword">var</span> arrayOfQs <span class="token operator">=</span> varObj<span class="token punctuation">.</span>name<span class="token punctuation">.</span><span class="token function">split</span><span class="token punctuation">(</span><span class="token string">' '</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> varObj<span class="token punctuation">.</span>question_text <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">;</span><br /> arrayOfQs<span class="token punctuation">.</span><span class="token function">map</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">question</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> varObj<span class="token punctuation">.</span>question_text <span class="token operator">+=</span> question<span class="token punctuation">.</span><span class="token function">charAt</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toUpperCase</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> varObj<span class="token punctuation">.</span>question_text <span class="token operator">+=</span> question<span class="token punctuation">.</span><span class="token function">substr</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> question<span class="token punctuation">.</span>length<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> varObj<span class="token punctuation">.</span>question_text <span class="token operator">+=</span> <span class="token string">' '</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> variable<span class="token punctuation">.</span>question_text <span class="token operator">=</span> varObj<span class="token punctuation">.</span>question_text<span class="token punctuation">;</span><br /> variable<span class="token punctuation">.</span>sys_name <span class="token operator">=</span> varObj<span class="token punctuation">.</span>question_text<span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">typeof</span> varObj<span class="token punctuation">.</span>order <span class="token operator">===</span> <span class="token string">'undefined'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> sc_item_option <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'item_option_new'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> sc_item_option<span class="token punctuation">.</span><span class="token function">addQuery</span><span class="token punctuation">(</span><span class="token string">'cat_item'</span><span class="token punctuation">,</span> itemId<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> sc_item_option<span class="token punctuation">.</span><span class="token function">orderByDesc</span><span class="token punctuation">(</span><span class="token string">'order'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> sc_item_option<span class="token punctuation">.</span><span class="token function">setLimit</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> sc_item_option<span class="token punctuation">.</span><span class="token function">query</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>sc_item_option<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> varObj<span class="token punctuation">.</span>order <span class="token operator">=</span> <span class="token function">parseInt</span><span class="token punctuation">(</span>sc_item_option<span class="token punctuation">.</span>order<span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">100</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><br /> varObj<span class="token punctuation">.</span>order <span class="token operator">=</span> <span class="token number">100</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /> variable<span class="token punctuation">.</span>order <span class="token operator">=</span> varObj<span class="token punctuation">.</span>order<span class="token punctuation">;</span><br /> variable<span class="token punctuation">.</span>type <span class="token operator">=</span> varObj<span class="token punctuation">.</span>type<span class="token punctuation">;</span><br /> variable<span class="token punctuation">.</span>cat_item <span class="token operator">=</span> itemId<span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">typeof</span> varObj<span class="token punctuation">.</span>value <span class="token operator">===</span> <span class="token string">'undefined'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> varObj<span class="token punctuation">.</span>value <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> variable<span class="token punctuation">.</span>default_value <span class="token operator">=</span> varObj<span class="token punctuation">.</span>value<span class="token punctuation">;</span><br /> variable<span class="token punctuation">.</span>default_html_value <span class="token operator">=</span> varObj<span class="token punctuation">.</span>value<span class="token punctuation">;</span><br /> variable<span class="token punctuation">.</span>reference <span class="token operator">=</span> varObj<span class="token punctuation">.</span>table<span class="token punctuation">;</span><br /> variable<span class="token punctuation">.</span>lookup_table <span class="token operator">=</span> varObj<span class="token punctuation">.</span>table<span class="token punctuation">;</span><br /> variable<span class="token punctuation">.</span>list_table <span class="token operator">=</span> varObj<span class="token punctuation">.</span>table<span class="token punctuation">;</span><br /> variable<span class="token punctuation">.</span>reference_qual <span class="token operator">=</span> varObj<span class="token punctuation">.</span>qual<span class="token punctuation">;</span><br /> variable<span class="token punctuation">.</span>reference_qual_condition <span class="token operator">=</span> varObj<span class="token punctuation">.</span>qual<span class="token punctuation">;</span><br /> variableSysid <span class="token operator">=</span> variable<span class="token punctuation">.</span><span class="token function">insert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token comment">//return variable.insert();</span><br /> <span class="token punctuation">}</span><br /> gs<span class="token punctuation">.</span><span class="token function">print</span><span class="token punctuation">(</span><span class="token keyword">typeof</span> varObj<span class="token punctuation">.</span>choices<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> gs<span class="token punctuation">.</span><span class="token function">print</span><span class="token punctuation">(</span><span class="token keyword">typeof</span> varObj<span class="token punctuation">.</span>choices <span class="token operator">!==</span> <span class="token string">'undefined'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">typeof</span> varObj<span class="token punctuation">.</span>choices <span class="token operator">!==</span> <span class="token string">'undefined'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> gs<span class="token punctuation">.</span><span class="token function">print</span><span class="token punctuation">(</span><span class="token string">'choices len: '</span> <span class="token operator">+</span> varObj<span class="token punctuation">.</span>choices<span class="token punctuation">.</span>length<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> varObj<span class="token punctuation">.</span>choices<span class="token punctuation">.</span><span class="token function">map</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">option</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">var</span> choice <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'question_choice'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> choice<span class="token punctuation">.</span><span class="token function">initialize</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> choice<span class="token punctuation">.</span>question <span class="token operator">=</span> variableSysid<span class="token punctuation">;</span><br /> choice<span class="token punctuation">.</span>text <span class="token operator">=</span> option<span class="token punctuation">.</span>text<span class="token punctuation">;</span><br /> choice<span class="token punctuation">.</span>value <span class="token operator">=</span> option<span class="token punctuation">.</span>value<span class="token punctuation">;</span><br /> choice<span class="token punctuation">.</span>order <span class="token operator">=</span> option<span class="token punctuation">.</span>order<span class="token punctuation">;</span><br /> choice<span class="token punctuation">.</span><span class="token function">insert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span><br /><br /><span class="token keyword">function</span> <span class="token function">createUIPolicy</span><span class="token punctuation">(</span><span class="token parameter">itemId</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> policy <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'catalog_ui_policy'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> policy<span class="token punctuation">.</span>short_description <span class="token operator">=</span> <span class="token string">'Initial UI Policy'</span><span class="token punctuation">;</span><br /> policy<span class="token punctuation">.</span>applies_to <span class="token operator">=</span> <span class="token string">'item'</span><span class="token punctuation">;</span><br /> policy<span class="token punctuation">.</span>catalog_item <span class="token operator">=</span> itemId<span class="token punctuation">;</span><br /> <span class="token keyword">var</span> policyId <span class="token operator">=</span> policy<span class="token punctuation">.</span><span class="token function">insert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> sc_item_option <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'item_option_new'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> sc_item_option<span class="token punctuation">.</span><span class="token function">addQuery</span><span class="token punctuation">(</span><span class="token string">'cat_item'</span><span class="token punctuation">,</span> itemId<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> sc_item_option<span class="token punctuation">.</span><span class="token function">orderByDesc</span><span class="token punctuation">(</span><span class="token string">'order'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> sc_item_option<span class="token punctuation">.</span><span class="token function">query</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">while</span> <span class="token punctuation">(</span>sc_item_option<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> policyAction <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'catalog_ui_policy_action'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> policyAction<span class="token punctuation">.</span>catalog_item <span class="token operator">=</span> itemId<span class="token punctuation">;</span><br /> policyAction<span class="token punctuation">.</span>ui_policy <span class="token operator">=</span> policyId<span class="token punctuation">;</span><br /> policyAction<span class="token punctuation">.</span>catalog_variable <span class="token operator">=</span> <span class="token string">'IO:'</span> <span class="token operator">+</span> sc_item_option<span class="token punctuation">.</span>sys_id<span class="token punctuation">;</span><br /> policyAction<span class="token punctuation">.</span><span class="token function">insert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span><br /><br /><br /><span class="token keyword">var</span> catalog <span class="token operator">=</span> <span class="token function">createCatalog</span><span class="token punctuation">(</span><span class="token string">'Custom Catalog'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token keyword">var</span> category <span class="token operator">=</span> <span class="token function">createCategory</span><span class="token punctuation">(</span><span class="token string">'Categories are Silly'</span><span class="token punctuation">,</span> catalog<span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token keyword">var</span> item <span class="token operator">=</span> <span class="token function">createItem</span><span class="token punctuation">(</span><span class="token punctuation">{</span><br /> <span class="token literal-property property">name</span><span class="token operator">:</span> <span class="token string">'Burger Request'</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">short_description</span><span class="token operator">:</span> <span class="token string">'Request a burger'</span><br /><span class="token punctuation">}</span><span class="token punctuation">,</span> category<span class="token punctuation">,</span> catalog<span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token keyword">var</span> variables <span class="token operator">=</span> <span class="token punctuation">[</span><br /> <span class="token punctuation">{</span><br /> <span class="token literal-property property">name</span><span class="token operator">:</span> <span class="token string">'How delicious should it be?'</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">type</span><span class="token operator">:</span> <span class="token number">5</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">choices</span> <span class="token operator">:</span> <span class="token punctuation">[</span><span class="token punctuation">{</span><br /> <span class="token literal-property property">name</span><span class="token operator">:</span><span class="token string">'Disgusting'</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">value</span><span class="token operator">:</span><span class="token string">'disgusting'</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">order</span><span class="token operator">:</span><span class="token string">'100'</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token punctuation">{</span><br /> <span class="token literal-property property">name</span><span class="token operator">:</span><span class="token string">'Tolerable'</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">value</span><span class="token operator">:</span><span class="token string">'tolerable'</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">order</span><span class="token operator">:</span><span class="token string">'200'</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token punctuation">{</span><br /> <span class="token literal-property property">name</span><span class="token operator">:</span><span class="token string">'Average'</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">value</span><span class="token operator">:</span><span class="token string">'average'</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">order</span><span class="token operator">:</span><span class="token string">'300'</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token punctuation">{</span><br /> <span class="token literal-property property">name</span><span class="token operator">:</span><span class="token string">'Good'</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">value</span><span class="token operator">:</span><span class="token string">'good'</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">order</span><span class="token operator">:</span><span class="token string">'400'</span><br /> <span class="token punctuation">}</span><span class="token punctuation">{</span><br /> <span class="token literal-property property">name</span><span class="token operator">:</span><span class="token string">'Great'</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">value</span><span class="token operator">:</span><span class="token string">'great'</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">order</span><span class="token operator">:</span><span class="token string">'500'</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token punctuation">]</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token punctuation">{</span><br /> <span class="token literal-property property">name</span><span class="token operator">:</span> <span class="token string">'Special Instructions'</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">type</span><span class="token operator">:</span> <span class="token number">6</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">]</span><span class="token punctuation">;</span><br /><br /><br /><span class="token function">createVariables</span><span class="token punctuation">(</span>variables<span class="token punctuation">,</span> item<span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token function">createUIPolicy</span><span class="token punctuation">(</span>item<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
Service Portal: Broadcast, emit, and on, should I use them?2018-05-13T03:24:24Zhttps://jace.pro/post/2018-05-12-sp-broadcast-message/Jace Benson<!--StartFragment-->
<p>Broadcasting messages seems great when you first learn about them and start to use them but it seems they, like everything, has its pros and cons. As such I'd avoid them for the following reasons.</p>
<ol>
<li>It's all client side, meaning it can be spoofed and modified.</li>
<li>Its difficult to track down where something broke. Imagine you have 3 scripts all calling the same broadcast message to update a title or breadcrumb, and then one fails.</li>
<li>It's hard for another developer to pick up where you left off, since there's no clear cut methods to pass along data and information.</li>
<li>That leaves too lots of variables in how the data is delivered (browser plugins, internet speeds, etc) and can cause issues in production.</li>
<li>Its not scale-able, if you ever need to build around that, it becomes a monstrosity.</li>
</ol>
<p>One way around this would be to instead drop the data into a table, and then trigger a data refresh. With an event broadcast that will pull the data from the table, server side and update the data object., This also ensures someone's connection does not time out in the middle of building the page, or isn't blocked from working via a browser plugin</p>
<p>Another way would be to subscribe to the updates via a "Data Service".<br />
A full example can be seen on the <a href="https://developer.servicenow.com/connect.do#!/event/creatorcon18/CCW1088/creatorcon_18_CCW1088_5_sharing_data_and_events">CCW1088 Lab</a>.<br />
Other examples around and about angular include;</p>
<ul>
<li><a href="https://jsfiddle.net/jeremylikness/zba74rk3/">Working example</a></li>
<li><a href="https://csharperimage.jeremylikness.com/2014/12/the-top-5-mistakes-angularjs-developers.html">Blog about<br />
it</a></li>
</ul>
<p>But this is the gist of it, create a Angular Provider. Associate it to all the appropriate widgets. Below is the code from the lab above;</p>
<pre class="language-javascript"><code class="language-javascript"><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">amb</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> watcher<span class="token punctuation">;</span><br /> <span class="token keyword">var</span> dataUpdatedHandlers <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span><br /> <span class="token keyword">function</span> <span class="token function">init</span><span class="token punctuation">(</span><span class="token parameter">table<span class="token punctuation">,</span> filter</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>watcher<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> watcher<span class="token punctuation">.</span><span class="token function">unsubscribe</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>table <span class="token operator">&&</span> filter<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> watcherChannel <span class="token operator">=</span> amb<span class="token punctuation">.</span><span class="token function">getChannelRW</span><span class="token punctuation">(</span>table<span class="token punctuation">,</span> filter<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> amb<span class="token punctuation">.</span><span class="token function">connect</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> watcher <span class="token operator">=</span> watcherChannel<span class="token punctuation">.</span><span class="token function">subscribe</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">message</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>message<span class="token punctuation">.</span>data<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">return</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> dataUpdatedHandlers<span class="token punctuation">.</span><span class="token function">forEach</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">fn</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">fn</span><span class="token punctuation">.</span><span class="token function">call</span><span class="token punctuation">(</span>fn<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">return</span> <span class="token punctuation">{</span><br /> <span class="token function-variable function">onDataUpdated</span><span class="token operator">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">callbackFn</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> dataUpdatedHandlers<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>callbackFn<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token function-variable function">initRecordWatcher</span><span class="token operator">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">table<span class="token punctuation">,</span> filter</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token function">init</span><span class="token punctuation">(</span>table<span class="token punctuation">,</span> filter<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span></code></pre>
<p>Then Add this JavaScript to each client controller on the widgets that will update the data;</p>
<pre class="language-javascript"><code class="language-javascript">workspaceData<span class="token punctuation">.</span><span class="token function">initRecordWatcher</span><span class="token punctuation">(</span>c<span class="token punctuation">.</span>options<span class="token punctuation">.</span>table<span class="token punctuation">,</span> c<span class="token punctuation">.</span>options<span class="token punctuation">.</span>filter<span class="token punctuation">)</span><span class="token punctuation">;</span><br />workspaceData<span class="token punctuation">.</span><span class="token function">onDataUpdated</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> c<span class="token punctuation">.</span>data<span class="token punctuation">.</span>rows <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span><br /> c<span class="token punctuation">.</span>server<span class="token punctuation">.</span><span class="token function">update</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">data</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> c<span class="token punctuation">.</span>data<span class="token punctuation">.</span>rows <span class="token operator">=</span> data<span class="token punctuation">.</span>rows<span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p>Add this JavaScript to the client controller on the widget that is displaying this data;</p>
<pre class="language-javascript"><code class="language-javascript">workspaceData<span class="token punctuation">.</span><span class="token function">onDataUpdated</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> c<span class="token punctuation">.</span>counters<span class="token punctuation">.</span><span class="token function">forEach</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">counter</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">runCounter</span><span class="token punctuation">(</span>counter<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p>It does seem more complicated but then you don't require <code>$scope</code> or<br />
<code>$rootScope</code> in your widgets and it should be more clear how they are<br />
working together.</p>
<!--EndFragment-->What is g_ck2018-05-13T03:22:42Zhttps://jace.pro/post/2018-05-12-g_ck/Jace Benson<!--StartFragment-->
<p>What is <code>g_ck</code> and why should I care?</p>
<p><code>g_ck</code> is the current sessions token for authentication.</p>
<h2>Why would you want to use this or know about this</h2>
<p>It's useful for making rest requests while on the system to the system.</p>
<p>You might be thinking, "That seems silly". Trust me it does. If you want to let a page load then have it load the rest of the content later, doing this is great.</p>
<h2>How do I use it</h2>
<p>First, you have to make sure you have it, once you understand it, you can generate it if you don't have access to it with the following code server side;</p>
<pre class="language-javascript"><code class="language-javascript"><span class="token keyword">var</span> g_ck <span class="token operator">=</span> gs<span class="token punctuation">.</span><span class="token function">getSession</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getSessionToken</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p>If on a UI Macro or UI Page, wrap that with <code><g:evaluate></code> tags. If on a Service Portal, toss that in your server script.</p>
<p>Once you have it you can use it in place of authentication, if you omit it, you will be asked to authenticate.</p>
<p>Below is a slightly modified script generated from the API Explorer.</p>
<pre class="language-javascript"><code class="language-javascript"><span class="token keyword">var</span> requestBody <span class="token operator">=</span> <span class="token string">""</span><span class="token punctuation">;</span><br /><span class="token keyword">var</span> endpoint <span class="token operator">=</span> document<span class="token punctuation">.</span>location<span class="token punctuation">.</span>origin <span class="token operator">+</span> <span class="token string">"/api/now/table/sys_user?"</span><span class="token punctuation">;</span><br />endpoint <span class="token operator">+=</span> <span class="token string">"sysparm_query=active%3Dtrue&"</span><span class="token punctuation">;</span><br />endpoint <span class="token operator">+=</span> <span class="token string">"sysparm_fields=user_name&"</span><span class="token punctuation">;</span><br />endpoint <span class="token operator">+=</span> <span class="token string">"sysparm_limit=1"</span><br /><span class="token keyword">var</span> client<span class="token operator">=</span><span class="token keyword">new</span> <span class="token class-name">XMLHttpRequest</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br />client<span class="token punctuation">.</span><span class="token function">open</span><span class="token punctuation">(</span><span class="token string">"get"</span><span class="token punctuation">,</span> endpoint<span class="token punctuation">)</span><span class="token punctuation">;</span><br /><br />client<span class="token punctuation">.</span><span class="token function">setRequestHeader</span><span class="token punctuation">(</span><span class="token string">'Accept'</span><span class="token punctuation">,</span><span class="token string">'application/json'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br />client<span class="token punctuation">.</span><span class="token function">setRequestHeader</span><span class="token punctuation">(</span><span class="token string">'Content-Type'</span><span class="token punctuation">,</span><span class="token string">'application/json'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><br /><span class="token comment">// Eg. UserName="admin", Password="admin" for this code sample.</span><br /><span class="token comment">// Generally this is what it shows.</span><br /><span class="token comment">// client.setRequestHeader('Authorization', 'Basic '+btoa('admin'+':'+'admin'));</span><br /><br /><span class="token comment">// If you're already authenticated. You can use X-UserToken</span><br />client<span class="token punctuation">.</span><span class="token function">setRequestHeader</span><span class="token punctuation">(</span><span class="token string">'X-UserToken'</span><span class="token punctuation">,</span> g_ck<span class="token punctuation">)</span><span class="token punctuation">;</span><br /><br />client<span class="token punctuation">.</span><span class="token function-variable function">onreadystatechange</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>readyState <span class="token operator">==</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token constant">DONE</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token comment">// Going to console log instead</span><br /> <span class="token comment">// document.getElementById("response").innerHTML=this.status + this.response;</span><br /> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>response<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span><span class="token punctuation">;</span><br />client<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span>requestBody<span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token comment">/*<br /> * Response I get<br /> * {"result":[{"user_name":"abel.tuter"}]}<br /> */</span></code></pre>
<!--EndFragment-->Knowledge 18 Notes2018-05-11T03:18:04Zhttps://jace.pro/post/2018-05-10-k18/Jace Benson<!--StartFragment-->
<p>I was very lucky to get to go to Knowledge18 and before I leave I just want to write this down as to not forget it.</p>
<p>Of the labs, I attended I had no technical difficulty with the wifi or content. Others did, but somehow not me.</p>
<p>Below I'll go over the parts I think notable.</p>
<h2><a href="https://jace.pro/post/2018-05-10-k18/#things-to-keep-in-mind-in-general">Things to keep in mind in general</a></h2>
<ul>
<li>
<p>If there are repeating classes the later ones will be better but the speaker may have lost their voice</p>
</li>
<li>
<p>Know the difference between the different types of events.</p>
<ul>
<li>Breakouts are talks</li>
<li>Labs are step by step instruction with an instructor in the room to field questions and assist</li>
<li>Workshops are the same as labs but CreatorCon</li>
</ul>
</li>
<li>
<p>Look up the content of the event. If it's not a current feature, it's probably a new feature and might be a "this will be nice but you don't get it for two releases"</p>
</li>
<li>
<p>Look up the presenters of the event. If it's a partner, be careful as it may be more of a success story of how some implementation or product they used was successful.</p>
</li>
</ul>
<h2><a href="https://jace.pro/post/2018-05-10-k18/#registration">Registration</a></h2>
<p>Looks like they used <a href="http://g2planet.com/">g2planet.com</a> which this year was pretty poor in my opinion. Hard to tell what you had already selected until you tried to add an event to the agenda</p>
<p>Suggestions to improve - Use what you used for 2016's registration or make your own.</p>
<h2><a href="https://jace.pro/post/2018-05-10-k18/#mobile-app">Mobile App</a></h2>
<p>This was terrible. I literally wrote my schedule down each day as it was more convenient to do that. Thankfully none of my classes moved after I arrived.</p>
<p>Suggestions to improve - Don't provide a mobile app. It would have been easier and then we'd been complaining about the website.</p>
<h2><a href="https://jace.pro/post/2018-05-10-k18/#social-stuff">Social Stuff</a></h2>
<p>This was great. With the way, my rep helped us get around and with all the folks.</p>
<h2><a href="https://jace.pro/post/2018-05-10-k18/#labs">Labs</a></h2>
<h3><a href="https://jace.pro/post/2018-05-10-k18/#lab1012-manage-duplicate-cis-effortlessly-to-keep-your-cmdb-clean">LAB1012 Manage Duplicate CIs Effortlessly to Keep Your CMDB Clean</a></h3>
<p>This was an awesome lab. It showed a new feature that lets you merge and handle the remaining duplicate ci's and their relationships in a very flexible way.</p>
<p><a href="https://developer.servicenow.com/connect.do#!/event/knowledge18/LAB1012">Lab URL</a></p>
<p><a href="https://community.servicenow.com/community?id=community_search&q=LAB1012">On-demand Library<br />
URL</a></p>
<h3><a href="https://jace.pro/post/2018-05-10-k18/#ccw0194-advanced-identifcation-engine-for-discovery">CCW0194 Advanced Identification Engine for Discovery</a></h3>
<p>This really was all about using the horizontal patterns to discover configuration items which in my case would have been great three weeks prior as I had to self-teach myself it. It did confirm that I did learn this properly. There's a great youtube video where they show how to do most of this.</p>
<p><a href="https://developer.servicenow.com/connect.do#!/event/creatorcon18/CCW0194">Lab URL</a></p>
<p><a href="https://community.servicenow.com/community?id=community_search&q=CCW0194">On-demand Library URL</a></p>
<p><a href="https://www.youtube.com/watch?v=R_49vxeGz78">https://www.youtube.com/watch?v=R_49vxeGz78</a></p>
<h3><a href="https://jace.pro/post/2018-05-10-k18/#lab0272-discovery-service-mapping-in-a-cloud-first-world-paasiaas">LAB0272 Discovery & Service Mapping in a Cloud First World - PaaS/IaaS</a></h3>
<p>Again this was a great session had I taken it three weeks prior. It did confirm I did learn the right topics and it focused on the Cloud Services Plugin v2.</p>
<p><a href="https://developer.servicenow.com/connect.do#!/event/knowledge18/LAB0272">Lab URL</a></p>
<p><a href="https://community.servicenow.com/community?id=community_search&q=LAB0272">On-demand Library URL</a></p>
<h3><a href="https://jace.pro/post/2018-05-10-k18/#lab0299-threat-hunting-awareness-and-sharing-with-security-operations">LAB0299 Threat Hunting, Awareness and Sharing with Security Operations</a></h3>
<p>This was a nice overview of what the Secops application brings to ServiceNow. I thought of it to something akin to an overview of how GRC would work except you were guided along setting it up.</p>
<p><a href="https://developer.servicenow.com/connect.do#!/event/knowledge18/LAB0299">Lab URL</a></p>
<p><a href="https://community.servicenow.com/community?id=community_search&q=LAB0299">On-demand Library URL</a></p>
<h3><a href="https://jace.pro/post/2018-05-10-k18/#ccw1088-service-portal-advanced-widget-development">CCW1088 -- Service Portal: Advanced Widget Development</a></h3>
<p>This lab was great in that I learned about the directives and how you can use them and share them across widgets. I also learned about a different way to have widgets communicate to each other than the broadcast and emitted events.</p>
<p><a href="https://developer.servicenow.com/connect.do#!/event/creatorcon18/CCW1088">Lab URL</a></p>
<p><a href="https://community.servicenow.com/community?id=community_search&q=CCW1088">On-demand Library URL</a></p>
<h2><a href="https://jace.pro/post/2018-05-10-k18/#labs-i-need-to-check-out-yet">Labs I need to check out yet</a></h2>
<h3><a href="https://jace.pro/post/2018-05-10-k18/#ccw0343-using-event-management-to-monitor-your-servicenow-instance-health">CCW0343 Using Event Management to Monitor Your ServiceNow Instance Health</a></h3>
<p><a href="https://developer.servicenow.com/connect.do#!/event/creatorcon18/CCW0343">Lab URL</a></p>
<p><a href="https://community.servicenow.com/community?id=community_search&q=CCW0343">On-demand Library URL</a></p>
<h3><a href="https://jace.pro/post/2018-05-10-k18/#ccw0504-agent-intelligence-deployment-best-practices">CCW0504 Agent Intelligence - Deployment Best Practices</a></h3>
<p><a href="https://developer.servicenow.com/connect.do#!/event/creatorcon18/CCW0504">Lab URL</a></p>
<p><a href="https://community.servicenow.com/community?id=community_search&q=CCW0504">On-demand Library URL</a></p>
<h3><a href="https://jace.pro/post/2018-05-10-k18/#ccw0471-test-driven-development-with-servicenow">CCW0471 Test Driven Development with ServiceNow</a></h3>
<p><a href="https://developer.servicenow.com/connect.do#!/event/creatorcon18/CCW0471">Lab URL</a></p>
<p><a href="https://community.servicenow.com/community?id=community_search&q=CCW0471">On-demand Library URL</a></p>
<h3><a href="https://jace.pro/post/2018-05-10-k18/#ccw1224-best-practices-for-scripted-rest-apis">CCW1224 Best Practices for Scripted REST APIs</a></h3>
<p><a href="https://developer.servicenow.com/connect.do#!/event/creatorcon18/CCW1224">Lab URL</a></p>
<p><a href="https://community.servicenow.com/community?id=community_search&q=CCW1224">On-demand Library URL</a></p>
<h3><a href="https://jace.pro/post/2018-05-10-k18/#ccw0682-advanced-scripting-and-json">CCW0682 Advanced Scripting and JSON</a></h3>
<p><a href="https://developer.servicenow.com/connect.do#!/event/creatorcon18/CCW0682">Lab URL</a></p>
<p><a href="https://community.servicenow.com/community?id=community_search&q=CCW0682">On-demand Library URL</a></p>
<h3><a href="https://jace.pro/post/2018-05-10-k18/#ccw1358-advanced-techniques-for-creating-high-usability-chatbot-conversations">CCW1358 Advanced Techniques for Creating High Usability Chatbot Conversations</a></h3>
<p><a href="https://developer.servicenow.com/connect.do#!/event/creatorcon18/CCW1358">Lab URL</a></p>
<!--EndFragment-->How to get help faster on the ServiceNow community2018-05-09T03:14:35Zhttps://jace.pro/post/2018-05-08-getting-help/Jace Benson<!--StartFragment-->
<p>Often I find questions posted on <a href="https://community.servicenow.com/">community.servicenow.com</a> to be disappointing in that a lot of extra back and forth has to happen before someone can get the help they desire.</p>
<p>I think following stack overflow's "<a href="https://stackoverflow.com/help/how-to-ask">What makes a good question</a>" page would help a lot of these posts. With that said, I've summarized what I think are the important bits. If you follow these recommendation, I think you will either a) get help sooner, b) solve your own problem and be on your faster then jotting down a partial question.</p>
<ol>
<li>
<p>Make a good to-the-point title for the question or as StackOverflow says, "Write a title that summarizes the specific problem". This helps because it lets those who <em>can</em> help, know they can without going into the post. You might be thinking, I can't sum it up it's too complex. No problem, try to think how you'd ask a busy colleague, and put that into the subject. If you're still having trouble, write the title last after all the details are fresh.</p>
<ul>
<li>Good: <a href="https://community.servicenow.com/community?id=community_question&sys_id=d84503addbd8dbc01dcaf3231f96191b">Set Value form variable in the request form to Table field</a></li>
<li>Good: <a href="https://community.servicenow.com/community?id=community_question&sys_id=96db0be1db9cdbc01dcaf3231f961921">How to disable attachment confirmations?</a></li>
<li>Good: <a href="https://community.servicenow.com/community?id=community_question&sys_id=8cb9d5bedbf517004e1df4621f96198f">How can I set an override reference qualifier to a group</a></li>
<li>Bad: <a href="https://community.servicenow.com/community?id=community_question&sys_id=3b932544db8a9340fc5b7a9e0f9619a5">NetApp</a></li>
<li>Bad: <a href="https://community.servicenow.com/community?id=community_question&sys_id=19121900dbc29f404837f3231f9619b1">Photo Masking</a></li>
<li>Bad: <a href="https://community.servicenow.com/community?id=community_question&sys_id=4b34dac8db461f403882fb651f961903">Not Available for Module script</a></li>
</ul>
</li>
<li>
<p>Introduce the problem or write it as you might have explained using the <a href="https://en.wikipedia.org/wiki/Rubber_duck_debugging">rubber duck debugging method</a>. In the body of your question, start by expanding on the summary you put in the title. Explain how you encountered the problem you're trying to solve, and any difficulties that have prevented you from solving it yourself. The first paragraph in your question is the second thing most readers will see, so make it as engaging and informative as possible.</p>
</li>
<li>
<p>Help others reproduce the problem. Include enough code to allow others to reproduce the problem.</p>
</li>
<li>
<p>Do not ask on a old thread for help to a new issue. Make a new question.</p>
</li>
</ol>
<!--EndFragment-->Code Search Updated2018-04-23T03:12:12Zhttps://jace.pro/post/2018-04-22-code-search-update/Jace Benson<!--StartFragment-->
<p>After some back and forth between the creator of the <code>sn_codesearch</code> app <a href="https://community.servicenow.com/community?id=community_user_profile&user=bf225e65dbd81fc09c9ffb651f9619d6">Cory Seering</a> I have a better understanding of how this works.</p>
<p>This scoped app now uses its own search group to search 49 tables instead of the default 29.</p>
<p>It now includes everything OOB I can think of that could run code server/client side.</p>
<h2><a href="https://jace.pro/post/2018-04-22-code-search-update/#setup">Setup</a></h2>
<ol>
<li>Open Studio on your environment</li>
<li>Import from source</li>
<li>Paste in the following URL:<br />
<a href="https://github.com/jacebenson/servicenow-code.git">https://github.com/jacebenson/servicenow-code.git</a></li>
</ol>
<h2><a href="https://jace.pro/post/2018-04-22-code-search-update/#update">Update</a></h2>
<p>For those who already installed it;</p>
<ol>
<li>Open Studio on your environment</li>
<li>Select <code>Code</code></li>
<li>Source Control-Apply Remote Changes</li>
</ol>
<p>This will make the app much smaller as it also moves the scopes from before.</p>
<h2><a href="https://jace.pro/post/2018-04-22-code-search-update/#usage">Usage</a></h2>
<p>After you import this you can start to use it by navigating to <code>/code</code> on your instance.</p>
<!--EndFragment-->Setting up Automated Testing Framework (ATF)2018-04-20T03:13:22Zhttps://jace.pro/post/2018-04-19-atf-setting-up/Jace Benson<!--StartFragment-->
<p>Here's our set up.</p>
<h2>Scheduled Runner</h2>
<p>We created a local admin account in our non-productions.</p>
<p>Then we added a powershell script to launch the browser to the scheduled<br />
runner.</p>
<h2>Test configurations</h2>
<p>I prefer making the records user, the user's membership as part of the<br />
test to ensure I have a clean, working state instead of picking a user<br />
who may have that role.</p>
<ol>
<li>Create a base Test, a test you will have everyone start from that<br />
does the following;</li>
</ol>
<ul>
<li>Create a user</li>
<li>Create a user membership</li>
<li>Impersonate the new user</li>
</ul>
<ol>
<li>Do the actual test.</li>
</ol>
<h2>Some items to remember</h2>
<ul>
<li>Don't test code you don't own.</li>
<li>Test's should be independent.</li>
<li>Test good/bad path. Meaning, if you add functionality for x group,<br />
verify it doesn't exist for y group.</li>
</ul>
<p><a href="https://community.servicenow.com/community?id=community_blog&sys_id=1a4e66addbd0dbc01dcaf3231f96192f">Community Blog</a> for further reading.</p>
<p><a href="https://www.servicenow.com/content/dam/servicenow-assets/public/en-us/doc-type/other-document/nowforum/sydney/hands-on-lab2-automated-testing-framework.pdf">Further Reading</a></p>
<!--EndFragment-->How to work with Out of Box things2018-04-17T03:09:32Zhttps://jace.pro/post/2018-04-16-updating-oob-things/Jace Benson<!--StartFragment-->
<p>This is something I've been told differently how to manage out of the box records. I go over the pros and cons of them here.</p>
<h1>Ways to work with Out of Box things in ServiceNow</h1>
<h2>Jakarta and later</h2>
<p>You should always add comments why you are changing and out of box (oob) script and change as little as possible so when upgrading its clear what you changed and why its different.</p>
<p>With an update in Jakarta, the recommended approach is to update the OOB record with comments of why you've changed what you changed, so when you are comparing the upgraded version and the customized version its easy to see what you did and why you did it.</p>
<h2>Pre-Jakara</h2>
<p>Knowing <em>why</em> things were updated in the past might help understand more.</p>
<h3>Comment OOB and add comments</h3>
<p>Comment out code, and adding notes stating why you change it. This had the following pros/cons</p>
<table>
<thead>
<tr>
<th>Pros</th>
<th>Cons</th>
</tr>
</thead>
<tbody>
<tr>
<td>Least amount of work</td>
<td>Upgrade would show any changes</td>
</tr>
<tr>
<td>No referencing newly created scripts as new code is in oob record</td>
<td></td>
</tr>
</tbody>
</table>
<h3>Inactive and make new</h3>
<p>Inactivate if possible, then, Copy. This is hard to see if anything has been added to the OOB because deactivating doesn't trigger a customer update.</p>
<table>
<thead>
<tr>
<th>Pros</th>
<th>Cons</th>
</tr>
</thead>
<tbody>
<tr>
<td>Would never get accidentally upgraded</td>
<td>Upgrade will not show this as needing updating</td>
</tr>
<tr>
<td></td>
<td>May require many updates to the newly created thing if its referenced all over.</td>
</tr>
</tbody>
</table>
<h3>Comment OOB, add comments, inactive and make new</h3>
<p>Add Comment stating you are making a copy, inactivate it. Copy it. This will ensure the OOB thing comes up in a skipped update.</p>
<table>
<thead>
<tr>
<th>Pros</th>
<th>Cons</th>
</tr>
</thead>
<tbody>
<tr>
<td>Would never get accidentally upgraded</td>
<td>You still have to make a new thing</td>
</tr>
<tr>
<td>Update difference still shows up so you can compare</td>
<td>May require lots of updates to the newly created thing if its referenced all over.</td>
</tr>
</tbody>
</table>
<h2>Further Reading and Thanks</h2>
<p><a href="https://docs.servicenow.com/bundle/jakarta-platform-administration/page/customer-support/task/t_ResolveASkippedUpdate.html">Resolving a skipped update</a></p>
<p>Thanks Andrew Barnes for the helpful input on this!</p>
<!--EndFragment-->Certifications SN Offers2018-04-11T03:05:54Zhttps://jace.pro/post/2018-04-10-certifications/Jace Benson<!--StartFragment-->
<p>After hearing about how certifications are changing I read up on it some. I found the site confusing, so I made this post to put the useful thoughts together.</p>
<h1><a href="https://jace.pro/post/2018-04-10-certifications/#certifications">Certifications</a></h1>
<p>As of 7/1/2018 you're need to take a class to register for the exams <a href="https://jace.pro/post/2018-04-10-certifications/certifications-faq.pdf">according to this pdf Old version</a> <a href="https://www.servicenow.com/content/dam/servicenow-assets/public/en-us/doc-type/other-document/servicenow-certification-faq.pdf">SN FAQ</a>.</p>
<p>I was looking for a list of the certifications SN offers. As of today this is all I can find. Here's my sources;</p>
<ul>
<li><a href="https://www.servicenow.com/services/training-and-certification/training-paths.html">Training Paths</a></li>
<li><a href="https://www.servicenow.com/services/training-and-certification/training-paths/certified-implementation-specialist.html">CIS Training Path</a></li>
<li><a href="https://community.servicenow.com/community?id=community_article&sys_id=a2dc2a65dbd0dbc01dcaf3231f96197e">Community Article</a></li>
<li><a href="https://www.webassessor.com/wa.do?page=enterCatalog&branding=SERVICE_NOW">Webassessor to register for exam</a></li>
</ul>
<table>
<thead>
<tr>
<th>Cert</th>
<th>Description</th>
<th>Blueprint</th>
<th>Path</th>
</tr>
</thead>
<tbody>
<tr>
<td>CSA</td>
<td>Certified System Administrator</td>
<td><a href="https://www.servicenow.com/content/dam/servicenow/other-documents/training/ServiceNow-Sys-Admin-Exam-Specs.pdf">CSA Blueprint</a></td>
<td><a href="https://nowlearning.service-now.com/lxp?id=overview&sys_id=cc4919c6dbdeb700760a710439961966&type=path">CSA</a></td>
</tr>
<tr>
<td>CIS-ITSM</td>
<td>Certified Implementation Specialist - IT Service Management</td>
<td><a href="https://www.servicenow.com/content/dam/servicenow/other-documents/training/cis-itsm-blueprint.pdf">CIS ITSM Blueprint</a></td>
<td><a href="https://nowlearning.service-now.com/lxp?id=overview&sys_id=7f7c2b24db1e7300de3cdb85ca961931&type=path">ITSM</a></td>
</tr>
<tr>
<td>CIS-SM</td>
<td>Certified Implementation Specialist - Service Mapping</td>
<td><a href="https://www.servicenow.com/content/dam/servicenow/other-documents/training/cis-sm-blueprint.pdf">CIS SM Blueprint</a></td>
<td><a href="https://nowlearning.service-now.com/lxp?id=overview&sys_id=6ebbefe0db1e7300de3cdb85ca961967&type=path">SM</a></td>
</tr>
<tr>
<td>CIS-SAM</td>
<td>Certified Implementation Specialist - Software Asset Management</td>
<td><a href="https://www.servicenow.com/content/dam/servicenow/other-documents/training/cis-sam-blueprint.pdf">CIS SAM Blueprint</a></td>
<td><a href="https://nowlearning.service-now.com/lxp?id=overview&sys_id=da5113e8db9a7300de3cdb85ca9619cd&type=path">SAM</a></td>
</tr>
<tr>
<td>CIS-FM</td>
<td>Certified Implementation Specialist - Finacial Management</td>
<td><a href="https://www.servicenow.com/content/dam/servicenow/other-documents/training/cis-fm-blueprint.pdf">CIS FM Blueprint</a></td>
<td></td>
</tr>
<tr>
<td>CIS-CSM</td>
<td>Certified Implementation Specialist - Customer Service Management</td>
<td><a href="https://www.servicenow.com/content/dam/servicenow/other-documents/training/cis-csm-blueprint.pdf">CIS CSM Blueprint</a></td>
<td><a href="https://nowlearning.service-now.com/lxp?id=overview&sys_id=cd8843e0db9a7300de3cdb85ca9619fe&type=path">CSM</a></td>
</tr>
<tr>
<td>CIS-HR</td>
<td>Certified Implementation Specialist - Human Resources</td>
<td><a href="https://www.servicenow.com/content/dam/servicenow/other-documents/training/cis-hr-blueprint.pdf">CIS HR Blueprint</a></td>
<td><a href="https://nowlearning.service-now.com/lxp?id=overview&sys_id=14bd0fe4db9a7300de3cdb85ca961937&type=path">HR</a></td>
</tr>
<tr>
<td>CIS-VR</td>
<td>Certified Implementation Specialist - Vulnerability Response</td>
<td><a href="https://www.servicenow.com/content/dam/servicenow/other-documents/training/cis-vr-blueprint.pdf">CIS VR Blueprint</a></td>
<td><a href="https://nowlearning.service-now.com/lxp?id=overview&sys_id=dfa1bb28db1e7300de3cdb85ca9619d5&type=path">VR</a></td>
</tr>
<tr>
<td>CIS-APM</td>
<td>Certified Implementation Specialist - Application Portfolio Mgmt</td>
<td><a href="https://www.servicenow.com/content/dam/servicenow/other-documents/training/cis-apm-implementation-blueprint.pdf">CIS APM Blueprint</a></td>
<td><a href="https://nowlearning.service-now.com/lxp?id=overview&sys_id=fb09db24dbda7300de3cdb85ca9619b0&type=path">APM</a></td>
</tr>
<tr>
<td>CIS-CM</td>
<td>Certified Implementation Specialist - Cloud Management</td>
<td><a href="https://www.servicenow.com/content/dam/servicenow/other-documents/training/cis-cm-exam-blueprint.pdf">CIS CM Blueprint</a></td>
<td><a href="https://nowlearning.service-now.com/lxp?id=overview&sys_id=111ca324db1e7300de3cdb85ca961906&type=path">CM</a></td>
</tr>
<tr>
<td>CIS-D</td>
<td>Certified Implementation Specialist - Discovery</td>
<td><a href="https://www.servicenow.com/content/dam/servicenow/other-documents/training/cis-discovery-blueprint.pdf">CIS Discovery Blueprint</a></td>
<td><a href="https://nowlearning.service-now.com/lxp?id=overview&sys_id=06eaebecdbda7300de3cdb85ca961957&type=path">Discovery</a></td>
</tr>
<tr>
<td>CIS-EM</td>
<td>Certified Implementation Specialist - Event Management</td>
<td><a href="https://www.servicenow.com/content/dam/servicenow/other-documents/training/cis-event-management-blueprint.pdf">CIS Event Management Blueprint</a></td>
<td><a href="https://nowlearning.service-now.com/lxp?id=overview&sys_id=264b2be0db1e7300de3cdb85ca9619bd&type=path">EM</a></td>
</tr>
<tr>
<td>CIS-FSM</td>
<td>Certified Implementation Specialist - Field Service Management</td>
<td><a href="https://www.servicenow.com/content/dam/servicenow/other-documents/training/cis-fsm-blueprint.pdf">CIS FSM Blueprint</a></td>
<td><a href="https://nowlearning.service-now.com/lxp?id=overview&sys_id=d1490324db9a7300de3cdb85ca961938&type=path">FSM</a></td>
</tr>
<tr>
<td>CIS-PPM</td>
<td>Certified Implementation Specialist - Project Portfolio Management</td>
<td><a href="https://www.servicenow.com/content/dam/servicenow/other-documents/training/cis-ppm-blueprint.pdf">CIS PPM Blueprint</a></td>
<td><a href="https://nowlearning.service-now.com/lxp?id=overview&sys_id=898857e0dbda7300de3cdb85ca96198c&type=path">PPM</a></td>
</tr>
<tr>
<td>CIS-RCI</td>
<td>Certified Implementation Specialist - Risk and Compliance</td>
<td><a href="https://www.servicenow.com/content/dam/servicenow/other-documents/training/cis-rci-blueprint.pdf">CIS RCI Blueprint</a></td>
<td><a href="https://nowlearning.service-now.com/lxp?id=overview&sys_id=9e9b43a4db9a7300de3cdb85ca9619c3&type=path">RCI</a></td>
</tr>
<tr>
<td>CIS-SIR</td>
<td>Certified Implementation Specialist - Security Incident Response</td>
<td><a href="https://www.servicenow.com/content/dam/servicenow/other-documents/training/blueprint-cis-sir-certification.pdf">CIS SIR Blueprint</a></td>
<td><a href="https://nowlearning.service-now.com/lxp?id=overview&sys_id=24213328db1e7300de3cdb85ca96194b&type=path">SIR</a></td>
</tr>
<tr>
<td>CIS-VRM</td>
<td>Certified Implementation Specialist - Vendor Risk Management</td>
<td><a href="https://www.servicenow.com/content/dam/servicenow/other-documents/training/blueprint-cis-vrm.pdf">CIS-VRM Blueprint</a></td>
<td><a href="https://nowlearning.service-now.com/lxp?id=overview&sys_id=876cc3a4db9a7300de3cdb85ca9619a4&type=path">VRM</a></td>
</tr>
<tr>
<td>CAD</td>
<td>Certified Application Developer</td>
<td><a href="https://www.servicenow.com/content/dam/servicenow/other-documents/training/exam-blueprint.pdf">CAD Blueprint</a></td>
<td><a href="https://nowlearning.service-now.com/lxp?id=overview&sys_id=39ade764db1e7300de3cdb85ca9619ee&type=path">CAD</a></td>
</tr>
</tbody>
</table>
<p><code>*</code> No Certification Documentation could be found, but it's listed as if<br />
one exists on the <a href="https://www.servicenow.com/content/dam/servicenow/other-documents/training/tp-certification-guide.pdf">Certification Guide</a> - <a href="https://jace.pro/post/2018-04-10-certifications/certifications-guide.pdf">locally incase SN updates/takes down original</a>.</p>
<p>Learning Resources</p>
<ul>
<li><a href="https://www.servicenow.com/services/training-and-certification/training-paths/saif.html">Saif Fundamentals</a> $0</li>
<li><a href="https://www.servicenow.com/services/training-and-certification/foundations-elearning.html">Servicenow Foundations eLearning</a> $0</li>
<li><a href="https://nowlearning.service-now.com/">NowLearning</a> $$$</li>
</ul>
<p>A <a href="https://community.servicenow.com/community?id=community_question&sys_id=9a376af4db017f4014d6fb2439961901&anchor=answer_48f25e0ddbc57780e0e80b55ca96197c">post</a> was made about <strong>why</strong> training is mandatory. I can't find my source but some folks have said</p>
<!--EndFragment-->
<!--StartFragment-->
<blockquote class="twitter-tweet"><p lang="en" dir="ltr"><a href="https://twitter.com/Nowsupport?ref_src=twsrc%5Etfw">@NOWsupport</a> Why are certificates for all things changing to a "you must take a class to test" method on 7/1/2018 for <a href="https://twitter.com/hashtag/servicenow?src=hash&ref_src=twsrc%5Etfw">#servicenow</a> certs?</p>— Jace Benson 👨💻⚙️ (@jacebenson) <a href="https://twitter.com/jacebenson/status/1012773334176731141?ref_src=twsrc%5Etfw">June 29, 2018</a></blockquote> <script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">We’ve found that knowledge & experience gained in the classroom is critical for success in these roles - both on projects and in the pass rates of exams. Here are some details that may help: <a href="https://t.co/hbASiiqqqd">https://t.co/hbASiiqqqd</a></p>— Now Support (@Nowsupport) <a href="https://twitter.com/Nowsupport/status/1014278703495467008?ref_src=twsrc%5Etfw">July 3, 2018</a></blockquote> <script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<!--EndFragment-->Discovery Patterns for AWS2018-04-05T03:02:58Zhttps://jace.pro/post/2018-04-04-disco-patterns-aws/Jace Benson<!--StartFragment-->
<p>Patterns are a new and interesting thing in ServiceNow.</p>
<h1>Discovery Patterns</h1>
<p>This is a work in progress, but wanted to share as I will otherwise never get this down on paper.</p>
<p>First of all let me prefix this with what I had to do to trigger the pattern for AWS I wanted to use.</p>
<p>Also heres a link to the <a href="https://docs.servicenow.com/bundle/jakarta-it-operations-management/page/product/discovery/task/t-UseSMPatternForDisco.html">Docs</a>.</p>
<h2>Set up</h2>
<p>This <a href="https://community.servicenow.com/community?id=community_question&sys_id=c5ec8b29db9cdbc01dcaf3231f9619bf">post</a> and this <a href="https://www.youtube.com/watch?v=R_49vxeGz78">YouTube video</a> helped me understand how to get started.</p>
<ol>
<li>Create a Process Classifier</li>
</ol>
<ul>
<li>Relate the Horizontal Pattern and the <em>specific pattern</em> listed on the same line.</li>
</ul>
<ol>
<li>Create a New Web Service/Region/Logical Data Center</li>
</ol>
<ul>
<li>
<p>Default endpoint <code>https://rds.amazonaws.com</code></p>
<ul>
<li>Regional endpoint <code>us-west</code></li>
</ul>
</li>
<li>
<p>Logical Data Center [<code>cmp_discovery_ldc_config</code>] record with the<br />
aws account, data center related.</p>
</li>
</ul>
<ol>
<li>From the aws account record Create the discovery schedule.</li>
</ol>
<ul>
<li>Update the type to "Cloud services"</li>
</ul>
<ol>
<li>Update mid server capabilities to include <code>all</code></li>
</ol>
<h2>Understanding patterns</h2>
<p>Patterns use Groovy as a backend to parse any scripts in the steps.</p>
<p>That means you have no access to normal script includes to change the data.</p>
<p>With that being said you <em>can</em> do most what you did in probes sensors in the pattern and it's pre/post script handlers.</p>
<p>Patterns are limited to following actions;</p>
<table>
<thead>
<tr>
<th>Step</th>
<th>Comments</th>
</tr>
</thead>
<tbody>
<tr>
<td>Library Reference</td>
<td>This seems like it allows repeatable steps</td>
</tr>
<tr>
<td>Match</td>
<td>?</td>
</tr>
<tr>
<td>Get Process</td>
<td>?</td>
</tr>
<tr>
<td>LDAP Query</td>
<td>?</td>
</tr>
<tr>
<td>SNMP Query</td>
<td>?</td>
</tr>
<tr>
<td>WMI Method Invocation</td>
<td>?</td>
</tr>
<tr>
<td>WMI Query</td>
<td>?</td>
</tr>
<tr>
<td>Parse Command Output</td>
<td>?</td>
</tr>
<tr>
<td>Parse File</td>
<td>?</td>
</tr>
<tr>
<td>Parse Variable</td>
<td>This is what is used to map a payload to fields</td>
</tr>
<tr>
<td>Create Relation/Reference</td>
<td>?</td>
</tr>
<tr>
<td>Filter Table</td>
<td>?</td>
</tr>
<tr>
<td>Merge Table</td>
<td>?</td>
</tr>
<tr>
<td>Transform Table</td>
<td>This is what is used to set fields if extra processing needs to be done</td>
</tr>
<tr>
<td>Union Tables</td>
<td>?</td>
</tr>
<tr>
<td>Change User</td>
<td>?</td>
</tr>
<tr>
<td>Find Matching URL</td>
<td>?</td>
</tr>
<tr>
<td>Parse URL</td>
<td>?</td>
</tr>
<tr>
<td>Put File</td>
<td>?</td>
</tr>
<tr>
<td>Set Parameter Value</td>
<td>This allows you to set reference-able variables in <code>EVAL</code> scripts and other fields</td>
</tr>
<tr>
<td>Unchange User</td>
<td>?</td>
</tr>
<tr>
<td>Cloud REST Call</td>
<td>This allows SN to make REST calls via the midserver to get data for this pattern</td>
</tr>
</tbody>
</table>
<h2><a href="https://jace.pro/post/2018-04-04-disco-patterns-aws/#pre-post-processing-values">Pre / Post Processing values</a></h2>
<p>These are records on [<code>sa_pattern_prepost_script</code>] where you can massage the data before and after it writes to the database. This <a href="https://community.servicenow.com/community?id=community_blog&sys_id=c0ac2225dbd0dbc01dcaf3231f96198d">post</a> was helpful in my understanding of it.</p>
<p>If you're working with the payload, this is the payload for all the found responses. If you want to change a "account id" to a reference (<code>sys_id</code>) of a account table, you'll need to iterate over the array of the items and update each account_id.</p>
<p>This is my understanding of the payloadObj structure;</p>
<!--EndFragment-->
<pre class="language-json"><code class="language-json"><span class="token punctuation">{</span><br /> items<span class="token operator">:</span> <span class="token punctuation">[</span><br /> <span class="token punctuation">{</span><br /> className<span class="token operator">:</span> <span class="token string">"cmdb_ci_thing"</span><span class="token punctuation">,</span><br /> name<span class="token operator">:</span> <span class="token string">"the name"</span><span class="token punctuation">,</span><br /> u_account<span class="token operator">:</span> <span class="token string">"account id you set here"</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">]</span><br /><span class="token punctuation">}</span></code></pre>
<p>I handled this with a pre-script</p>
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">/*<br />* 1. Pre sensor: You can change payload before it will be proccesed by Identification Engine.<br />* Use IEJsonUtility to add relevant information to the payload<br />* Input parameters in Pre sensor mode: payload, patternId<br />* 2. Post sensor: You can update/add missing info to the DB based on result (Json) from<br />* Identification Engine<br />* Output parameters in Post sensor mode: payload<br />*/</span><br /><br /><span class="token keyword">var</span> rtrn <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span><br /><span class="token comment">//parsing the json string to a json object</span><br /><br /><span class="token keyword">var</span> payloadObj <span class="token operator">=</span> <span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">parse</span><span class="token punctuation">(</span>payload<span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token comment">//put your business logic here</span><br /><br /><span class="token keyword">var</span> <span class="token function-variable function">handleAccountData</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> gs<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">stringify</span><span class="token punctuation">(</span>payloadObj<span class="token punctuation">,</span><span class="token string">''</span><span class="token punctuation">,</span><span class="token string">' '</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token string">'AWS Service Account ID to GR'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> returnStr <span class="token operator">=</span> <span class="token string">"Did not replace account value"</span><span class="token punctuation">;</span><br /> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">var</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>i<span class="token operator"><</span>payloadObj<span class="token punctuation">.</span>items<span class="token punctuation">.</span>length<span class="token punctuation">;</span>i<span class="token operator">++</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">var</span> item <span class="token operator">=</span> payloadObj<span class="token punctuation">.</span>items<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span><span class="token punctuation">(</span>item<span class="token punctuation">.</span>className <span class="token operator">===</span> <span class="token string">"cmdb_ci_cloud_database"</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">var</span> account_id <span class="token operator">=</span> item<span class="token punctuation">.</span>values<span class="token punctuation">.</span>u_account<span class="token punctuation">;</span><br /> <span class="token keyword">var</span> saGR <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'aws_account_admin'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span><span class="token punctuation">(</span>saGR<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'account_id'</span><span class="token punctuation">,</span> account_id<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> item<span class="token punctuation">.</span>values<span class="token punctuation">.</span>u_account <span class="token operator">=</span> saGR<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token string">'sys_id'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> returnStr <span class="token operator">=</span> <span class="token string">"Did replace account value"</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">return</span> returnStr<span class="token punctuation">;</span><br /><span class="token punctuation">}</span><span class="token punctuation">;</span><br />rtrn <span class="token operator">=</span> <span class="token punctuation">{</span><br /> <span class="token string-property property">'status'</span><span class="token operator">:</span> <span class="token punctuation">{</span><br /> <span class="token string-property property">'message'</span><span class="token operator">:</span> <span class="token function">handleAccountData</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span><br /> <span class="token string-property property">'isSuccess'</span><span class="token operator">:</span> <span class="token boolean">true</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token string-property property">'patternId'</span><span class="token operator">:</span> patternId<span class="token punctuation">,</span><br /> <span class="token string-property property">'payload'</span><span class="token operator">:</span> <span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">stringify</span><span class="token punctuation">(</span>payloadObj<span class="token punctuation">)</span><br /><span class="token punctuation">}</span><span class="token punctuation">;</span><br /><span class="token comment">//you can return a message and a status, on top of the input variables that you MUST return.</span><br /><span class="token comment">//returning the payload as a Json String is mandatory in case of a pre sensor script, and optional in case of post sensor script.</span><br /><span class="token comment">//if you want to stop the payload processing due to your business logic - you can set isSucess to false.</span></code></pre>
Instance options can change CSS2018-03-29T03:01:44Zhttps://jace.pro/post/2018-03-27-sp-instance/Jace Benson<!--StartFragment-->
<p>Turns out you can apply CSS to a instance record</p>
<p>I had no idea you could do this. This may have saved me from cloning widgets had I known.</p>
<p>If you <code>ctrl+right-click</code> a widget and open the <code>Instance in Page Editor</code> you can apply CSS to supersede the css defined in the widget.</p>
<p>This is a short and sweet tip.</p>
<!--EndFragment-->Where are the logs?2018-02-17T03:55:03Zhttps://jace.pro/post/2018-02-15-logs/Jace Benson<!--StartFragment-->
<p>A <a href="https://community.servicenow.com/thread/292580">post was made</a> and I was working through some security tasks of my one. I felt inspired to make a post about it. Below is a list of logs we need to review for ServiceNow</p>
<p>Can anyone provide us with Names, Tables, and Sources for the logs listed?</p>
<ul>
<li>
<p>Authentication successes and failures</p>
<ul>
<li><a href="https://.service-now.com/sysevent_list.do?sysparm_query=sys_created_onONToday%40javascript%3Ags.daysAgoStart(0)%40javascript%3Ags.daysAgoEnd(0)%5Ename%3Dlogin">Successes</a></li>
<li><a href="https://.service-now.com/sysevent_list.do?sysparm_query=sys_created_onONToday%40javascript%3Ags.daysAgoStart(0)%40javascript%3Ags.daysAgoEnd(0)%5Ename%3Dlogin.failed">Failures</a></li>
</ul>
</li>
<li>
<p>Authorization (access control) failures</p>
<ul>
<li>This would be verbose and you wouldn't want this.</li>
<li>Do you mean code failures? They would show up as errors in the logs... but not explicitly listed for an acl, an code error.</li>
</ul>
</li>
<li>
<p>Application startups and shutdowns</p>
<ul>
<li>So. Application startups depends on what you mean "applications". If you mean NODES than thats on <code>sys_cluster_state</code> in the payload look for <code>servlet.started</code> xml node.</li>
<li>If you mean something else I don't think that's how this works.</li>
</ul>
</li>
<li>
<p>Configuration changes</p>
<ul>
<li>this is available on <code>sys_update_xml</code></li>
</ul>
</li>
<li>
<p>Changes to code files or memory</p>
<ul>
<li>This is the same as configuration changes. Servicenow has no files you can change like a traditional server, at least not that we can access.</li>
</ul>
</li>
<li>
<p>Application errors and system events e.g. syntax and runtime errors, connectivity problems, performance issues, third party service error messages, file system errors</p>
<ul>
<li><a href="https://.service-now.com/syslog_list.do?sysparm_query=sys_created_onONToday%40javascript%3Ags.daysAgoStart(0)%40javascript%3Ags.daysAgoEnd(0)%5Elevel%3D2">Errors</a></li>
</ul>
</li>
<li>
<p>Input validation failures e.g. protocol violations, unacceptable encodings, invalid parameter names and values</p>
<ul>
<li>I'd guess this would be in the syslog_list, but I'm not sure the types of items you're expecting.</li>
</ul>
</li>
<li>
<p>Output validation failures e.g. database record set mismatch, invalid data encoding</p>
<ul>
<li>I'd guess this would be in the syslog_list, but I'm not sure the types of items you're expecting.</li>
</ul>
</li>
<li>
<p>Session management failures e.g. cookie session identification value modification</p>
</li>
<li>
<p>Acceptance of EULA/terms of use</p>
<ul>
<li>Not ootb, but if you applied <a href="https://www.servicenowguru.com/system-definition/login-terms-conditions-dialog/">servicenowguru's</a> then you'd look on the "Terms Acceptance table". I can't find the update set to download.</li>
</ul>
</li>
<li>
<p>Personal data usage notification/consent</p>
<ul>
<li>Not sure what you mena by this. Do you mean like HIPAA, PII and the like? If so there's nothing to say this ssn, or address is added as a comment in the system. You'd have to add that via a customization.</li>
</ul>
</li>
<li>
<p>Attack detection e.g. excessive authentication failures, file upload virus detection</p>
<ul>
<li>
<p>See <a href="https://.service-now.com/sysevent_list.do?sysparm_query=sys_created_onONToday%40javascript%3Ags.daysAgoStart(0)%40javascript%3Ags.daysAgoEnd(0)%5Ename%3Dlogin.failed">Auth Failures</a></p>
</li>
<li>
<p>There is no virus checking to my knowledge of uploaded files, you can control the upload types and sizes from these properties</p>
<ul>
<li><code>glide.ui.strict_customer_uploaded_content_types</code> restricts what can be loaded vs downloaded to stop xss</li>
<li><code>glide.security.file.mime_type.validation</code> restricts the file's mime type on upload</li>
<li><code>glide.ui.strict_customer_uploaded_static_content</code> restricts the files somehow</li>
<li><code>glide.attachment.extensions</code> restricts the files extensions allowed to be uploaded</li>
<li><code>glide.image_provider.security_enabled</code> restricts access to uploads to authenticated users</li>
<li><code>glide.ui.attachment.download_mime_types</code> restricts downloadable mime types</li>
</ul>
</li>
</ul>
</li>
<li>
<p>Any other logs that would help identify suspicious, unacceptable, unexpected behavior, or other possibly malicious activities.</p>
</li>
</ul>
Versions of libraries2018-02-16T04:00:31Zhttps://jace.pro/post/2018-02-15-versions/Jace Benson<p>Sometimes you just want to know the versions of software you're using.</p>
<pre class="language-xml"><code class="language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">j:</span>jelly</span> <span class="token attr-name">trim</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>true<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xmlns:</span>j</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>jelly:core<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xmlns:</span>g</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>glide<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xmlns:</span>g2</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>null<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xmlns:</span>j2</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>null<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">g:</span>inline</span> <span class="token attr-name">template</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>ng_head_inline_script.xml<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">g:</span>requires</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>scripts/angular_includes_1.4.js<span class="token punctuation">"</span></span> <span class="token attr-name">includes</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>true<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">g:</span>requires</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>styles/css_includes_doctype.css<span class="token punctuation">"</span></span> <span class="token attr-name">includes</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>true<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">g:</span>requires</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>scripts/lib/jquery_includes.js<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">g:</span>requires</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>styles/heisenberg/heisenberg_all.css<span class="token punctuation">"</span></span> <span class="token attr-name">includes</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>true<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">g:</span>requires</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>scripts/heisenberg/heisenberg_all.js<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">g:</span>evaluate</span><span class="token punctuation">></span></span><br /> var midVersion = gs.getProperty('mid.version').split('-')[0].toLowerCase();<br /> var ecma3Versions = [<br /> 'geneva',<br /> 'fuji',<br /> 'eureka',<br /> 'dublin',<br /> 'calgary',<br /> 'berlin'<br /> ];<br /> var ecma3 = (function (){<br /> for(var version in ecma3Versions){<br /> if(midVersion == version){<br /> return true;<br /> }<br /> }<br /> return false;<br /> })();<br /><br /> //var currentContext = Context.getCurrentContext(),<br /> //var rhinoVersion = currentContext.getImplementationVersion();<br /> if(ecma3){<br /> rhinoVersion = "Unknown ECMA3 ES3";//https://developer.mozilla.org/en-US/docs/Mozilla/Projects/Rhino/Download_Rhino<br /> } else {<br /> rhinoVersion = "1.7 R5 ECMA5 ES5";<br /> }<br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span><span class="token namespace">g:</span>evaluate</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>script</span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"><br /> <span class="token function">jQuery</span><span class="token punctuation">(</span> document <span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">ready</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">typeof</span> jQuery <span class="token operator">!=</span> <span class="token string">'undefined'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token function">jQuery</span><span class="token punctuation">(</span><span class="token string">"#jQueryVersion"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">text</span><span class="token punctuation">(</span>jQuery<span class="token punctuation">.</span>fn<span class="token punctuation">.</span>jquery<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">typeof</span> angular <span class="token operator">!=</span> <span class="token string">'undefined'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token function">jQuery</span><span class="token punctuation">(</span><span class="token string">'#angularVersion'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">text</span><span class="token punctuation">(</span>angular<span class="token punctuation">.</span>version<span class="token punctuation">.</span>full<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><br /> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>script</span><span class="token punctuation">></span></span><br /><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>container<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>row<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>col-md-6<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Instance Version:<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>rhinoVersion<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>col-md-6<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>${midVersion}<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>row<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>col-md-6<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Rhino version:<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>rhinoVersion<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>col-md-6<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>${rhinoVersion}<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>row<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>col-md-6<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>jQuery version:<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>jQueryVersion<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>col-md-6<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>...<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>row<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>col-md-6<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Angular version:<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>angularVersion<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>col-md-6<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>row<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>col-md-6<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Bootstrap version:<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>bootstrapversion<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>col-md-6<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>https://docs.servicenow.com/bundle/kingston-servicenow-platform/page/build/service-portal/concept/portal-css.html<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>3.3.6<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><br /><br /><span class="token tag"><span class="token tag"><span class="token punctuation"></</span><span class="token namespace">j:</span>jelly</span><span class="token punctuation">></span></span></code></pre>
How to print out all the variables (OLD)2018-02-16T03:58:30Zhttps://jace.pro/post/2018-02-15-print-out-variables/Jace Benson<p>Let me preface this code with there is another way to do this but it's undocumented.<br />
That is using the <code>GlideappVariablePoolQuestionSet</code> class as <a href="https://community.servicenow.com/thread/245758">posted here by Chuck Tomasi</a>.</p>
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">/*jslint eqeq: true*/</span><br /><span class="token comment">/*global GlideRecord, current*/</span><br /><span class="token keyword">var</span> tablestart <span class="token operator">=</span> <span class="token string">'<div '</span><span class="token punctuation">;</span><br />tablestart <span class="token operator">+=</span> <span class="token string">'class="nmmcbg" width="100%" '</span><span class="token punctuation">;</span><br />tablestart <span class="token operator">+=</span> <span class="token string">'style="background-color: LightGoldenRodYellow;">'</span><span class="token punctuation">;</span><br /><span class="token keyword">var</span> d <span class="token operator">=</span> <span class="token string">'<div style="display:inline;font-weight:bold;" class="nmmcbold">'</span><span class="token punctuation">;</span><br /><span class="token keyword">var</span> dn <span class="token operator">=</span> <span class="token string">'</div>\n'</span><span class="token punctuation">;</span><br /><span class="token keyword">var</span> i<span class="token punctuation">;</span><br /><span class="token keyword">var</span> gr <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'sc_req_item'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br />gr<span class="token punctuation">.</span><span class="token function">addQuery</span><span class="token punctuation">(</span><span class="token string">'sys_id'</span><span class="token punctuation">,</span> <span class="token string">'='</span><span class="token punctuation">,</span> current<span class="token punctuation">.</span>sys_id<span class="token punctuation">)</span><span class="token punctuation">;</span><br />gr<span class="token punctuation">.</span><span class="token function">query</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token keyword">var</span> vtp <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">;</span><br /><span class="token keyword">var</span> v <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'sc_item_option_mtom'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br />v<span class="token punctuation">.</span><span class="token function">addQuery</span><span class="token punctuation">(</span><span class="token string">'request_item'</span><span class="token punctuation">,</span> current<span class="token punctuation">.</span>sys_id<span class="token punctuation">)</span><span class="token punctuation">;</span><br />v<span class="token punctuation">.</span><span class="token function">orderBy</span><span class="token punctuation">(</span><span class="token string">'sc_item_option.order'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br />v<span class="token punctuation">.</span><span class="token function">query</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token keyword">while</span> <span class="token punctuation">(</span>v<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>vtp<span class="token punctuation">.</span>length <span class="token operator">>=</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token comment">/*****************************<br /> This code dynamically pulls the questions from the forms in the order <br /> they are presented (numerically) and then displays them in a <br /> consistant readable format.<br /> Right now nothing links to any records but can with some slight <br /> changes to this code.<br /> *****************************/</span><br /> <span class="token keyword">var</span> questionType <span class="token operator">=</span> v<span class="token punctuation">.</span>sc_item_option<span class="token punctuation">.</span>item_option_new<span class="token punctuation">.</span>type<span class="token punctuation">;</span><br /> <span class="token keyword">var</span> question <span class="token operator">=</span> <span class="token string">'<p><b>'</span><span class="token punctuation">;</span><br /> question <span class="token operator">+=</span> v<span class="token punctuation">.</span>sc_item_option<span class="token punctuation">.</span>item_option_new<span class="token punctuation">.</span><span class="token function">getDisplayValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> question <span class="token operator">+=</span> <span class="token string">'</b></p>'</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> answer <span class="token operator">=</span> v<span class="token punctuation">.</span>sc_item_option<span class="token punctuation">.</span>value<span class="token punctuation">.</span><span class="token function">getDisplayValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">'\n'</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>answer <span class="token operator">!=</span> <span class="token string">''</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">/*if the value is blank, don't print*/</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>questionType <span class="token operator">==</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//Yes / No</span><br /> vtp <span class="token operator">+=</span> question <span class="token operator">+</span> answer<span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>questionType <span class="token operator">==</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//Multi Line Text</span><br /> vtp <span class="token operator">+=</span> question <span class="token operator">+</span> answer<span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>questionType <span class="token operator">==</span> <span class="token number">3</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//Multiple Choice</span><br /> vtp <span class="token operator">+=</span> question <span class="token operator">+</span> answer<span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>questionType <span class="token operator">==</span> <span class="token number">4</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//Numeric Scale</span><br /> vtp <span class="token operator">+=</span> question <span class="token operator">+</span> answer<span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>questionType <span class="token operator">==</span> <span class="token number">5</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//Select Box</span><br /> vtp <span class="token operator">+=</span> question <span class="token operator">+</span> answer<span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>questionType <span class="token operator">==</span> <span class="token number">6</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//Single Line Text</span><br /> vtp <span class="token operator">+=</span> question <span class="token operator">+</span> answer<span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>questionType <span class="token operator">==</span> <span class="token number">7</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//Check Box</span><br /> vtp <span class="token operator">+=</span> question <span class="token operator">+</span> answer<span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>questionType <span class="token operator">==</span> <span class="token number">8</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//Reference</span><br /> <span class="token keyword">var</span> reftable <span class="token operator">=</span> v<span class="token punctuation">.</span>sc_item_option<span class="token punctuation">.</span>item_option_new<span class="token punctuation">.</span>reference<span class="token punctuation">;</span><br /> <span class="token keyword">var</span> referencegr <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span>reftable<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> referencegr<span class="token punctuation">.</span><span class="token function">addQuery</span><span class="token punctuation">(</span><span class="token string">'sys_id'</span><span class="token punctuation">,</span> <span class="token string">'='</span><span class="token punctuation">,</span> v<span class="token punctuation">.</span>sc_item_option<span class="token punctuation">.</span>value<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> referencegr<span class="token punctuation">.</span><span class="token function">query</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">while</span> <span class="token punctuation">(</span>referencegr<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> vtp <span class="token operator">+=</span> question <span class="token operator">+</span> <span class="token string">': '</span> <span class="token operator">+</span> referencegr<span class="token punctuation">.</span><span class="token function">getDisplayValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> vtb <span class="token operator">+=</span> <span class="token string">'\n'</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>questionType <span class="token operator">==</span> <span class="token number">9</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//Date</span><br /> vtp <span class="token operator">+=</span> question <span class="token operator">+</span> answer<span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>questionType <span class="token operator">==</span> <span class="token number">10</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//Date/Time</span><br /> vtp <span class="token operator">+=</span> question <span class="token operator">+</span> answer<span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token comment">/*<br /> if (questionType == 11) { //Label<br /> //Do nothing<br /> }<br /> if (questionType == 12) { //Break<br /> //Do nothing<br /> }<br /> if (questionType == 13) { //Not Listed<br /> //Do nothing<br /> }<br /> if (questionType == 14) { //Macro<br /> //Do nothing<br /> }<br /> if (questionType == 15) { //UI Page<br /> //Do nothing<br /> }<br /> */</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>questionType <span class="token operator">==</span> <span class="token number">16</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//Wide Single Line Text</span><br /> vtp <span class="token operator">+=</span> question <span class="token operator">+</span> answer<span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token comment">/*<br /> if (questionType == 17) { //Macro with Label<br /> //Do nothing<br /> }<br /> */</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>questionType <span class="token operator">==</span> <span class="token number">18</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//Lookup Select Box</span><br /> <span class="token keyword">var</span> lstable <span class="token operator">=</span> v<span class="token punctuation">.</span>sc_item_option<span class="token punctuation">.</span>item_option_new<span class="token punctuation">.</span>lookup_table<span class="token punctuation">;</span><br /> <span class="token keyword">var</span> lsbgr <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span>lstable<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> lsbgr<span class="token punctuation">.</span><span class="token function">addQuery</span><span class="token punctuation">(</span><span class="token string">'sys_id'</span><span class="token punctuation">,</span> <span class="token string">'='</span><span class="token punctuation">,</span> v<span class="token punctuation">.</span>sc_item_option<span class="token punctuation">.</span>value<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> lsbgr<span class="token punctuation">.</span><span class="token function">query</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">while</span> <span class="token punctuation">(</span>lsbgr<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> vtp <span class="token operator">+=</span> question <span class="token operator">+</span> <span class="token string">': '</span> <span class="token operator">+</span> lsbgr<span class="token punctuation">.</span><span class="token function">getDisplayValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">'\n'</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /> <span class="token comment">/*<br /> if (questionType == 19) { //Container Start<br /> //Do nothing<br /> }<br /> if (questionType == 20) { //Container End<br /> //Do nothing<br /> }<br /> */</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>questionType <span class="token operator">==</span> <span class="token number">21</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//List Collector</span><br /> <span class="token keyword">var</span> list <span class="token operator">=</span> answer<span class="token punctuation">;</span><br /> <span class="token keyword">var</span> listarray <span class="token operator">=</span> list<span class="token punctuation">.</span><span class="token function">split</span><span class="token punctuation">(</span><span class="token string">','</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> vtp <span class="token operator">+=</span> question <span class="token operator">+</span> <span class="token string">'</b></p>\n'</span><span class="token punctuation">;</span><br /> <span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> listarray<span class="token punctuation">.</span>length<span class="token punctuation">;</span> i <span class="token operator">=</span> i <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> listtable <span class="token operator">=</span> v<span class="token punctuation">.</span>sc_item_option<span class="token punctuation">.</span>item_option_new<span class="token punctuation">.</span>list_table<span class="token punctuation">;</span><br /> <span class="token keyword">var</span> igr <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span>listtable<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> igr<span class="token punctuation">.</span><span class="token function">addQuery</span><span class="token punctuation">(</span><span class="token string">'sys_id'</span><span class="token punctuation">,</span> <span class="token string">'='</span><span class="token punctuation">,</span> listarray<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> igr<span class="token punctuation">.</span><span class="token function">query</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">while</span> <span class="token punctuation">(</span>igr<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> vtp <span class="token operator">+=</span> <span class="token string">'- '</span> <span class="token operator">+</span> igr<span class="token punctuation">.</span><span class="token function">getDisplayValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">'\n'</span><span class="token punctuation">;</span> <span class="token comment">//displayvalues</span><br /> <span class="token punctuation">}</span><br /> <span class="token comment">//vtp += 'i = ' + i + '- ' + listarray<i> + '\n';//sys_ids</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>questionType <span class="token operator">==</span> <span class="token number">22</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//Lookup Multiple Choice //success</span><br /> vtp <span class="token operator">+=</span> question <span class="token operator">+</span> answer<span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span><br /><br /><span class="token keyword">var</span> wn <span class="token operator">=</span> <span class="token string">'\n'</span><span class="token punctuation">;</span><br />wn <span class="token operator">+=</span> tablestart<span class="token punctuation">;</span><br />wn <span class="token operator">+=</span> vtp<span class="token punctuation">;</span><br />wn <span class="token operator">+=</span> <span class="token string">"</div>"</span><span class="token punctuation">;</span><br /><br /><span class="token comment">// then either write wn pre and appended with [code] tags in a journal </span><br /><span class="token comment">// field, or put it in a mail script.</span></code></pre>
<!--StartFragment-->
<h2>Further Reading</h2>
<p><a href="https://community.servicenow.com/thread/149636#733514">Community Thread</a></p>
<!--EndFragment-->Serice Portal Record Producer Redirects2018-02-10T03:51:51Zhttps://jace.pro/post/2018-02-09-sp-record-producer-redirect/Jace Benson<p>I was asked to set up the redirect from a record producer on the Service Portal. This was no problem in the past CMS, and the normal GUI. The <a href="https://docs.servicenow.com/bundle/kingston-it-service-management/page/product/service-catalog-management/concept/c_PopulatingRecordData.html">docs</a> say it should be a simple line of code like;</p>
<pre class="language-javascript"><code class="language-javascript">producer<span class="token punctuation">.</span>url_redirect<span class="token operator">=</span><span class="token string">"home.do"</span><span class="token punctuation">;</span><span class="token comment">//for CMS and GUI redirects</span><br />producer<span class="token punctuation">.</span>portal_redirect<span class="token operator">=</span><span class="token string">"?id=page"</span><span class="token punctuation">;</span><span class="token comment">//for Service Portal redirects</span></code></pre>
<p>This <em>does not</em> work unless you change the Instance Options<br />
(control-right click, to get to "Instance Options").</p>
<p><img src="https://jace.pro/static/img/sp-record-producer-redirect-instance-options.png" alt="" /></p>
<!--StartFragment-->
<p>This is the same widget that renders your other catalog items and they all will redirect too.</p>
<!--EndFragment-->Pasting Images in the classic UI2018-01-04T03:47:35Zhttps://jace.pro/post/2018-01-04-pasting-images-gui/Jace Benson<p>Sometime ago I looked for the ability to paste images onto a form and have it attach in both the <a href="https://jace.pro/Service-Portal/Pasting-Images-on-the-Portal/">portal</a>, and the<br />
standard ui.</p>
<p>I found this <a href="https://community.servicenow.com/message/851339#851339">post</a> back then by Niklas Johansson. I modified this some and got it to work by making the following modifications.</p>
<p><em>This does not work on IE11 or IE Edge.</em></p>
<p>This uses the following bits;</p>
<ol>
<li>UI Script (to load the functions to be called in client scripts)</li>
<li>Client Script(s) (to add the ability on a form by form basis, or all when associated to <code>global</code>)</li>
<li>Script Include (to handle the upload of the pasted file)</li>
</ol>
<!--EndFragment-->
<h2>UI Script</h2>
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">// API Name: addPasteEvent</span><br /><span class="token comment">// UI Type: Desktop</span><br /><span class="token comment">// Global: Checked</span><br /><span class="token comment">// Script: Below</span><br /><span class="token comment">// Thanks to Marius Kluften for the Microsoft bits</span><br /><span class="token keyword">function</span> <span class="token function">addPasteEvent</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> document<span class="token punctuation">.</span><span class="token function-variable function">onpaste</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">event</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> items <span class="token operator">=</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>clipboardData<span class="token punctuation">.</span>items<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//; || event.originalEvent.clipboardData).items;</span><br /> <span class="token comment">// find pasted image among pasted items</span><br /> <span class="token keyword">var</span> blob <span class="token operator">=</span> <span class="token keyword">null</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> imageIndex<span class="token punctuation">;</span><br /> <span class="token keyword">var</span> htmlIndex<span class="token punctuation">;</span> <span class="token comment">// In case a html text is present in the clipboard</span><br /> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">var</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> items<span class="token punctuation">.</span>length<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>items<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>type<span class="token punctuation">.</span><span class="token function">indexOf</span><span class="token punctuation">(</span><span class="token string">"image"</span><span class="token punctuation">)</span> <span class="token operator">===</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> imageIndex <span class="token operator">=</span> i<span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>items<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>type<span class="token punctuation">.</span><span class="token function">indexOf</span><span class="token punctuation">(</span><span class="token string">"text/html"</span><span class="token punctuation">)</span> <span class="token operator">===</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> htmlIndex <span class="token operator">=</span> i<span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">var</span> imageFile<span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>imageIndex <span class="token operator">></span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> imageFile <span class="token operator">=</span> items<span class="token punctuation">[</span>imageIndex<span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">getAsFile</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token comment">// If html is present in the clipboard, check if the object is from an office product (word/excel etc.)</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>imageFile<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>htmlIndex <span class="token operator">></span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> items<span class="token punctuation">[</span>htmlIndex<span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">getAsString</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>e<span class="token punctuation">.</span><span class="token function">indexOf</span><span class="token punctuation">(</span><span class="token string">'schemas-microsoft-com:office:office'</span><span class="token punctuation">)</span> <span class="token operator">===</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token function">processBlob</span><span class="token punctuation">(</span>imageFile<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><br /> <span class="token function">processBlob</span><span class="token punctuation">(</span>imageFile<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span><br /><br /><span class="token keyword">function</span> <span class="token function">processBlob</span><span class="token punctuation">(</span><span class="token parameter">blob</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>blob <span class="token operator">!==</span> <span class="token keyword">null</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> reader <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FileReader</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> reader<span class="token punctuation">.</span><span class="token function-variable function">onload</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">event</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token function">attachClipboardData</span><span class="token punctuation">(</span>event<span class="token punctuation">.</span>target<span class="token punctuation">.</span>result<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><span class="token punctuation">;</span><br /> reader<span class="token punctuation">.</span><span class="token function">readAsDataURL</span><span class="token punctuation">(</span>blob<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span><br /><br /><span class="token keyword">function</span> <span class="token function">attachClipboardData</span><span class="token punctuation">(</span><span class="token parameter">data</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>g_form<span class="token punctuation">.</span><span class="token function">isNewRecord</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> g_form<span class="token punctuation">.</span><span class="token function">clearMessages</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> g_form<span class="token punctuation">.</span><span class="token function">addErrorMessage</span><span class="token punctuation">(</span><span class="token string">'Save record to allowing pasting of images'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> recordSysID <span class="token operator">=</span> g_form<span class="token punctuation">.</span><span class="token function">getUniqueValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> recordTable <span class="token operator">=</span> g_form<span class="token punctuation">.</span><span class="token function">getTableName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> temp <span class="token operator">=</span> data<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span><span class="token regex"><span class="token regex-delimiter">/</span><span class="token regex-source language-regex">data:</span><span class="token regex-delimiter">/</span><span class="token regex-flags">g</span></span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">split</span><span class="token punctuation">(</span><span class="token string">';'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> contentType <span class="token operator">=</span> temp<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> fileName <span class="token operator">=</span> <span class="token string">'Screenshot.'</span> <span class="token operator">+</span> contentType<span class="token punctuation">.</span><span class="token function">split</span><span class="token punctuation">(</span><span class="token string">'/'</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> content <span class="token operator">=</span> temp<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span><span class="token regex"><span class="token regex-delimiter">/</span><span class="token regex-source language-regex">base64,</span><span class="token regex-delimiter">/</span><span class="token regex-flags">g</span></span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> attach <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideAjax</span><span class="token punctuation">(</span><span class="token string">'pasteAttachment'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Specify the script include name after completing step 2</span><br /> attach<span class="token punctuation">.</span><span class="token function">addParam</span><span class="token punctuation">(</span><span class="token string">'sysparm_name'</span><span class="token punctuation">,</span> <span class="token string">'attachScreenshot'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> attach<span class="token punctuation">.</span><span class="token function">addParam</span><span class="token punctuation">(</span><span class="token string">'sysparm_tableName'</span><span class="token punctuation">,</span> recordTable<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> attach<span class="token punctuation">.</span><span class="token function">addParam</span><span class="token punctuation">(</span><span class="token string">'sysparm_sys_id'</span><span class="token punctuation">,</span> recordSysID<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> attach<span class="token punctuation">.</span><span class="token function">addParam</span><span class="token punctuation">(</span><span class="token string">'sysparm_content_type'</span><span class="token punctuation">,</span> contentType<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> attach<span class="token punctuation">.</span><span class="token function">addParam</span><span class="token punctuation">(</span><span class="token string">'sysparm_value'</span><span class="token punctuation">,</span> content<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> attach<span class="token punctuation">.</span><span class="token function">addParam</span><span class="token punctuation">(</span><span class="token string">'sysparm_filename'</span><span class="token punctuation">,</span> fileName<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> attach<span class="token punctuation">.</span><span class="token function">getXML</span><span class="token punctuation">(</span>getResponse<span class="token punctuation">)</span><span class="token punctuation">;</span><br /><br /> <span class="token keyword">function</span> <span class="token function">getResponse</span><span class="token punctuation">(</span><span class="token parameter">response</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> g_form<span class="token punctuation">.</span><span class="token function">clearMessages</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> g_form<span class="token punctuation">.</span><span class="token function">addInfoMessage</span><span class="token punctuation">(</span><span class="token string">'Screenshot attached.'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span></code></pre>
<h2>Client Script</h2>
<pre class="language-javascript"><code class="language-javascript"><span class="token keyword">function</span> <span class="token function">onLoad</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token comment">//Type appropriate comment here, and begin script below</span><br /> <span class="token comment">//will not work on service portal as it requires</span><br /> <span class="token function">addPasteEvent</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span></code></pre>
<h2>Script Include</h2>
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">// Name pasteAttachment</span><br /><span class="token comment">// Client Callable: Checked</span><br /><span class="token keyword">var</span> pasteAttachment <span class="token operator">=</span> Class<span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br />pasteAttachment<span class="token punctuation">.</span>prototype <span class="token operator">=</span> Object<span class="token punctuation">.</span><span class="token function">extendsObject</span><span class="token punctuation">(</span>AbstractAjaxProcessor<span class="token punctuation">,</span> <span class="token punctuation">{</span><br /> <span class="token function-variable function">attachScreenshot</span> <span class="token operator">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> StringUtil <span class="token operator">=</span> GlideStringUtil<span class="token punctuation">;</span><br /> <span class="token keyword">var</span> value <span class="token operator">=</span> StringUtil<span class="token punctuation">.</span><span class="token function">base64DecodeAsBytes</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">getParameter</span><span class="token punctuation">(</span><span class="token string">'sysparm_value'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> tableName <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">getParameter</span><span class="token punctuation">(</span><span class="token string">'sysparm_tableName'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> sys_id <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">getParameter</span><span class="token punctuation">(</span><span class="token string">'sysparm_sys_id'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> filename <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">getParameter</span><span class="token punctuation">(</span><span class="token string">'sysparm_filename'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> content_type <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">getParameter</span><span class="token punctuation">(</span><span class="token string">'sysparm_content_type'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><br /> <span class="token keyword">var</span> attachment <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Attachment</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> attachment<span class="token punctuation">.</span><span class="token function">write</span><span class="token punctuation">(</span>tableName<span class="token punctuation">,</span> sys_id<span class="token punctuation">,</span> filename<span class="token punctuation">,</span> content_type<span class="token punctuation">,</span> value<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">type</span><span class="token operator">:</span> <span class="token string">'pasteAttachment'</span><br /><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<h2>History</h2>
<!--StartFragment-->
<ul>
<li>2018-11-10: This was updated to clarify options on the UI<br />
Script and the Script Include.</li>
<li>2018-11-12: Thanks Marius Kluften for the update about<br />
pasting the Microsoft nuances.</li>
</ul>
<!--EndFragment-->Service Portal Pasting Images2018-01-04T03:44:58Zhttps://jace.pro/post/2018-01-02-sp-pasting-images/Jace Benson<!--StartFragment-->
<p>In the past I've tried to set up image pasting before with <a href="https://share.servicenow.com/app.do#/detailV2/4fa0b76f137826001d2abbf18144b065/overview">Lars Tange's solution</a>, but that didn't look how I liked it, as it had a specific field for pasting attachments.</p>
<p>I am cleaning up some of my former stories and thought I'd do a cusory search and found this <a href="https://community.servicenow.com/message/1227642#1227642">post</a> by Christopher Decugis about how he modified it to work. It works great. Below I'll go over what you need to do if you want this on your portal as well.</p>
<p>We don't have access to the body tag or the top level div, so you will have to do this for every page you want it to work on. We use three forms on our portal, so <code>sc_cat_item</code>, <code>ticket</code>, and <code>form</code>. You might have more, be aware you might have to add it for each page you want to allow it work on.</p>
<p>On the top level div that is displayed, you need to add <code>ng-paste="paste($event)"</code> and then in the client script you need to add the following function;</p>
<!--EndFragment-->
<pre class="language-javascript"><code class="language-javascript">$scope<span class="token punctuation">.</span><span class="token function-variable function">paste</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">event</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">var</span> files <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> clipData <span class="token operator">=</span> event<span class="token punctuation">.</span>originalEvent<span class="token punctuation">.</span>clipboardData<span class="token punctuation">;</span><br /> angular<span class="token punctuation">.</span><span class="token function">forEach</span><span class="token punctuation">(</span>clipData<span class="token punctuation">.</span>items<span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">item<span class="token punctuation">,</span> key</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">if</span><span class="token punctuation">(</span>clipData<span class="token punctuation">.</span>items<span class="token punctuation">[</span>key<span class="token punctuation">]</span><span class="token punctuation">.</span>type<span class="token punctuation">.</span><span class="token function">match</span><span class="token punctuation">(</span><span class="token regex"><span class="token regex-delimiter">/</span><span class="token regex-source language-regex">image.*</span><span class="token regex-delimiter">/</span></span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> files<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>clipData<span class="token punctuation">.</span>items<span class="token punctuation">[</span>key<span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">getAsFile</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> $scope<span class="token punctuation">.</span>attachmentHandler<span class="token punctuation">.</span><span class="token function">onFileSelect</span><span class="token punctuation">(</span>files<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span></code></pre>
RIP Wiki2017-12-09T03:04:03Zhttps://jace.pro/post/2017-12-08-rip-wiki/Jace Benson<!--StartFragment-->
<p>With all the announcements that ServiceNow is ending their Wiki, it makes me a little sad. I had once contributed to the pages before it locked down. With that being said, I learned a lot from the wiki. This was the second best resource next to the old joomla forum.</p>
<p>A lot of nights at my help desk job I remember visiting the "Recent Changes" to see new features that were made before they could get locked down. I found ServiceNow updates a little earlier than I should have because of this.</p>
<p>To get ready for this post I looked at the wayback machine to remember.</p>
<p>ServiceNow Wiki, you will be missed.</p>
<p>Take a look into the past</p>
<h2><a href="https://github.com/jacebenson/jace.pro/blob/master/src/post/2017-12-08-rip-wiki/index.md#wiki-2006"></a>Wiki ~2006</h2>
<p><img src="https://jace.pro/static/img/rip-wiki-2007.png" alt="ServiceNow Wiki's site (mediawiki) 2007" title="ServiceNow Wiki's site (mediawiki) 2007" /></p>
<p><a href="https://web.archive.org/web/20060818164044/http://wiki.service-now.com:80/index.php?title=Main_Page">wiki.service-now.com circa 2006</a></p>
<h2><a href="https://github.com/jacebenson/jace.pro/blob/master/src/post/2017-12-08-rip-wiki/index.md#wiki-2012"></a>Wiki ~2012</h2>
<p><img src="https://jace.pro/static/img/rip-wiki-2012.png" alt="ServiceNow Wiki's site (mediawiki) 2012" title="ServiceNow Wiki's site (mediawiki) 2012" /></p>
<p><a href="https://web.archive.org/web/20120630005208/http://wiki.servicenow.com:80/index.php?title=Main_Page">wiki.servicenow.com circa 2012</a></p>
<h2><a href="https://github.com/jacebenson/jace.pro/blob/master/src/post/2017-12-08-rip-wiki/index.md#wiki-2017"></a>Wiki ~2017</h2>
<p><img src="https://jace.pro/static/img/rip-wiki-2017.png" alt="ServiceNow Wiki's site (mediawiki) 2017" title="ServiceNow Wiki's site (mediawiki) 2017" /></p>
<p><a href="https://web.archive.org/web/20171208185714/http://wiki.servicenow.com/index.php?title=Main_Page#gsc.tab=0">wiki.serivcenow.com circa 2017</a></p>
<!--EndFragment-->ServiceNow licensing (circa 2017)2017-12-03T03:03:53Zhttps://jace.pro/post/2017-12-02-licensing/Jace Benson<!--StartFragment-->
<p>This is out of date. This was written in 2017 and it's been years since then. Models have changed some but I am keeping this post up as it may be useful to some. If you have licensing details you would like to share I'd love to hear about them. If you have public sources I'm even more curious. Reach out to me!</p>
<h2>Original Content</h2>
<p>Before I say anything about ServiceNow Licensing is that your milage may vary and you'll need to ask your account representative or sales representative to get the correct answer about if something is or is not included with your license.</p>
<p>With that being said, ServiceNow's licensing has a been a pain point for some on the community for years. As of 2017-10-17 theres a lot of information and since every company has it's own contract with ServiceNow, it seems they don't generally reply officially to any of them, however I'll try to aggregate the important bits below.</p>
<table>
<thead>
<tr>
<th>Question</th>
<th>Related info</th>
<th>Link</th>
</tr>
</thead>
<tbody>
<tr>
<td>What roles exist for most Products SN licenses?</td>
<td>There are generally three roles; Requesters, Approvers, *Fulfillers-</td>
<td>Communigy ThreadWiki Link to Counting Licenses</td>
</tr>
</tbody>
</table>
<p>The documentation about their licensing is this old <a href="https://web.archive.org/web/20160924200229/http://wiki.servicenow.com:80/index.php?title=Counting_Licensed_Users">wiki page</a>.</p>
<p>Publicly available licensing information</p>
<p>With that being said, this information is based on the sources I found publicly available via <a href="http://lmgtfy.com/?q=service-now.com+agreement+filetype%3Apdf">Google</a>. I found the following with that exact search;</p>
<ul>
<li>
<p><a href="http://rivcocob.org/agenda/2016/03_29_16_files/03-27.pdf">City of Riverside, CA</a> (page 8)</p>
</li>
<li>
<p><a href="http://www.douglas.co.us/archives/documents/contracts/2013_fourthqtr/Contract%20Copies/Service%20Now-533130.pdf">Douglas County Colorado</a></p>
</li>
<li>
<p>Enterprise</p>
<ul>
<li><a href="https://ociowa.atlassian.net/wiki/download/attachments/14614532/OCIO%20UA%20thru%20CC%20%20051915.pdf?api=v2">WA Office of the Chief Information Officer Office</a></li>
<li><a href="https://www.carahsoft.com/application/files/9414/3569/2932/ServiceNow_EULA.PDF">Carahsoft</a></li>
<li><a href="http://das.ohio.gov/Portals/0/DASDivisions/InformationTechnology/IS/Telecom/ServiceNow/ServiceNow%20OSU%20Subscription%20License%20Agreement%207-17-08.pdf">Ohio State University Medical Center</a></li>
</ul>
</li>
<li>
<p>Express</p>
<ul>
<li><a href="https://www.tulsacounty.org/agendalinks/BOCC112116/Agreement-%20IT-%20ServiceNow,%20Inc.pdf">Tulsa County</a></li>
</ul>
</li>
</ul>
<h2><a href="https://github.com/jacebenson/jace.pro/blob/master/src/post/2017-12-02-licensing/index.md#taxonomy-and-user-types"></a>Taxonomy and User Types</h2>
<p>ServiceNow sells six standard offerings. All customers must first purchase one of the below standard offerings.</p>
<ol>
<li>ServiceNow Service Suite -- Comprised of ServiceNow developed applications designed to address the core ITIL framework use cases (Incident, Problem, Change, Release, Request, Asset, IT Cost) as well as ServiceNow developed applications designed to address the service delivery needs of other organizations within the enterprise, including HR, Facilities, Field Service, Finance, Legal and Marketing.</li>
<li>ServiceNow Project Portfolio Suite -- ServiceNow developed applications (SDLC, Project Portfolio, Resource, Demand, Test) that cover the portfolio planning, test and development processes.</li>
<li>ServiceNow IT Business Suite -- ServiceNow developed applications (IT GRC, Vendor) designed to govern and measure the business of IT.</li>
<li>ServiceNow IT Financial Application -- ServiceNow developed application designed to provide insight into spend for CIO's seeking to align investment to business goals.</li>
<li>ServiceNow CreateNow Development Suite -- The licensing for customers to build their own applications on top of the Service Automation Platform.</li>
<li>ServiceNow Service Suite With CreateNow -- Comprised of ServiceNow Service Suite plus</li>
</ol>
<p>CreateNow to provide customers the most flexibility to utilize ServiceNow developed applications "out of the box" as well as build their own applications on top of the Service Automation Platform -- including the capability to create service applications from a template. Once one of the above standard offerings is purchased, there are a number of options and add ons available that extend the customer's ServiceNow investment:</p>
<ul>
<li>
<p>ServiceNow Orchestration Core Enables the customer to orchestrate activities outside the customer's ServiceNow environment. OrchestrationCore:</p>
<ul>
<li>Allows customers to automate discrete tasks or processes that interact with external systems or services. (This capability includes "Orchestration Activities").</li>
<li>Includes Orchestration Activity Packs for Microsoft Active Directory, Exchange, PowerShell and SSH.</li>
<li>Provides the capability to manage the configuration settings of a physical or virtual server. (This capability includes "Orchestration Configuration Automation Application")</li>
<li>Provides the capability to reset User's passwords that are stored and pre authenticated in a credential store outside Customer's instance (e.g. Active Directory). (Before Fuji, this capability had been "Orchestration Password Reset Application" -- a separate ServiceNow Orchestration Add on product.)</li>
</ul>
</li>
<li>
<p>ServiceNow Orchestration Cloud Provisioning Application -- Cloud provisioning package to manage the life-cycle of provisioning virtual and/or public cloud infrastructure. (Requires purchase of Orchestration Core). Includes VMware vSphere and Amazon EC2 Activity Packs</p>
</li>
<li>
<p>ServiceNow Orchestration Event Application -- Dynamically creates alerts from infrastructure events generated by third party monitoring tools.</p>
</li>
<li>
<p>ServiceNow ServiceWatch - ServiceWatch discovers and maps business services, creating and maintaining a service-centric CMDB. Subsequently, it monitors the nodes and relationships between the nodes that make up each service as well as the performance and availability of each business service.</p>
</li>
<li>
<p>ServiceNow IT Operations (ITOM) Suite -- Complete ITOM offering which includes OrchestrationCore, Cloud Provisioning, Event and ServiceWatch Applications.</p>
</li>
<li>
<p>ServiceNow Discovery -- Locates physical and virtual devices connected to an enterprise network and identifies the relationships between those devices, as well as identifies the software installed on each.</p>
</li>
<li>
<p>ServiceNow Performance Analytics -- Provides advanced analytics and time series analysis for key performance indicators(KPIs.)</p>
</li>
<li>
<p>Public Catalog -- Supports service catalog deployments that extend outside the organization to an unknown number of Requesters.</p>
</li>
</ul>
<h3><a href="https://github.com/jacebenson/jace.pro/blob/master/src/post/2017-12-02-licensing/index.md#user-types-for-standard-packages"></a>User Types for Standard Packages</h3>
<p>Every employee or contractor given access to the subscription service by the customer must be assigned a unique username and password that may not be shared or transferred. Employees and contractors that have a user profile in the subscription service which is not designated as "active" may not be given access to the subscription service. The following describes the types of users required for each subscription model:</p>
<ul>
<li>Fulfillers: (formerly referred to as process users): Fulfillers have full admin, developer, or usage rights within a purchased offering. This includes the creation, editing, or deletion of any record in the system. A Fulfiller is any user given a role in the subscription service by the customer other than the Approver role.</li>
<li>Requesters: (formerly referred to as end users): Requesters create, edit, and view their own requests. Requests can be submissions through the service catalog or incidents submitted through the ServiceNow web or mobile interfaces. They can also access the ServiceNow Knowledge Base to perform self service. A Requester is any user checked as "active" on his or her user profile in the subscription service other than a Fulfiller or Approver.</li>
<li>Approvers: Approvers can do everything a Requester does as well as approve or deny a record routed to the user (including adding related comments/work notes, however no other field may be modified). The Approver may perform the functionalities listed below for any approval generated via a ServiceNow built or custom built application. An Approver is any user given the ServiceNow provided "Approver" role in the subscription service by the customer and no other role.</li>
</ul>
<h2><a href="https://github.com/jacebenson/jace.pro/blob/master/src/post/2017-12-02-licensing/index.md#non-user-licensing"></a>Non-user Licensing</h2>
<table>
<thead>
<tr>
<th>Thing</th>
<th>Cost per</th>
<th>Subscribed</th>
</tr>
</thead>
<tbody>
<tr>
<td>Performance Analytics</td>
<td></td>
<td></td>
</tr>
<tr>
<td>Notify</td>
<td></td>
<td></td>
</tr>
<tr>
<td>Discovery</td>
<td>Discovered Server</td>
<td>Yes</td>
</tr>
<tr>
<td>Orchestration Core</td>
<td>Running Node</td>
<td>Yes</td>
</tr>
<tr>
<td>Orchestration Cloud provisioning</td>
<td></td>
<td></td>
</tr>
<tr>
<td>Orchestration (new model)</td>
<td>Per transaction</td>
<td></td>
</tr>
<tr>
<td>Event</td>
<td>Something</td>
<td>Yes</td>
</tr>
<tr>
<td>ServiceWatch</td>
<td></td>
<td></td>
</tr>
<tr>
<td>IT Operations (ITOM)</td>
<td></td>
<td></td>
</tr>
<tr>
<td>Public Catalog</td>
<td></td>
<td></td>
</tr>
<tr>
<td>Password reset (part of ITOM)</td>
<td>10k resets/yr</td>
<td>Yes</td>
</tr>
</tbody>
</table>
<h3><a href="https://github.com/jacebenson/jace.pro/blob/master/src/post/2017-12-02-licensing/index.md#service-suite"></a>Service Suite</h3>
<p>The Service Suite is designed to address service requirements in any service domain including:</p>
<ul>
<li>
<p>Core ITIL framework use case applications, formerly contained in the "IT Service Automation Suite" and now referred to as "IT Service" applications. Included are Incident, Problem, Change, Release, Request, Asset, and IT Cost.</p>
</li>
<li>
<p>Service delivery needs of other organizations within the enterprise having workflow / case requirements, including:</p>
<ul>
<li>HR Service Streamlines HR service delivery by offering a self service catalog to users and out-of-the-box request and fulfill process automation. The HR specific service catalog presents predefined items for services such as benefits or employee relations to employees.</li>
<li>Facilities Service Simplifies facilities service delivery by offering a self service catalog to users containing out of the box request, and automating the assignment and fulfillment process. The facilities specific service catalog presents pre defined items for services such as security or HVAC to employees.</li>
<li>Field Service Enables the of work requested and assigned to remote or mobile field technicians.</li>
<li>Finance Service Enables the finance department to define its services and fulfill requests -- including financial reports, procurement and payroll queries through workflow capabilities and knowledge; provides visibility into resource utilization and service delivery performance through dashboards.</li>
<li>Legal Service Enables the legal department to define its services and fulfill requests -- including contracts, legal research and policy queries through workflow capabilities and knowledge; provides visibility into resource utilization and service delivery performance through dashboards.</li>
<li>Marketing Service Enables the marketing department to define its services and fulfill requests --including creative services, campaign operations and website publishing through workflow capabilities and knowledge; provides visibility into resource utilization and service delivery performance through dashboards.</li>
</ul>
</li>
</ul>
<h3><a href="https://github.com/jacebenson/jace.pro/blob/master/src/post/2017-12-02-licensing/index.md#service-suite-with-createnow"></a>Service Suite With CreateNow</h3>
<p>The Service Suite With CreateNow is comprised of everything in the Service Suite and also includes CreateNow custom application development use rights. This combination provides customers with the most flexibility because they can utilize ServiceNow developed service applications "out of the box" as well as build their own applications on top of the Service Automation Platform. CreateNow use rights are required to utilize the Service Suite capability to create service applications from a template.</p>
<h3><a href="https://github.com/jacebenson/jace.pro/blob/master/src/post/2017-12-02-licensing/index.md#project-portfolio-suite"></a>Project Portfolio Suite</h3>
<p>The Project Portfolio Suite addresses the prioritization and delivery of projects and services. This suite provides support for both waterfall and agile methodologies including Scrum. Included in this package are Project Portfolio, Resource, Demand, Test and Software Development Lifecycle (SDLC).</p>
<h3><a href="https://github.com/jacebenson/jace.pro/blob/master/src/post/2017-12-02-licensing/index.md#it-business-suite"></a>IT Business Suite</h3>
<p>The IT Business Suite (ITBM) extends the ServiceNow portfolio by providing the compliance and performance metrics necessary to manage IT services. Included in this package are Governance, Risk, and Compliance (GRC), andVendor Performance .</p>
<h3><a href="https://github.com/jacebenson/jace.pro/blob/master/src/post/2017-12-02-licensing/index.md#it-financial-application"></a>IT Financial Application</h3>
<p>In addition to the application suites listed above, ServiceNow separately offers IT Financial built on the complete Service Automation Platform. IT Financial is a ServiceNow developed application designed to provide insight into spend for CIO's seeking to align investment to business goals. Users can classify general ledger records, define a reporting structure, define allocation rules and view summary reports. The IT Financial application is independently subscribed to based on the numbers of users required. IT Financial is a strategic product that adds valuable insight on spend for a very small number of key individuals, such asthe CIO, CFO and business unit IT VPs, with pricing reflecting that value.</p>
<h2><a href="https://github.com/jacebenson/jace.pro/blob/master/src/post/2017-12-02-licensing/index.md#user-licensing"></a>User Licensing</h2>
<table>
<thead>
<tr>
<th>Application</th>
<th>Service Mgt</th>
<th>Service Mgt Createnow</th>
<th>Project Portfolio</th>
<th>Business Mgt</th>
<th>Finance Mgt</th>
<th>Create Now</th>
</tr>
</thead>
<tbody>
<tr>
<td>Incident</td>
<td>Included</td>
<td>Included</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Problem</td>
<td>Included</td>
<td>Included</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Change</td>
<td>Included</td>
<td>Included</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Release</td>
<td>Included</td>
<td>Included</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Asset</td>
<td>Included</td>
<td>Included</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Request</td>
<td>Included</td>
<td>Included</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>IT Cost</td>
<td>Included</td>
<td>Included</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Project Portfolio</td>
<td></td>
<td></td>
<td>Included</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Resource</td>
<td></td>
<td></td>
<td>Included</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Demand</td>
<td></td>
<td></td>
<td>Included</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Software Development Lifecycle</td>
<td></td>
<td></td>
<td>Included</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Test</td>
<td></td>
<td></td>
<td>Included</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>IT Governance, Risk, and Compliance</td>
<td></td>
<td></td>
<td></td>
<td>Included</td>
<td></td>
<td></td>
</tr>
<tr>
<td>Vendor Performance</td>
<td></td>
<td></td>
<td></td>
<td>Included</td>
<td></td>
<td></td>
</tr>
<tr>
<td>HR Service</td>
<td>Included</td>
<td>Included</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Facilities Service</td>
<td>Included</td>
<td>Included</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Field Service</td>
<td>Included</td>
<td>Included</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Finance Service</td>
<td>Included</td>
<td>Included</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Legal Service</td>
<td>Included</td>
<td>Included</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Marketing Service</td>
<td>Included</td>
<td>Included</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>IT Financial</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td>Included</td>
<td></td>
</tr>
<tr>
<td>Custom Application Development</td>
<td></td>
<td>Included</td>
<td></td>
<td></td>
<td></td>
<td>Included</td>
</tr>
<tr>
<td>Service Automation Platform</td>
<td>Included</td>
<td>Included</td>
<td>Included</td>
<td>Included</td>
<td>Included</td>
<td>Included</td>
</tr>
</tbody>
</table>
<blockquote>
<p>Note Licensing here means they are a Fulfiller below! Also Custom App means can use any number of custom applications e.g. regular old u_tables, or scoped applications Project with financial plugins - is different</p>
</blockquote>
<h2><a href="https://github.com/jacebenson/jace.pro/blob/master/src/post/2017-12-02-licensing/index.md#what-requires-a-role"></a>What requires a Role</h2>
<table>
<thead>
<tr>
<th>Function</th>
<th>Requester</th>
<th>Time Card</th>
<th>Approver</th>
<th>Fulfiller</th>
</tr>
</thead>
<tbody>
<tr>
<td>Create one's own request</td>
<td>Included</td>
<td>Included</td>
<td>Included</td>
<td>Included</td>
</tr>
<tr>
<td>View one's own request</td>
<td>Included</td>
<td>Included</td>
<td>Included</td>
<td>Included</td>
</tr>
<tr>
<td>Modify one's own request</td>
<td>Included</td>
<td>Included</td>
<td>Included</td>
<td>Included</td>
</tr>
<tr>
<td>Search the Service Catalog</td>
<td>Included</td>
<td>Included</td>
<td>Included</td>
<td>Included</td>
</tr>
<tr>
<td>Search the Knowledge Base</td>
<td>Included</td>
<td>Included</td>
<td>Included</td>
<td>Included</td>
</tr>
<tr>
<td>Access public pages</td>
<td>Included</td>
<td>Included</td>
<td>Included</td>
<td>Included</td>
</tr>
<tr>
<td>Take Surveys</td>
<td>Included</td>
<td>Included</td>
<td>Included</td>
<td>Included</td>
</tr>
<tr>
<td>Set one's own notification preferences</td>
<td>Included</td>
<td>Included</td>
<td>Included</td>
<td>Included</td>
</tr>
<tr>
<td>View assets assigned to user</td>
<td>Included</td>
<td>Included</td>
<td>Included</td>
<td>Included</td>
</tr>
<tr>
<td>Access and post to Live Feed</td>
<td>Included</td>
<td>Included</td>
<td>Included</td>
<td>Included</td>
</tr>
<tr>
<td>Initiate Chat Sessions</td>
<td>Included</td>
<td>Included</td>
<td>Included</td>
<td>Included</td>
</tr>
<tr>
<td>Participate in a Watch List</td>
<td>Included</td>
<td>Included</td>
<td>Included</td>
<td>Included</td>
</tr>
<tr>
<td>View a report published to them</td>
<td>Included</td>
<td>Included</td>
<td>Included</td>
<td>Included</td>
</tr>
<tr>
<td>Approve requests routed to user via email</td>
<td></td>
<td>Included</td>
<td>Included</td>
<td>Included</td>
</tr>
<tr>
<td>Update and submit one's own time card</td>
<td></td>
<td>Included</td>
<td></td>
<td>Included</td>
</tr>
<tr>
<td>View/Approve requests routed to user via system</td>
<td></td>
<td>Included</td>
<td>Included</td>
<td>Included</td>
</tr>
<tr>
<td>Create any record</td>
<td></td>
<td></td>
<td></td>
<td>Included</td>
</tr>
<tr>
<td>Delete any record</td>
<td></td>
<td></td>
<td></td>
<td>Included</td>
</tr>
<tr>
<td>Modify any record</td>
<td></td>
<td></td>
<td></td>
<td>Included</td>
</tr>
<tr>
<td>Drill through any report</td>
<td></td>
<td></td>
<td></td>
<td>Included</td>
</tr>
<tr>
<td>Create any report</td>
<td></td>
<td></td>
<td></td>
<td>Included</td>
</tr>
<tr>
<td>Delete any report</td>
<td></td>
<td></td>
<td></td>
<td>Included</td>
</tr>
<tr>
<td>Modify any report</td>
<td></td>
<td></td>
<td></td>
<td>Included</td>
</tr>
<tr>
<td>Perform development activities</td>
<td></td>
<td></td>
<td></td>
<td>Included</td>
</tr>
<tr>
<td>Perform Administrative activities</td>
<td></td>
<td></td>
<td></td>
<td>Included</td>
</tr>
</tbody>
</table>
<h2><a href="https://github.com/jacebenson/jace.pro/blob/master/src/post/2017-12-02-licensing/index.md#related-reading"></a>Related reading;</h2>
<ul>
<li>Cost of extending tables: <a href="https://web.archive.org/web/20170224171442/servicenow.implementation.blog/financial-implications-of-extending-tables">https://servicenow.implementation.blog/financial-implications-of-extending-tables/</a></li>
<li>Custom Table Guide: <a href="https://www.servicenow.com/content/dam/servicenow-assets/public/en-us/doc-type/legal/custom-table-guide.pdf">https://www.servicenow.com/content/dam/servicenow-assets/public/en-us/doc-type/legal/custom-table-guide.pdf</a></li>
</ul>
<!--EndFragment-->Automated Testing (ATF) opinions2017-12-03T02:02:50Zhttps://jace.pro/post/2017-12-02-atf-thoughts/Jace Benson<p>This is a list of items I think the ATF Tests should include.</p>
<p>I think every test should have the following steps;</p>
<ul>
<li>Create users to use to for test (Server>Insert Record on sys_user)</li>
<li>Create role(s) for the newly created user, as you may not always
know a good user to test as.(Server>Insert Record on
sys_user_has_role)</li>
<li>Impersonate the user(Server>Impersonate)</li>
<li>Use Server>Record Validation to test most field values</li>
<li>Use Form validation for User Experience testing.</li>
</ul>
<p>Tests should also follow these as well</p>
<ul>
<li>Track Tests in update set with the code</li>
<li>Group Tests by tag. Tag for Application, Testing Schedule, and
Feature/Effort/Sprint</li>
<li>Tests should be small units to test and not dependent on eachother.</li>
<li>Tests should be part of the estimate of work when sizing work.</li>
<li>Tests should run on a schedule.</li>
</ul>
<p><a href="https://community.servicenow.com/community?id=community_blog&sys_id=1a4e66addbd0dbc01dcaf3231f96192f">Community Blog</a>
for further reading.</p>
<p><a href="https://www.servicenow.com/content/dam/servicenow-assets/public/en-us/doc-type/other-document/nowforum/sydney/hands-on-lab2-automated-testing-framework.pdf">Further Reading</a></p>
<ul>
<li><a href="https://jace.pro/post/2017-12-02-atf-thoughts/hands-on-lab2-automated-testing-framework.pdf">Saved Off on 2018-12-26</a></li>
</ul>
ServiceNow Learning2017-11-30T03:03:34Zhttps://jace.pro/post/2017-11-29-learning/Jace Benson<!--StartFragment-->
<p>This post is a extension of this <a href="https://community.servicenow.com/community?id=community_blog&sys_id=f10eaa2ddbd0dbc01dcaf3231f961925">post</a>. Below I go over the videos, and the interactive site.</p>
<h2>Official Documentation</h2>
<p>There's 2 places that have this;</p>
<ul>
<li><a href="https://docs.servicenow.com/">Docs</a></li>
<li><a href="https://developer.servicenow.com/">Developer</a></li>
</ul>
<h2>Foundations eLearning (videos)</h2>
<p>The foundations course covers six modules. You will get an introduction and overview of how to interact with and navigate through this Foundations course. It also covers on how to navigate using filters and breadcrumbs and what you can see and do as a System Administrator.</p>
<p>Both of these end up on the same videos as listed in sub sections.</p>
<ul>
<li><a href="https://www.servicenow.com/services/training-and-certification/foundations-elearning.html">ServiceNow Foundations eLearning</a></li>
<li><a href="https://community.servicenow.com/community?id=community_article&sys_id=a2dc2a65dbd0dbc01dcaf3231f96197e">ServiceNow Foundations Videos</a></li>
</ul>
<h3>User Experience</h3>
<ul>
<li><a href="https://www.youtube.com/watch?v=yDmGTeEDp5g">What is ServiceNow and How Can It Help Me Do My Job?</a></li>
<li><a href="https://www.youtube.com/watch?v=FiDEWppxPdQ">Quick Tour of the ServiceNow Platform</a></li>
<li><a href="https://www.youtube.com/watch?v=8hXXvimSw5c">How to Request Something</a></li>
<li><a href="https://www.youtube.com/watch?v=cCFPFqcAftk">How to Report an Issue</a></li>
<li><a href="https://www.youtube.com/watch?v=Ly3wjS0W4RI">How to Use the Knowledge Base</a></li>
</ul>
<h3>Getting Started</h3>
<ul>
<li><a href="https://www.youtube.com/watch?v=CHlGvbqirQs">Platform Architecture</a></li>
<li><a href="https://www.youtube.com/watch?v=IFBNuBQsip0">Platform Applications</a></li>
<li><a href="https://www.youtube.com/watch?v=wSqg05k65Ew">Tables, Records, and Fields</a></li>
<li><a href="https://www.youtube.com/watch?v=RPUCUwvpfPE">Locating Resources</a></li>
</ul>
<h3>User Interface</h3>
<ul>
<li><a href="https://www.youtube.com/watch?v=ZG3bHNEuaGY">Overview</a></li>
<li><a href="https://www.youtube.com/watch?v=sHdX575mPhk">Application Navigator</a></li>
<li><a href="https://www.youtube.com/watch?v=a2ylc__MEl0">Lists</a></li>
<li><a href="https://www.youtube.com/watch?v=2Eq2oxVllOU">Forms</a></li>
</ul>
<h3>Process User and Manager Capabilities</h3>
<ul>
<li><a href="https://www.youtube.com/watch?v=9qWgCOx50Tk">Getting Started with the ITIL Role</a></li>
</ul>
<h3>System Configuration</h3>
<ul>
<li><a href="https://www.youtube.com/watch?v=w_WYRJJ7Sho">Performing Basic Setup in your instance</a></li>
<li><a href="https://www.youtube.com/watch?v=EofCa_bXy28">Application Menus and Modules</a></li>
<li><a href="https://www.youtube.com/watch?v=147I32N8hyk">Form Layout and Design</a></li>
<li><a href="https://www.youtube.com/watch?v=bc5EUz51qu4">Overview Pages(Homepages)</a></li>
<li><a href="https://www.youtube.com/watch?v=VUQwql3Rki8">Business Rules</a></li>
<li><a href="https://www.youtube.com/watch?v=C2FMo3l1swk">Inbound Email Actions and Notifications</a></li>
</ul>
<h3>Service Catalog</h3>
<ul>
<li><a href="https://www.youtube.com/watch?v=Q25mSVIycaQhttp://">Service Catalog Administration Overview</a></li>
<li><a href="http://www.youtube.com/watch?v=tWnC37-UmqA">Creating Service Catalog Categories</a></li>
<li><a href="https://www.youtube.com/watch?v=mVGOzQcNme0">Creating Service Catalog Items</a></li>
<li><a href="https://www.youtube.com/watch?v=zeaOTmDmLf4">Creating Service Catalog Record Producers</a></li>
<li><a href="https://www.youtube.com/watch?v=2_Fvw5wqRD8">Creating Service Catalog Execution Plans and Workflows</a></li>
</ul>
<h3>IT Service Management</h3>
<ul>
<li><a href="https://www.youtube.com/watch?v=ryxjWBOq3sQ">Incident Management</a></li>
<li><a href="https://www.youtube.com/watch?v=3f_v7HqRgM0">Change Management</a></li>
<li><a href="https://www.youtube.com/watch?v=Ux1fub8KzT0">Problem Management</a></li>
</ul>
<h2>Community and Chat</h2>
<p>Need to talk to someone, the community has people on it all the time.</p>
<ul>
<li><a href="https://discord.gg/QaMwnGd">Discord</a></li>
<li><a href="https://sndevs.slack.com/">Slack</a></li>
<li><a href="https://community.servicenow.com/">Community</a></li>
</ul>
<h2>Get a Developer Instance</h2>
<p>You can get your own instance to mess around from <a href="https://developer.service-now.com/">developer.service-now.com</a>. This is required for the Developer training courses.</p>
<h2>Developer Training Courses (interactive)</h2>
<p>Self-paced developer training modules are available with the ServiceNow Developer program. They are step-by-step, guides on how parts of the platform work.</p>
<p><a href="https://developer.servicenow.com/connect.do#!/training/landing">Landing Page</a></p>
<p>This interactive course seems to have these items;</p>
<ul>
<li><a href="https://developer.servicenow.com/connect.do#!/trainlist/app_store_learn_dev_site_walkthrough_kingston_c_DeveloperSiteIntro">Developer Site Walkthrough</a></li>
<li><a href="https://developer.servicenow.com/connect.do#!/trainlist/app_store_learnv2_buildneedit_kingston_build_the_needit_application?v=kingston">Build the NeedIt Application</a></li>
<li><a href="https://developer.servicenow.com/connect.do#!/trainlist/app_store_learnv2_securingapps_kingston_securing_applications?v=kingston">Securing Applications</a></li>
<li><a href="https://developer.servicenow.com/connect.do#!/trainlist/app_store_learnv2_automatingapps_kingston_automating_application_logic?v=kingston">Automating Application logic</a></li>
<li><a href="https://developer.servicenow.com/connect.do#!/trainlist/app_store_learnv2_atf_kingston_automated_test_framework?v=kingston">Automated Test Framework</a></li>
<li><a href="https://developer.servicenow.com/connect.do#!/trainlist/app_store_learnv2_angularjs_kingston_building_apps_with_angularjs?v=kingston">Building Apps with AngularJS</a></li>
<li><a href="https://developer.servicenow.com/connect.do#!/trainlist/app_store_learnv2_buildmyfirstapp_kingston_build_my_first_application?v=kingston">Build My First Application</a></li>
<li><a href="https://developer.servicenow.com/connect.do#!/trainlist/app_store_learnv2_scripting_kingston_scripting_in_servicenow?v=kingston">Scripting in ServiceNow</a></li>
<li><a href="https://developer.servicenow.com/connect.do#!/trainlist/app_store_learnv2_importingdata_kingston_importing_data_into_servicenow?v=kingston">Importing Data into ServiceNow</a></li>
<li><a href="https://developer.servicenow.com/connect.do#!/trainlist/app_store_learnv2_rest_kingston_rest_integrations?v=kingston">REST Integrations</a></li>
<li><a href="https://developer.servicenow.com/connect.do#!/trainlist/app_store_learnv2_serviceportal_kingston_service_portal?v=kingston">Service Portal</a></li>
</ul>
<h2>YouTube Channels</h2>
<ul>
<li><a href="https://community.servicenow.com/community?id=community_blog&sys_id=4d6eaeaddbd0dbc01dcaf3231f961964">TechNow spans videos on two channels, NowCommunity, and Nowsupport</a></li>
<li><a href="https://community.servicenow.com/community?id=community_forum&sys_id=d6295a2ddbd897c068c1fb651f9619f1">Ask the Expert Sessions</a></li>
<li><a href="https://www.youtube.com/user/servicenowdemo">nowSupport</a></li>
<li><a href="https://www.youtube.com/user/ServiceNowCommunity">nowCommunity</a></li>
<li><a href="https://www.youtube.com/channel/UCdXorgCT87YlFRN9n8oJ7_A">ServiceNow Dev Program</a></li>
</ul>
<h2>Other Resources</h2>
<ul>
<li><a href="https://www.udemy.com/courses/search/?q=ServiceNow">Udemy ServiceNow System Admin and App Developer Udemy Courses</a></li>
<li><a href="https://quizlet.com/class/2490040/">System Administration Exam Flashcards</a></li>
<li><a href="https://quizlet.com/217493821/servicenow-application-developer-certification-flash-cards/">Application Developer Exam Flashcards</a></li>
<li><a href="https://www.classmarker.com/online-test/start/?quiz=yb752a207d482ecf">Practice Exam - Classmarker Practice Exam</a></li>
</ul>
<h2>Prepare for the certification</h2>
<table>
<thead>
<tr>
<th>Cert</th>
<th>Description</th>
<th>Blueprint</th>
</tr>
</thead>
<tbody>
<tr>
<td>CSA</td>
<td>Certified System Administrator</td>
<td><a href="https://www.servicenow.com/content/dam/servicenow/other-documents/training/servicenow-sys-admin-exam-specs.pdf">Blueprint</a></td>
</tr>
<tr>
<td>CAD</td>
<td>Certified Application Developer</td>
<td><a href="https://www.servicenow.com/content/dam/servicenow/other-documents/training/blueprint-cad-kingston.pdf">Blueprint</a></td>
</tr>
</tbody>
</table>
<p>ServiceNow has lots certifications now and they people interept them differently.<br />
Ultimately they show the following about the person</p>
<ul>
<li>They are willing to pay some money</li>
<li>They are willing to take a class</li>
<li>They are willing to take a test and pass</li>
<li>They are willing to take a quiz each family release</li>
<li>They are willing to pay a renewal fee every two years</li>
</ul>
<p><code>*</code> No Certification Documentation could be found, but it's listed as if one exists <a href="https://www.servicenow.com/content/dam/servicenow/other-documents/training/tp-certification-guide.pdf">on the Certification Guide</a>.</p>
<h2><a href="https://github.com/jacebenson/jace.pro/blob/master/src/post/2017-11-29-learning/index.md#taking-the-certification"></a>Taking the certification</h2>
<p>Update [July 1, 2018]: As of 7/1/2018, its stated you need to take the class before testing for the certification. The webassesor link still works and lists the classes for me.</p>
<p>ServiceNow uses onsite testing and at home testing. For the at home testing you'll need a detached webcam.</p>
<p>The cost is $150 per certification.</p>
<p>The CSA and CAD certification has a 90 minute time limit. The rest have a 130 minute time limit.</p>
<p><a href="https://www.webassessor.com/wa.do?page=publicHome&branding=SERVICE_NOW">Webassesor site to register</a></p>
<!--EndFragment-->
How event processors work2017-11-30T03:03:18Zhttps://jace.pro/post/2017-11-29-how-event-processors-work/Jace Benson<!--StartFragment-->
<p>Here's my understanding of how the <code>sys_trigger</code> "process events" works, also known as the <strong>event processor</strong>.</p>
<p>Frequently it wakes a Java process that reads the <code>sysevent</code> table.</p>
<p>It looks for events which have no named queue where the process date is in the past which have no "claimed by" yet and are in a state of ready. It orders by "process on" and limits to 100 at a time.</p>
<p>The 100 "oldest" unprocessed events are claimed and a worker start going through them sequentially. As they are completed, the state changes. When all 100 are done, the thread goes back to slep and waits to be woken again by the scheduled job.</p>
<p>Now there are a couple "process event" records. You can also write your own. This <a href="https://community.servicenow.com/community?id=community_question&sys_id=db344b29dbd8dbc01dcaf3231f9619b4#874843">community post</a> goes over the items you need;</p>
<p>These sys_trigger records are ephemeral it seems, one runs and it spawns another and the old one is deleted</p>
<ol>
<li>
<p>Trigger the event server-side with a queue;</p>
</li>
<li>
<p>Insert a new record as a copy of the original "events process" job where you change the script.</p>
<pre><code>/* from */
fcScriptName=javascript\\\\:gs.processDelegatedEvents();
/* to */
fcScriptName=javascript\\\\:gs.processDelegatedEvents('my_queue_name');
</code></pre>
</li>
</ol>
<h2>Extra Sources</h2>
<ul>
<li><a href="https://support.servicenow.com/kb?id=kb_article_view&sysparm_article=KB0676909">KB0676909</a></li>
</ul>
<!--EndFragment-->What is the 'Megaphone' application?2017-11-11T03:03:09Zhttps://jace.pro/post/2017-11-10-megaphone/Jace Benson<!--StartFragment-->
<p>Megaphone is some hidden application ServiceNow made but didn't release.</p>
<p>This is not visible unless you change the module roles from <code>maint</code> to <code>admin</code>.</p>
<p>This uses the table, <code>sys_broadcast_message</code> and that creates a message as depicted in this <a href="https://community.servicenow.com/community?id=community_question&sys_id=64cfcb65dbdcdbc01dcaf3231f9619f6&anchor=answer_7a0c6be1db181fc01dcaf3231f9619e7&view_source=searchResult">thread</a>.</p>
<p><img src="https://jace.pro/static/img/2017-megaphone.png" alt="Screenshot of a form for the hidden Megaphone application in ServiceNow" title="Screenshot of a form for the hidden Megaphone application in ServiceNow" /></p>
<!--EndFragment-->Intake Processes I've Seen2017-11-11T03:02:58Zhttps://jace.pro/post/2017-11-10-intake/Jace Benson<!--StartFragment-->
<p>This is the different team intake processes I've seen during my work with ServiceNow.</p>
<h1>Intake Process</h1>
<h2>Light Agile</h2>
<p>This process is in use by a team of three developers running two sprints on a two week span. Each member is rotated through the support sprint every third week.</p>
<h3>Light Agile Sprint Ceremonies</h3>
<table>
<thead>
<tr>
<th>Ceremonies</th>
<th>Frequency</th>
<th>Attendees</th>
</tr>
</thead>
<tbody>
<tr>
<td>Team Standup</td>
<td>Monday Every Week</td>
<td>Development Team and Manager</td>
</tr>
<tr>
<td>Team Standup</td>
<td>Wednesday, Thursday Every Week</td>
<td>Development Team</td>
</tr>
<tr>
<td>Planning</td>
<td>Wednesday Every Other Week</td>
<td>Development Team, Process Owners, Story Requestors</td>
</tr>
</tbody>
</table>
<h3>Light Agile Support Sprint</h3>
<table>
<thead>
<tr>
<th>Responsibilities</th>
<th>Frequency</th>
</tr>
</thead>
<tbody>
<tr>
<td>Handle Incoming incidents</td>
<td>As needed</td>
</tr>
<tr>
<td>Verify new story requirements</td>
<td>When available</td>
</tr>
<tr>
<td>Size new stories</td>
<td>When available</td>
</tr>
<tr>
<td>Split large stories into smaller ones</td>
<td>When available</td>
</tr>
<tr>
<td>Move update sets to test and sandbox</td>
<td>Every other Tuesday</td>
</tr>
<tr>
<td>Move update sets to production</td>
<td>Every other Wednesday</td>
</tr>
</tbody>
</table>
<h3>Light Agile Development Sprint</h3>
<table>
<thead>
<tr>
<th>Responsibilities</th>
<th>Frequency</th>
</tr>
</thead>
<tbody>
<tr>
<td>Assign Stories to self</td>
<td>When available</td>
</tr>
<tr>
<td>Develop Features</td>
<td>All the time</td>
</tr>
<tr>
<td>Update Story to UAT when done</td>
<td>When available</td>
</tr>
<tr>
<td>Pull in stories if sprint is short</td>
<td>When available</td>
</tr>
</tbody>
</table>
<h2>Heavy Agile Process</h2>
<p>This process is in use by a team of eight developers running one sprints on a three week span. Two members are rotated through the kanban group every four weeks.</p>
<h3>Heavy Agile Sprint Ceremonies</h3>
<table>
<thead>
<tr>
<th>Ceremonies</th>
<th>Frequency</th>
<th>Attendees</th>
</tr>
</thead>
<tbody>
<tr>
<td>Team Standup</td>
<td>Every day</td>
<td>Development Team, and Scrum Master</td>
</tr>
<tr>
<td>Planning</td>
<td>Wednesday Every Third Week</td>
<td>Development Team, Process Owners, and Product Owner</td>
</tr>
<tr>
<td>Retrospective</td>
<td>Tuesday Every First Week</td>
<td>Development Team, and Scrum Master</td>
</tr>
<tr>
<td>Sizing</td>
<td>As needed</td>
<td>Development Team, and Product Owner</td>
</tr>
</tbody>
</table>
<h3>Heavy Agile Kanban Group</h3>
<p>Product Owner sets importance of incoming work. Each lane or queue can have a predetermined number of items. When I was there were these four lanes:</p>
<ul>
<li>Ready</li>
<li>Working</li>
<li>User Acceptance Testing</li>
<li>Ready for Release</li>
</ul>
<p>This was to allow the Product Owner more flexibility to get work done outside the Scrum Process and to assist the Release Team.</p>
<h3>Heavy Agile Development Sprint</h3>
<table>
<thead>
<tr>
<th>Responsibilities</th>
<th>Frequency</th>
</tr>
</thead>
<tbody>
<tr>
<td>Assign Stories to self</td>
<td>When available</td>
</tr>
<tr>
<td>Develop Features</td>
<td>All the time</td>
</tr>
<tr>
<td>Update Story to UAT when done</td>
<td>When available</td>
</tr>
</tbody>
</table>
<h3>Heavy Agile Support and Release Group</h3>
<table>
<thead>
<tr>
<th>Responsibilities</th>
<th>Frequency</th>
</tr>
</thead>
<tbody>
<tr>
<td>Handle Incoming incidents</td>
<td>As needed</td>
</tr>
<tr>
<td>Move update sets to test and sandbox</td>
<td>Every other Tuesday</td>
</tr>
<tr>
<td>Move update sets to production</td>
<td>Every other Wednesday</td>
</tr>
</tbody>
</table>
<!--EndFragment-->Code Search2017-11-03T02:02:50Zhttps://jace.pro/post/2017-11-02-code-search/Jace Benson<!--StartFragment-->
<p>I've created one of these to improve on the one on <a href="https://share.servicenow.com/">share</a>. This is a scoped application for Service-now to allow easier searching all code sources.</p>
<p><img src="https://jace.pro/static/img/code-search.png" alt="Screenshot of the scoped application from 2017" title="Screenshot of the scoped application from 2017" /></p>
<h2><a href="https://github.com/jacebenson/jace.pro/blob/master/src/post/2017-11-02-code-search/index.md#features"></a>Features</h2>
<ul>
<li>Table of Contents of results</li>
<li>Inline code that is found</li>
<li>Sys ID Search</li>
</ul>
<h2><a href="https://github.com/jacebenson/jace.pro/blob/master/src/post/2017-11-02-code-search/index.md#setup"></a>Setup</h2>
<ol>
<li>Open Studio on your environment</li>
<li>Import from source</li>
<li>Paste in the following URL: <code>https://github.com/jacebenson/servicenow-code.git</code></li>
</ol>
<h2><a href="https://github.com/jacebenson/jace.pro/blob/master/src/post/2017-11-02-code-search/index.md#usage"></a>Usage</h2>
<p>After you import this, you can start to use it by navigating to <code>/code</code> on your instance.</p>
<!--EndFragment-->Discovery Affinity Issue2017-11-02T02:02:37Zhttps://jace.pro/post/2017-11-01-discovery-affinity-issue/Jace Benson<!--StartFragment-->
<p>If you are using discovery and credential affinity, and you have an IP address not updating appropriately, look at <code>dscy_credentials_affinity</code> for the ip address that should be set.</p>
<!--EndFragment-->My general setup for software2017-10-29T02:02:28Zhttps://jace.pro/post/2017-10-28-setup/Jace Benson<!--StartFragment-->
<p>Here's the software I use for my workstation;</p>
<p>Ninite can install most of the software I need for my workstation.</p>
<p><a href="https://ninite.com/7zip-chrome-discord-edge-firefox-libreoffice-paint.net-vscode-zoom/">Ninite</a></p>
<ul>
<li><a href="https://www.google.com/chrome/browser/desktop/">Chrome</a></li>
<li><a href="https://www.mozilla.org/en-US/firefox/new/">Firefox</a></li>
<li><a href="https://www.microsoft.com/en-us/windows/microsoft-edge">Microsoft Edge</a></li>
<li><a href="http://www.7-zip.org/">7-Zip</a></li>
<li><a href="https://zoom.us/">Zoom</a></li>
<li><a href="https://discordapp.com/">Discord</a></li>
<li><a href="https://code.visualstudio.com/">Visual Studio Code</a></li>
<li><a href="https://www.paint.net/">Paint.net</a></li>
<li><a href="https://www.libreoffice.org/">LibreOffice</a></li>
<li><a href="https://www.winscp.net/eng/download.php">WinDirStat</a></li>
<li>*<a href="https://git-scm.com/">Git</a></li>
<li>*<a href="https://obsidianmd.com/">ObsidianMd</a></li>
<li>*<a href="https://screencast-o-matic.com/">Screencast</a></li>
<li>*<a href="https://insomnia.rest/">Insomnia</a></li>
<li>*<a href="https://bitwarden.com/">Bitwarden</a></li>
<li>*<a href="https://apps.microsoft.com/store/detail/windows-terminal/9N0DX20HK701?hl=en-us&gl=US">Windows Terminal</a></li>
<li>*<a href="https://www.mmhmm.app/home">mmhmm</a></li>
<li>*<a href="https://obsproject.com/">OBS</a></li>
</ul>
<p>* Needs to be installed manually.</p>
Lookup Select Attributes2017-10-29T02:02:12Zhttps://jace.pro/post/2017-10-28-lookup-select-attributes/Jace Benson<!--StartFragment-->
<p>A former colleague asked me, "Hey, do you remember how to make variables dependent on each other?" It might have been her asking me. In any case, I was looking for a way to do this that wasn't a client script which would build these dependencies.</p>
<p>I found it. For lookup select boxes and lookup multiple choices there is an attribute available called <code>ref_qual_elements</code> that you can set with a comma-separated list of other variables. What happens when you change the value of one of the listed variables is a server call is made and the options are re-evaluated and unset.</p>
<p>This is great if those options are pretty static. If you let users disable options, items that use these variables that are in progress won't display these option.</p>
<p>Here's the <a href="https://docs.servicenow.com/bundle/istanbul-it-service-management/page/product/service-catalog-management/reference/variable-attributes.html">official documentation about this variable attribute</a>. It doesn't describe it as a way to save time, it will have to do.</p>
<!--EndFragment-->Weird service portal instance2017-10-28T02:28:21Zhttps://jace.pro/post/2017-10-26-sp-issue/Jace Benson<!--StartFragment-->
<p>Today I was working on a widget <a href="https://jace.pro/post/2017-10-26-sp-accept-reject/">Accept / Reject Solution</a>. I found a share (link defunct) that looked like it would meet my needs. It looked great, until I tried rejecting a custom extended task table.</p>
<p>I couldn't set it to work so I backed it out and determined I'd roll my own, that share updated a existing <code>sp_instance</code>. After I backed out the update set that <code>sp_instance</code> record was still there. I couldn't get it to fall off the page regardless what I tried;</p>
<ul>
<li>Record didn't exist at this point so couldn't delete it.</li>
<li>Recreated empty table, and inserted the record with the referenced sys_id via <a href="https://sn.jace.pro/GlideRecord/#setNewGuidValue">setNewGuidValue</a>. At this point I could set Active to false, but I wanted it gone.</li>
<li>Tried Deleting the record from the column record, but it deleted the actual record on it's table and not from the related list of <code>sp_instances</code>.</li>
</ul>
<p>I ended up making a new column, moving all widgets over, then deleted the old column.</p>
<!--EndFragment-->Thoughts on surveys2017-10-28T02:02:02Zhttps://jace.pro/post/2017-10-27-surveys/Jace Benson<!--StartFragment-->
<p>Surveys are great, if they make them concise and to the point.</p>
<h2>What Makes a Great Survey</h2>
<h3>Keep it short, stupid</h3>
<p>Your biggest concern is being <strong>clear and concise</strong>, or in finding the shortest way to ask a question without muddying its intent. It's not about reducing the character count; you must <strong>remove superfluous phrasing</strong> from your questions.</p>
<p><strong>Survey length remains important</strong> for keeping abandon rates low. Think about the last time you sat around and excitedly answered a 10-minute survey.</p>
<h3>Ask questions that fulfill your end goal</h3>
<p>You need to be ruthless when it comes to cutting unnecessary questions from your surveys.</p>
<p>Ask this question about every question you include, "Does this question drive action once received?" If the answer is no, why are you asking it? The action doesn't have to get you calling the surveyee, but should drive trends to changes you want to make.</p>
<h3>Construct smart, open-ended questions</h3>
<p>Some of your most insightful feedback will come from open-ended questions. Nothing makes a survey more intimidating than a large text box connected to the first question. It's best to take on brief questions first to create a sense of progress, and then give survey takers who've made it to the closing questions the opportunity to elaborate on their thoughts.</p>
<p>One strategy is to get people to commit to a question with a simple introduction, and then follow up with an open-ended question such as, "Why do you feel this way?"</p>
<h3>Ask one question at a time</h3>
<p>We've all been hit with an extensive series of questions before: "How did you find on our site? Do you understand what our product does? Why or why not?"</p>
<p>It can begin to feel like you're being interrogated by someone who won't let you finish your sentences. If you want quality responses, you need to give people time to think through each individual question.</p>
<p>Bombarding them with lots of points to consider leads to half-hearted answers by respondents who will be looking to get through to the end --- if they even stay with the survey at all. Make it easy by sticking to one main point at a time.</p>
<h3>Make rating scales consistent</h3>
<p>Common scales used for surveys can become cumbersome and confusing when the context begins to change.</p>
<p>Here's an example I came across. While answering a survey's initial questions, I was told to respond by choosing between 1-5, with 1 = "Strongly Disagree" and 5 = "Strongly Agree."</p>
<p>Later on in the survey I was asked to evaluate the importance of certain items. The problem: Now 1 was assigned as "Most Important," but I had been using 5 as the agreeable answer to every previous question.</p>
<p>This is incredibly confusing.</p>
<h3>Avoid leading and loaded questions</h3>
<p>Questions that lead respondents towards a certain answer due bias in their phrasing are not useful for your surveys. SurveyMonkey offers a great example of a leading question to avoid: > We have recently upgraded SurveyMonkey's features to become a first-class tool. What are your thoughts on the new site?</p>
<p>Remember to cut out language that caters to ego or contorts a respondent's understanding of what's being asked. To avoid loaded questions, stay away from any presupposed facts or assumptions.</p>
<p>A well-known example on disciplinary action with children is as follows: > Should a smack as part of good parental correction be a criminal offence in New Zealand?</p>
<p>The assumption here is that smacking a child is inherently a part of "good" parental correction, when in fact that is the opinion being argued. You can avoid loaded questions in your surveys by eliminating emotionally charged language that hints at preferences or assumed facts.</p>
<h3>Make use of Yes/No questions</h3>
<p>When you are asking a question that has a simple outcome, try to frame the question as a Yes/No option.</p>
<p>The Survey Monkey study showed that these closed-ended questions make for great starter questions because they are typically easier to evaluate and complete.</p>
<p>These questions can also be used to qualify the respondent with less of an ego bias, such as asking a question like, "Are you considered an expert in [blank]?" vs. "What level of expertise do you have in [blank]?"</p>
<h3>Get specific and avoid assumptions</h3>
<p>When you create questions that implicitly assume a customer is knowledgeable about something, you're probably going to run into problems (unless you are surveying a targeted subset of people).</p>
<p>One big culprit is the language and terminology you use in questions, which is why I'd recommend staying away from industry acronyms, jargon, or references.</p>
<p>One of the worst assumptions you can make is to assume people will answer with specific examples, or to explain their reasoning. It's better to ask them to be specific, and let them know you welcome this sort of feedback:</p>
<blockquote>
<p>How do you feel about [blank]? Feel free to get specific; we love detailed feedback!</p>
</blockquote>
<h3>Timing is important</h3>
<p>The Survey Monkey study found the highest survey open and click-through rates occurred on Monday, Friday and Sunday respectively.</p>
<p>There was no discernible difference between the response quality gathered on weekdays versus weekends, either, your best bet is to seek out survey-takers first thing during a new week or to wait for the weekend. Perhaps Monday has such high response rates because nobody feels like working.</p>
<h3>Give them a bonus</h3>
<p>It sometimes makes sense to entice customers to take your survey: a variety of data show that incentives can increase survey response rates by 5 to 20 percent. These incentives could be a discount, a giveaway or account credit.</p>
<p>A valid fear is that a freebie may detract from the quality of responses, but a few studies show that this isn't likely to be the case. Make incentives something you can financially handle, such as an extended trial of your software for a period of time.</p>
<h2>Ways of Surveying</h2>
<p>Three ways of surveying your end users are:</p>
<ul>
<li>Immediate feedback on any page</li>
<li>After some event like the close of an incident or request</li>
<li>On a frequency survey</li>
</ul>
<p>Survey's can be helpful and I'd suggest having at least one of the below set up to get a indicator of where you are, and how you can improve.</p>
<p>ServiceNow's built in survey engine has some room for improvement but is good enough for most survey's needs. The problem is they are not nearly as intuitive to set up as <a href="http://surveymonkey.com/">SurveyMonkey</a>.</p>
<p>Based on the feedback that you begin to receive you can decide if extra questions should be asked. However, you want to make sure that Surveys are <strong>simple and short</strong>.</p>
<p>Follow up on any comments that show someone had less then a stellar experience to get more details Adjust your question where you find a pattern with comments that people are leaving to ensure you are capturing the right data</p>
<h3>Immediate Feedback</h3>
<p>I love the idea of having a simple "How can we make this page better for you?" as pictured below. I'd have it have a thumbs up, and thumbs down to submit, and on press of enter submit w/out thumb up or down value.</p>
<p><img src="https://jace.pro/static/img/surveys-immediate-feedback.png" alt="" /></p>
<h3>After an Event</h3>
<p>What kinds of events?</p>
<ul>
<li>Resolution of an Incident accepted.</li>
<li>Close of an Incident.</li>
<li>Close of a Requested Item.</li>
<li>Close of a Project.</li>
</ul>
<p>The key here is <strong>asking right away</strong> to keep information fresh in the users mind.</p>
<h3>Regularly Scheduled</h3>
<p>These are great in keeping a heart beat on the satisfacation and other metrics gathered from the survey.</p>
<p>Pretty much per application, I'd ask some questions monthly or quarterly.</p>
<h2>Examples</h2>
<h3>List of questions seen</h3>
<table>
<thead>
<tr>
<th>Category</th>
<th>Goals: What do you need to know?</th>
<th>Great! Then you should ask this:</th>
</tr>
</thead>
<tbody>
<tr>
<td>Overall satisfaction</td>
<td>How the customer felt overall</td>
<td>Was the incident/issue resolved to your satisfaction?</td>
</tr>
<tr>
<td>Overall satisfaction</td>
<td>How the customer felt overall</td>
<td>Was this ticket resolved to your satisfaction?</td>
</tr>
<tr>
<td>Overall satisfaction</td>
<td>How the customer felt overall</td>
<td>How would you rate your overall satisfaction?</td>
</tr>
<tr>
<td>Overall satisfaction</td>
<td>How the customer felt overall</td>
<td>What changes could we make that would have improved your experience?</td>
</tr>
<tr>
<td>Overall satisfaction</td>
<td>How the customer felt overall</td>
<td>How likely is it that you would recommend our services to your peers?</td>
</tr>
<tr>
<td>Overall satisfaction</td>
<td>How the customer felt overall</td>
<td>How likely is it that you would recommend us to a colleague?</td>
</tr>
<tr>
<td>Overall satisfaction</td>
<td>How the customer felt overall</td>
<td>How likely are you to recommend this website to a colleague?</td>
</tr>
<tr>
<td>Overall satisfaction</td>
<td>How the customer felt overall</td>
<td>How would you describe your experience?</td>
</tr>
<tr>
<td>Overall satisfaction</td>
<td>How the customer felt overall</td>
<td>What would you like us to know about this experience?</td>
</tr>
<tr>
<td>Quality of products/services</td>
<td></td>
<td>How satisfied were you with _____ product?</td>
</tr>
<tr>
<td>Quality of products/services</td>
<td></td>
<td>Do you have any suggestions for improving our products/services?</td>
</tr>
<tr>
<td>Quality of products/services</td>
<td></td>
<td>Which of the following words best describe our products?</td>
</tr>
<tr>
<td>Quality of products/services</td>
<td></td>
<td>How well do our products meet your needs?</td>
</tr>
<tr>
<td>Quality of products/services</td>
<td></td>
<td>How satisfied were you with the implementation related to the attention to detail?</td>
</tr>
<tr>
<td>Time to Completion</td>
<td>Customer perspective</td>
<td>Were you satisfied with the response time to your _____?</td>
</tr>
<tr>
<td>Time to Completion</td>
<td>Customer perspective</td>
<td>Was your ____ completed within the expected time frame?</td>
</tr>
<tr>
<td>Staffing</td>
<td>satisfaction with staff</td>
<td>How satisfied were you with how the support staff resolved your most recent problem?</td>
</tr>
<tr>
<td>Staffing</td>
<td>Knowledgeable</td>
<td>Did you feel the associate was knowledgeable in the area of support?</td>
</tr>
<tr>
<td>Staffing</td>
<td>Knowledgeable</td>
<td>How knowledgeable was the associate who handled your inquiry?</td>
</tr>
<tr>
<td>Staffing</td>
<td></td>
<td>Please rate the technical competency of the technician serving you.</td>
</tr>
<tr>
<td>Staffing</td>
<td>Effective</td>
<td>How helpful was the associate who handled your inquiry?</td>
</tr>
<tr>
<td>Staffing</td>
<td>Professionalism</td>
<td>Did the associate help you in a professional and courteous manner?</td>
</tr>
<tr>
<td>Staffing</td>
<td>Communication</td>
<td>How did your support associate communicate with you?</td>
</tr>
<tr>
<td>Staffing</td>
<td>Communication</td>
<td>Rate your satisfaction of your support associate's communications.</td>
</tr>
<tr>
<td>Staffing</td>
<td>Communication</td>
<td>How responsive have we been to your questions or concerns as we completed work on this ticket?</td>
</tr>
<tr>
<td>Staffing</td>
<td>Communication</td>
<td>How well did we communicate with you during the completion of this ticket?</td>
</tr>
<tr>
<td>Room Booking</td>
<td>Room</td>
<td>How well did the room meet your meeting needs?</td>
</tr>
<tr>
<td>Room Booking</td>
<td>Setup</td>
<td>Was the room set up as requested?</td>
</tr>
<tr>
<td>Room Booking</td>
<td>Ease of use</td>
<td>How easy was it to use the room equipment?</td>
</tr>
<tr>
<td>Self-support experience</td>
<td>Portal design</td>
<td>How satisfied are you with our website?</td>
</tr>
<tr>
<td>Self-support experience</td>
<td>Portal design</td>
<td>Rate the Ease of navigation of the site.</td>
</tr>
<tr>
<td>Self-support experience</td>
<td>Portal design</td>
<td>Rate the Freshness of content</td>
</tr>
<tr>
<td>Self-support experience</td>
<td>Portal design</td>
<td>Rate the Accuracy of information</td>
</tr>
<tr>
<td>Self-support experience</td>
<td>Portal design</td>
<td>Rate the Quality of content</td>
</tr>
<tr>
<td>Self-support experience</td>
<td>Portal design</td>
<td>Rate the Quantity of content</td>
</tr>
<tr>
<td>Self-support experience</td>
<td>Portal design</td>
<td>Rate the Layout/design</td>
</tr>
<tr>
<td>Self-support experience</td>
<td>Portal design</td>
<td>Rate the Customer support</td>
</tr>
<tr>
<td>Self-support experience</td>
<td>marketing/evangelism</td>
<td>How did you learn about this site?</td>
</tr>
<tr>
<td>Self-support experience</td>
<td>use & effectiveness</td>
<td>Did you try to solve this issue using the knowledge base before opening this ticket?</td>
</tr>
<tr>
<td>Self-support experience</td>
<td></td>
<td>How would you rate the ease of use when creating your service catalog request?</td>
</tr>
<tr>
<td>Change Requests</td>
<td></td>
<td>Were there any issues created by the implementation of this change request?</td>
</tr>
<tr>
<td>Change Requests</td>
<td></td>
<td>How satisfied were you with your overall change request experience?</td>
</tr>
<tr>
<td>Closing</td>
<td>Additional comments</td>
<td>Is there anything else you would like us to know about your support experience?</td>
</tr>
</tbody>
</table>
<h3>Most Common Survey</h3>
<table>
<thead>
<tr>
<th>Question</th>
<th>Answer</th>
</tr>
</thead>
<tbody>
<tr>
<td>How would you rate your overall satisfaction?</td>
<td>Very SatisfiedSatisfiedDissatisfiedVery dissatisfied</td>
</tr>
<tr>
<td>What changes could we make that would have improved your experience?</td>
<td>Open Text</td>
</tr>
<tr>
<td>Were you satisfied with the response time to your ticket?</td>
<td>YesNo</td>
</tr>
<tr>
<td>How helpful was the associate who handled your inquiry?</td>
<td>He/she was fabulous!They did the needfulMy experience with this associate was somewhat frustratingThe associate did not resolve this issue</td>
</tr>
<tr>
<td>Is there anything else you would like us to know about your support experience?</td>
<td>Open Text</td>
</tr>
</tbody>
</table>
<h3>Survey used after the close of an incident</h3>
<table>
<thead>
<tr>
<th>Question</th>
<th>Answer Type</th>
</tr>
</thead>
<tbody>
<tr>
<td>How satisfied were you with the service you received?</td>
<td>1-10</td>
</tr>
<tr>
<td>We value your feedback: Please provide us with any comments regarding your experience with this interaction</td>
<td>Open Text Box</td>
</tr>
</tbody>
</table>
<h3>Survey used by Servicenow internally</h3>
<table>
<thead>
<tr>
<th>Question</th>
<th>Answer Type</th>
</tr>
</thead>
<tbody>
<tr>
<td>Is this the best support you have received in any company/organization?</td>
<td>1-10</td>
</tr>
<tr>
<td>Please rate your experience with reaction/response time</td>
<td>1-10</td>
</tr>
<tr>
<td>Please rate your experience with effectiveness</td>
<td>1-10</td>
</tr>
<tr>
<td>Please rate your experience with customer service</td>
<td>1-10</td>
</tr>
<tr>
<td>Are there any tools or services that you feel need better training & documentation</td>
<td>1-10</td>
</tr>
<tr>
<td>We value your feedback: Please tell us what we can do to improve your overall experience?</td>
<td>Open Text Box</td>
</tr>
</tbody>
</table>
<h3>Wordpress Minneapolis 2017</h3>
<p>This survey isn't short, and asks more than one question at a time. It also asks questions regardless of answers. Don't do this.</p>
<p><img src="https://jace.pro/static/img/surveys-wp.png" alt="A long survey from the Minneapolis Wordpress event in 2017" title="A long survey from the Minneapolis Wordpress event in 2017" /></p>
<h3><a href="https://github.com/jacebenson/jace.pro/blob/master/src/post/2017-10-27-surveys/index.md#upgrade-instance-survey"></a>Upgrade Instance Survey</h3>
<p>This survey is concise and satisfying.</p>
<p><img src="https://jace.pro/static/img/surveys-pheedbaq-1.png" alt="" /></p>
<p><img src="https://jace.pro/static/img/surveys-pheedbaq-2.png" alt="" /></p>
<p><img src="https://jace.pro/static/img/surveys-pheedbaq-3.png" alt="" /></p>
<p><img src="https://jace.pro/static/img/surveys-pheedbaq-4.png" alt="" /></p>
<p><img src="https://jace.pro/static/img/surveys-pheedbaq-5.png" alt="" /></p>
<p>I know at a past place, I set up a business rule on a question to notify the manager of the incident that spawned the survey to followup. That was a easy big win</p>
<h2>Further Reading</h2>
<ul>
<li><a href="https://blog.kissmetrics.com/best-ways-to-get-feedback/">The 5 Best Ways to Get Feedback from Your Customers</a></li>
<li><a href="https://community.servicenow.com/docs/DOC-4451">Survey Question Examples</a></li>
<li><a href="https://community.servicenow.com/docs/DOC-6393">CSAT Question and Answer Option Menu</a></li>
<li><a href="https://docs.servicenow.com/bundle/jakarta-servicenow-platform/page/administer/survey-administration/concept/c_SurveyServicePortal.html">ServiceNow Survey Docs</a></li>
<li><a href="http://wcminneapolis.polldaddy.com/s/wordcamp-minneapolis-st-paul-2017-survey">Wordpress Survey</a></li>
</ul>
<!--EndFragment-->Service Portal - Accept/Reject Solution2017-10-27T02:01:43Zhttps://jace.pro/post/2017-10-26-sp-accept-reject/Jace Benson<!--StartFragment-->
<p>I created a widget and wanted to share that code. Should work on any instance unless you have a business rule blocking the update.</p>
<!--EndFragment-->
<p><img src="https://jace.pro/static/img/sp-accept-reject.png" alt="" /></p>
<h2>Client Script</h2>
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">//Client Script</span><br /><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">$scope</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token comment">/* widget controller */</span><br /> <span class="token keyword">var</span> c <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">;</span><br /> $scope<span class="token punctuation">.</span><span class="token function-variable function">acceptRecord</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> c<span class="token punctuation">.</span>data<span class="token punctuation">.</span>action <span class="token operator">=</span> <span class="token string">'accept'</span><span class="token punctuation">;</span><br /> c<span class="token punctuation">.</span>data<span class="token punctuation">.</span>inputTable <span class="token operator">=</span> $scope<span class="token punctuation">.</span>data<span class="token punctuation">.</span>table<span class="token punctuation">;</span><br /> c<span class="token punctuation">.</span>data<span class="token punctuation">.</span>inputSys_id <span class="token operator">=</span> $scope<span class="token punctuation">.</span>data<span class="token punctuation">.</span>sys_id<span class="token punctuation">;</span><br /> c<span class="token punctuation">.</span>server<span class="token punctuation">.</span><span class="token function">update</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><span class="token punctuation">;</span><br /> $scope<span class="token punctuation">.</span><span class="token function-variable function">rejectRecord</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> c<span class="token punctuation">.</span>data<span class="token punctuation">.</span>action <span class="token operator">=</span> <span class="token string">'reject'</span><span class="token punctuation">;</span><br /> c<span class="token punctuation">.</span>data<span class="token punctuation">.</span>inputTable <span class="token operator">=</span> $scope<span class="token punctuation">.</span>data<span class="token punctuation">.</span>table<span class="token punctuation">;</span><br /> c<span class="token punctuation">.</span>data<span class="token punctuation">.</span>inputSys_id <span class="token operator">=</span> $scope<span class="token punctuation">.</span>data<span class="token punctuation">.</span>sys_id<span class="token punctuation">;</span><br /> c<span class="token punctuation">.</span>server<span class="token punctuation">.</span><span class="token function">update</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span></code></pre>
<h2>Server Script</h2>
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">//Server Script</span><br /><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token comment">/* populate the 'data' object */</span><br /> <span class="token comment">/* e.g., data.table = $sp.getValue('table'); */</span><br /> data<span class="token punctuation">.</span>debug <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span><br /> data<span class="token punctuation">.</span>canRead <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span><br /> data<span class="token punctuation">.</span>show <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span><br /> data<span class="token punctuation">.</span>messages <span class="token operator">=</span> <span class="token punctuation">{</span><br /> <span class="token literal-property property">accept</span><span class="token operator">:</span> <span class="token string">"Solution Accepted."</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">reject</span><span class="token operator">:</span> <span class="token string">"Solution Rejected."</span><br /> <span class="token punctuation">}</span><span class="token punctuation">;</span><br /> data<span class="token punctuation">.</span>rules <span class="token operator">=</span> <span class="token punctuation">{</span><br /> <span class="token literal-property property">custom_table</span><span class="token operator">:</span> <span class="token punctuation">{</span><br /> <span class="token comment">//query to show widget on, solution proposed</span><br /> <span class="token literal-property property">showOn</span> <span class="token operator">:</span> <span class="token string">'state=6^u_contactDYNAMIC90d1921e5f510100a9ad2572f2b477fe'</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">fields</span><span class="token operator">:</span> <span class="token punctuation">{</span><br /> <span class="token literal-property property">accept</span><span class="token operator">:</span> <span class="token punctuation">{</span><br /> <span class="token literal-property property">state</span><span class="token operator">:</span> <span class="token number">7</span><span class="token punctuation">,</span><span class="token comment">//state to set to if 'accept', closed</span><br /> <span class="token literal-property property">comments</span><span class="token operator">:</span> data<span class="token punctuation">.</span>messages<span class="token punctuation">.</span>accept<br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">reject</span><span class="token operator">:</span> <span class="token punctuation">{</span><br /> <span class="token literal-property property">state</span><span class="token operator">:</span> <span class="token number">2</span><span class="token punctuation">,</span><span class="token comment">//state to set to if 'reject', active</span><br /> <span class="token literal-property property">comments</span><span class="token operator">:</span> data<span class="token punctuation">.</span>messages<span class="token punctuation">.</span>reject<br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">incident</span><span class="token operator">:</span> <span class="token punctuation">{</span><br /> <span class="token comment">//query to show widget on, solution proposed</span><br /> <span class="token literal-property property">showOn</span><span class="token operator">:</span> <span class="token string">'state=6^caller_idDYNAMIC90d1921e5f510100a9ad2572f2b477fe'</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">fields</span><span class="token operator">:</span> <span class="token punctuation">{</span><br /> <span class="token literal-property property">accept</span><span class="token operator">:</span> <span class="token punctuation">{</span><br /> <span class="token literal-property property">state</span><span class="token operator">:</span> <span class="token number">7</span><span class="token punctuation">,</span><span class="token comment">//state to set to if 'accept', closed</span><br /> <span class="token literal-property property">comments</span><span class="token operator">:</span> data<span class="token punctuation">.</span>messages<span class="token punctuation">.</span>accept<br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">reject</span><span class="token operator">:</span> <span class="token punctuation">{</span><br /> <span class="token literal-property property">state</span><span class="token operator">:</span> <span class="token number">2</span><span class="token punctuation">,</span><span class="token comment">//state to set to if 'reject', active</span><br /> <span class="token literal-property property">comments</span><span class="token operator">:</span> data<span class="token punctuation">.</span>messages<span class="token punctuation">.</span>reject<br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><span class="token punctuation">;</span><br /> data<span class="token punctuation">.</span>sys_id <span class="token operator">=</span> $sp<span class="token punctuation">.</span><span class="token function">getParameter</span><span class="token punctuation">(</span><span class="token string">"sys_id"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> data<span class="token punctuation">.</span>table <span class="token operator">=</span> $sp<span class="token punctuation">.</span><span class="token function">getParameter</span><span class="token punctuation">(</span><span class="token string">"table"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span><span class="token punctuation">(</span>data<span class="token punctuation">.</span>table <span class="token operator">&&</span> data<span class="token punctuation">.</span>sys_id<span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">var</span> task <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span>data<span class="token punctuation">.</span>table<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span><span class="token punctuation">(</span>task<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>data<span class="token punctuation">.</span>sys_id<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">var</span> actualTable <span class="token operator">=</span> task<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token string">'sys_class_name'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> actualTask <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span>actualTable<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> actualTask<span class="token punctuation">.</span><span class="token function">addQuery</span><span class="token punctuation">(</span><span class="token string">'sys_id'</span><span class="token punctuation">,</span> data<span class="token punctuation">.</span>sys_id<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> actualTask<span class="token punctuation">.</span><span class="token function">addEncodedQuery</span><span class="token punctuation">(</span>data<span class="token punctuation">.</span>rules<span class="token punctuation">[</span>actualTable<span class="token punctuation">]</span><span class="token punctuation">.</span>showOn<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> actualTask<span class="token punctuation">.</span><span class="token function">query</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span><span class="token punctuation">(</span>actualTask<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> data<span class="token punctuation">.</span>show <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span><br /> data<span class="token punctuation">.</span>table <span class="token operator">=</span> actualTask<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token string">'sys_class_name'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><br /> data<span class="token punctuation">.</span>errorMsg <span class="token operator">=</span> <span class="token string">"Could not find record to get table fields"</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><br /> data<span class="token punctuation">.</span>errorMsg <span class="token operator">=</span> <span class="token string">"Could not find record to get classname"</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">if</span><span class="token punctuation">(</span>input <span class="token operator">&&</span> input<span class="token punctuation">.</span>action<span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">var</span> rule <span class="token operator">=</span> data<span class="token punctuation">.</span>rules<span class="token punctuation">[</span>input<span class="token punctuation">.</span>inputTable<span class="token punctuation">]</span><span class="token punctuation">.</span>fields<span class="token punctuation">[</span>input<span class="token punctuation">.</span>action<span class="token punctuation">]</span><span class="token punctuation">;</span><br /> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>data<span class="token punctuation">.</span>rules<span class="token punctuation">[</span>input<span class="token punctuation">.</span>inputTable<span class="token punctuation">]</span><span class="token punctuation">[</span>input<span class="token punctuation">.</span>action<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> taskUpdate <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span>input<span class="token punctuation">.</span>inputTable<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span><span class="token punctuation">(</span>taskUpdate<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>input<span class="token punctuation">.</span>inputSys_id<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">var</span> field <span class="token keyword">in</span> rule<span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token comment">//console.log('setting ' + field + ': ' + rule[field]);</span><br /> <span class="token keyword">if</span><span class="token punctuation">(</span>field <span class="token operator">==</span> <span class="token string">'comments'</span> <span class="token operator">||</span> field <span class="token operator">==</span> <span class="token string">'work_notes'</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> taskUpdate<span class="token punctuation">[</span>field<span class="token punctuation">]</span> <span class="token operator">=</span> rule<span class="token punctuation">[</span>field<span class="token punctuation">]</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><br /> taskUpdate<span class="token punctuation">.</span><span class="token function">setValue</span><span class="token punctuation">(</span>field<span class="token punctuation">,</span> rule<span class="token punctuation">[</span>field<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /> taskUpdate<span class="token punctuation">.</span><span class="token function">update</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> data<span class="token punctuation">.</span>show <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><br /> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'cound not find record'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<h2>HTML</h2>
<pre class="language-html"><code class="language-html"><span class="token comment"><!--Template--></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">ng-if</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>data.canRead && data.show<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>panel panel-primary b<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>panel-heading<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>h4</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>panel-title pull-left<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> ${Solution Proposed}<br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>h4</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>clearfix<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>panel-body<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>text-center<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>button</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>button<span class="token punctuation">"</span></span><br /> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>btn btn-success<span class="token punctuation">"</span></span><br /> <span class="token attr-name">ng-click</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>acceptRecord()<span class="token punctuation">"</span></span><br /> <span class="token punctuation">></span></span><br /> ${Accept}<br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>button</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>button</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>button<span class="token punctuation">"</span></span><br /> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>btn btn-danger<span class="token punctuation">"</span></span><br /> <span class="token attr-name">ng-click</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>rejectRecord()<span class="token punctuation">"</span></span><br /> <span class="token punctuation">></span></span><br /> ${Reject}<br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>button</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>p</span> <span class="token attr-name">ng-if</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>data.debug<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>p</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>p</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>p</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span></code></pre>
4 tasks I do to my Personal Developer Instance (PDI)2017-10-25T02:01:27Zhttps://jace.pro/post/2017-10-24-pdi/Jace Benson<!--StartFragment-->
<p>Create a personal admin account, lockout other accounts, and set up and plugins you need.</p>
<ol>
<li>
<p>Create Local Account with your name/email</p>
<ul>
<li>Give your account <code>admin</code> and <code>security_admin</code> roles</li>
<li>Script To do this</li>
</ul>
</li>
<li>
<p>Lockout all other users</p>
</li>
<li>
<p>Activate Plugins</p>
<ul>
<li>User Registration Request</li>
<li>App Engine Studio</li>
</ul>
</li>
<li>
<p>Load any update sets</p>
</li>
</ol>
<h1>Update Sets</h1>
<table>
<thead>
<tr>
<th>Share</th>
<th>Git</th>
</tr>
</thead>
<tbody>
<tr>
<td>Xplore</td>
<td><a href="https://github.com/thewhitespace/Xplore/">Github</a></td>
</tr>
<tr>
<td>Code Search Service Portal Widget</td>
<td><a href="https://github.com/jacebenson/servicenow-code/blob/docs/README.md">Github</a></td>
</tr>
</tbody>
</table>
<h2>Background Script To Do This</h2>
<!--EndFragment-->
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">// This will make a user with and id of slack</span><br /><span class="token comment">// password of password with appropriate roles.</span><br /><span class="token keyword">var</span> users <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">{</span><br /> <span class="token literal-property property">id</span><span class="token operator">:</span> <span class="token string">'jace.benson'</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">firstName</span><span class="token operator">:</span> <span class="token string">'Jace'</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">lastName</span><span class="token operator">:</span> <span class="token string">'Benson'</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">password</span><span class="token operator">:</span> <span class="token string">'slack'</span><br /><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><br /> <span class="token literal-property property">id</span><span class="token operator">:</span> <span class="token string">'slack'</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">firstName</span><span class="token operator">:</span> <span class="token string">'slack'</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">lastName</span><span class="token operator">:</span> <span class="token string">'er'</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">password</span><span class="token operator">:</span> <span class="token string">'slack'</span><br /><span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token punctuation">;</span><br /><br /><span class="token keyword">function</span> <span class="token function">createUserWithRoles</span><span class="token punctuation">(</span><span class="token parameter">userObj</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> userGR <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'sys_user'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>userGR<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'user_name'</span><span class="token punctuation">,</span> userObj<span class="token punctuation">.</span>id<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token comment">// donothing</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><br /> userGR<span class="token punctuation">.</span><span class="token function">newRecord</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> userGR<span class="token punctuation">.</span><span class="token function">setValue</span><span class="token punctuation">(</span><span class="token string">'user_name'</span><span class="token punctuation">,</span> userObj<span class="token punctuation">.</span>id<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> userGR<span class="token punctuation">.</span><span class="token function">setValue</span><span class="token punctuation">(</span><span class="token string">'active'</span><span class="token punctuation">,</span> <span class="token string">'true'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> userGR<span class="token punctuation">.</span><span class="token function">setValue</span><span class="token punctuation">(</span><span class="token string">'first_name'</span><span class="token punctuation">,</span> userObj<span class="token punctuation">.</span>firstName<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> userGR<span class="token punctuation">.</span><span class="token function">setValue</span><span class="token punctuation">(</span><span class="token string">'last_name'</span><span class="token punctuation">,</span> userObj<span class="token punctuation">.</span>lastName<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> userGR<span class="token punctuation">.</span><span class="token function">setValue</span><span class="token punctuation">(</span><span class="token string">'locked_out'</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> userGR<span class="token punctuation">.</span><span class="token function">setValue</span><span class="token punctuation">(</span><span class="token string">'password_needs_reset'</span><span class="token punctuation">,</span> <span class="token string">'true'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> userGR<span class="token punctuation">.</span><span class="token function">setDisplayValue</span><span class="token punctuation">(</span><span class="token string">'user_password'</span><span class="token punctuation">,</span> userObj<span class="token punctuation">.</span>password<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> userGR<span class="token punctuation">.</span><span class="token function">setWorkflow</span><span class="token punctuation">(</span><span class="token string">'false'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> gs<span class="token punctuation">.</span><span class="token function">print</span><span class="token punctuation">(</span><span class="token string">'userObj.id: '</span> <span class="token operator">+</span> userObj<span class="token punctuation">.</span>id<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> gs<span class="token punctuation">.</span><span class="token function">print</span><span class="token punctuation">(</span><span class="token string">'userObj.id: '</span> <span class="token operator">+</span> userObj<span class="token punctuation">.</span>password<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> userSysId <span class="token operator">=</span> userGR<span class="token punctuation">.</span><span class="token function">update</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token function">giveRole</span><span class="token punctuation">(</span>userSysId<span class="token punctuation">,</span> <span class="token string">'admin'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token function">giveRole</span><span class="token punctuation">(</span>userSysId<span class="token punctuation">,</span> <span class="token string">'security_admin'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span><br /><br /><span class="token keyword">function</span> <span class="token function">giveRole</span><span class="token punctuation">(</span><span class="token parameter">userId<span class="token punctuation">,</span> roleName</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> give <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'sys_user_has_role'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> give<span class="token punctuation">.</span><span class="token function">newRecord</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> give<span class="token punctuation">.</span><span class="token function">setValue</span><span class="token punctuation">(</span><span class="token string">'user'</span><span class="token punctuation">,</span> userId<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> give<span class="token punctuation">.</span><span class="token function">setDisplayValue</span><span class="token punctuation">(</span><span class="token string">'role'</span><span class="token punctuation">,</span> roleName<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> give<span class="token punctuation">.</span><span class="token function">insert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span><br /><br /><span class="token keyword">function</span> <span class="token function">lockOutEveryoneElse</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> usersToLockOut <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'sys_user'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> usersToLockOut<span class="token punctuation">.</span><span class="token function">addEncodedQuery</span><span class="token punctuation">(</span><span class="token string">'sys_created_on<javascript:gs.beginningOfToday()'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> usersToLockOut<span class="token punctuation">.</span><span class="token function">query</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">while</span> <span class="token punctuation">(</span>usersToLockOut<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> usersToLockOut<span class="token punctuation">.</span><span class="token function">setValue</span><span class="token punctuation">(</span><span class="token string">'locked_out'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> usersToLockOut<span class="token punctuation">.</span><span class="token function">update</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span><br />users<span class="token punctuation">.</span><span class="token function">map</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">user</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token function">createUserWithRoles</span><span class="token punctuation">(</span>user<span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token function">lockOutEveryoneElse</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token keyword">function</span> <span class="token function">activatePlugins</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">var</span> plugins <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span><br /> plugins<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token string">'com.snc.user_registration'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> plugins<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token string">'com.snc.app-engine-studio'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><br /> <span class="token keyword">var</span> main <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideMultiPluginManagerWorker</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> main<span class="token punctuation">.</span><span class="token function">setPluginIds</span><span class="token punctuation">(</span>plugins<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> main<span class="token punctuation">.</span><span class="token function">setProgressName</span><span class="token punctuation">(</span><span class="token string">"Plugin Installer"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> main<span class="token punctuation">.</span><span class="token function">setBackground</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> main<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span><br /><span class="token function">activatePlugins</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
Service Portal - Custom Search Source2017-10-18T02:01:15Zhttps://jace.pro/post/2017-10-17-sp-custom-search-source/Jace Benson<!--StartFragment-->
<p>We have knowledge bases at my work and as such the default search is limited. I wanted to add to the type ahead a result like "Search all KB's for <code>your term here</code>".</p>
<p>I looked at the search sources and found it has a scripted bit but it's <a href="https://docs.servicenow.com/bundle/jakarta-servicenow-platform/page/build/service-portal/task/add-table-search-source.html">not documented well</a>.</p>
<p><img src="https://jace.pro/static/img/sp-custom-search-source.png" alt="Finished Product" /></p>
<h2>OOB Search Source</h2>
<p>So first lets look at the out of box "Service Catalog" search source,<br />
specifically it's data fetch (shows up when you select,<br />
<code>Is scripted source</code>)</p>
<pre class="language-javascript"><code class="language-javascript"><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">query</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> results <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span><br /> <span class="token comment">//Here goes the logic. Compute results how you want!</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>gs<span class="token punctuation">.</span><span class="token function">isLoggedIn</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><br /> <span class="token keyword">return</span> results<span class="token punctuation">;</span><br /><br /> <span class="token keyword">var</span> sc <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'sc_cat_item'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> sc<span class="token punctuation">.</span><span class="token function">addQuery</span><span class="token punctuation">(</span><span class="token string">'123TEXTQUERY321'</span><span class="token punctuation">,</span> query<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> sc<span class="token punctuation">.</span><span class="token function">addQuery</span><span class="token punctuation">(</span><span class="token string">'active'</span><span class="token punctuation">,</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> sc<span class="token punctuation">.</span><span class="token function">addQuery</span><span class="token punctuation">(</span><span class="token string">'no_search'</span><span class="token punctuation">,</span> <span class="token string">'!='</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> sc<span class="token punctuation">.</span><span class="token function">addQuery</span><span class="token punctuation">(</span><span class="token string">'visible_standalone'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> sc<span class="token punctuation">.</span><span class="token function">addQuery</span><span class="token punctuation">(</span><span class="token string">'sys_class_name'</span><span class="token punctuation">,</span> <span class="token string">'NOT IN'</span><span class="token punctuation">,</span> <span class="token string">'sc_cat_item_wizard'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> portalValue <span class="token operator">=</span> $sp<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token string">'sc_catalog'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>portalValue<span class="token punctuation">)</span><br /> sc<span class="token punctuation">.</span><span class="token function">addQuery</span><span class="token punctuation">(</span><span class="token string">'sc_catalogs'</span><span class="token punctuation">,</span> portalValue<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> sc<span class="token punctuation">.</span><span class="token function">query</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> catCount <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span><br /> <span class="token keyword">while</span> <span class="token punctuation">(</span>sc<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&&</span> catCount <span class="token operator"><</span> data<span class="token punctuation">.</span>limit<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>$sp<span class="token punctuation">.</span><span class="token function">canReadRecord</span><span class="token punctuation">(</span>sc<span class="token punctuation">)</span><span class="token punctuation">)</span><br /> <span class="token keyword">continue</span><span class="token punctuation">;</span><br /><br /> <span class="token keyword">var</span> item <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span><br /> item<span class="token punctuation">.</span>type <span class="token operator">=</span> <span class="token string">"sc"</span><span class="token punctuation">;</span><br /> item<span class="token punctuation">.</span>page <span class="token operator">=</span> <span class="token string">"sc_cat_item"</span><span class="token punctuation">;</span><br /><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>sc<span class="token punctuation">.</span><span class="token function">getRecordClassName</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token string">"sc_cat_item_guide"</span><span class="token punctuation">)</span><br /> item<span class="token punctuation">.</span>page <span class="token operator">=</span> <span class="token string">"sc_cat_item_guide"</span><span class="token punctuation">;</span><br /> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>sc<span class="token punctuation">.</span><span class="token function">getRecordClassName</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token string">"sc_cat_item_content"</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> gr <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'sc_cat_item_content'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> gr<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>sc<span class="token punctuation">.</span><span class="token function">getUniqueValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> $sp<span class="token punctuation">.</span><span class="token function">getRecordValues</span><span class="token punctuation">(</span>item<span class="token punctuation">,</span> gr<span class="token punctuation">,</span> <span class="token string">'url,content_type,kb_article'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> item<span class="token punctuation">.</span>type <span class="token operator">=</span> <span class="token string">"sc_content"</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">else</span><br /> item<span class="token punctuation">.</span>type <span class="token operator">=</span> <span class="token string">"sc"</span><span class="token punctuation">;</span><br /><br /> $sp<span class="token punctuation">.</span><span class="token function">getRecordDisplayValues</span><span class="token punctuation">(</span>item<span class="token punctuation">,</span> sc<span class="token punctuation">,</span> <span class="token string">'name,short_description,picture,price,sys_id,sys_class_name'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> item<span class="token punctuation">.</span>score <span class="token operator">=</span> <span class="token function">parseInt</span><span class="token punctuation">(</span>sc<span class="token punctuation">.</span>ir_query_score<span class="token punctuation">.</span><span class="token function">getDisplayValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> item<span class="token punctuation">.</span>label <span class="token operator">=</span> item<span class="token punctuation">.</span>name<span class="token punctuation">;</span><br /> item<span class="token punctuation">.</span>primary <span class="token operator">=</span> item<span class="token punctuation">.</span>name<span class="token punctuation">;</span><br /><br /> <span class="token comment">//calculating URL</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>item<span class="token punctuation">.</span>type <span class="token operator">==</span> <span class="token string">"sc"</span><span class="token punctuation">)</span><br /> item<span class="token punctuation">.</span>url <span class="token operator">=</span> <span class="token string">'?id='</span> <span class="token operator">+</span> item<span class="token punctuation">.</span>page <span class="token operator">+</span> <span class="token string">'&sys_id='</span> <span class="token operator">+</span> item<span class="token punctuation">.</span>sys_id<span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>item<span class="token punctuation">.</span>type <span class="token operator">==</span> <span class="token string">"sc_content"</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>item<span class="token punctuation">.</span>content_type <span class="token operator">==</span> <span class="token string">"kb"</span><span class="token punctuation">)</span><br /> item<span class="token punctuation">.</span>url <span class="token operator">=</span> <span class="token string">'?id=kb_article&sys_id='</span> <span class="token operator">+</span> item<span class="token punctuation">.</span>kb_article<span class="token punctuation">;</span><br /> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>item<span class="token punctuation">.</span>content_type <span class="token operator">==</span> <span class="token string">"external"</span><span class="token punctuation">)</span><br /> item<span class="token punctuation">.</span>target <span class="token operator">=</span> <span class="token string">'_blank'</span><span class="token punctuation">;</span><br /> <span class="token keyword">else</span><br /> item<span class="token punctuation">.</span>url <span class="token operator">=</span> <span class="token string">'?id=sc_cat_item&sys_id='</span> <span class="token operator">+</span> item<span class="token punctuation">.</span>sys_id<span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>item<span class="token punctuation">.</span>type <span class="token operator">==</span> <span class="token string">"sc_guide"</span><span class="token punctuation">)</span><br /> item<span class="token punctuation">.</span>url <span class="token operator">=</span> <span class="token string">'?id=sc_cat_item_guide&sys_id='</span> <span class="token operator">+</span> item<span class="token punctuation">.</span>sys_id<span class="token punctuation">;</span><br /><br /> results<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>item<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> catCount<span class="token operator">++</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /><br /> <span class="token keyword">return</span> results<span class="token punctuation">;</span><br /><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">(</span>query<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p>There's a lot going on there, but what I picked out was, it returns an<br />
array of objects where the object has the following properties;</p>
<pre class="language-json"><code class="language-json"><span class="token punctuation">{</span><br /> score<span class="token operator">:</span><span class="token string">"-100"</span><span class="token punctuation">,</span><br /> label<span class="token operator">:</span>resultMsg<span class="token punctuation">,</span><br /> primary<span class="token operator">:</span>resultMsg<span class="token punctuation">,</span><br /> url<span class="token operator">:</span> <span class="token string">"?id=kb_search&spa=1&query="</span> + query<span class="token punctuation">,</span><br /> <span class="token comment">//target: "",</span><br /> <span class="token comment">//page:"kb_search"</span><br /><span class="token punctuation">}</span></code></pre>
<h2>Score</h2>
<p>This seems pretty obvious to me, a integer to determine order in the results</p>
<h2>Label and Primary</h2>
<p>I'm not sure the difference but this seems to be what shows up as text in the result.</p>
<h2>URL</h2>
<p>This is where the browser will go on click.</p>
<h2>Target</h2>
<p>I assume this is the a tag's <code>target</code> attribute, so if you want a new tab each time use a value of <code>_blank</code>.</p>
<h2>Page</h2>
<p>I am not sure if this does anything on it's own, in the out of box widget they use this in the defined url.</p>
<h2>Search Source I made</h2>
<p>Below is my search source script.</p>
<pre class="language-javascript"><code class="language-javascript"><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">query</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> resultMsg <span class="token operator">=</span> <span class="token string">"Search KB for "</span> <span class="token operator">+</span> query<span class="token punctuation">;</span><br /> <span class="token keyword">var</span> results <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">{</span><br /> <span class="token literal-property property">score</span><span class="token operator">:</span><span class="token string">"-100"</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">label</span><span class="token operator">:</span>resultMsg<span class="token punctuation">,</span><br /> <span class="token literal-property property">primary</span><span class="token operator">:</span>resultMsg<span class="token punctuation">,</span><br /> <span class="token literal-property property">url</span><span class="token operator">:</span> <span class="token string">"?id=kb_search&spa=1&query="</span> <span class="token operator">+</span> query<span class="token punctuation">,</span><br /> <span class="token comment">//target: "",</span><br /> <span class="token comment">//page:"kb_search"</span><br /> <span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token punctuation">;</span><br /> <span class="token keyword">return</span> results<span class="token punctuation">;</span><br /><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">(</span>query<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<h2>Further Reading</h2>
<p><a href="https://community.servicenow.com/community/develop/blog/2017/03/29/using-scripted-search-sources-to-search-external-websites-and-applications">Community Thread</a></p>
<!--EndFragment-->Service Portal Woes2017-10-17T02:00:58Zhttps://jace.pro/post/2017-10-16-sp-woes/Jace Benson<p>Two items I have to call out. First, this was inspired by <a href="https://community.servicenow.com/thread/282244">Ratesh Shah's post</a>. Second, you can read "Official" client script restrictions here on the <a href="https://docs.servicenow.com/bundle/jakarta-servicenow-platform/page/build/service-portal/concept/unsupported_client_scripts.html">docs</a>.</p>
<h2>Client Scripting issues</h2>
<p>The Service Portal has more restrictions on it then the classic UI. In the past, any DOM manipulation or access and use of window across scripts was frowned on. With the Service Portal ServiceNow has removed the ability to mess with the Document Object Model (DOM). If you want to use those you'll have to change your scripts below.</p>
<h3>Unsupported client scripting globals</h3>
<p>The following globals and APIs are unavailable in client scripts in the Service Portal.</p>
<table>
<thead>
<tr>
<th>Thing</th>
<th>Description of the thing</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>window</code></td>
<td><a href="https://developer.mozilla.org/en-US/docs/Web/API/Window">This is a object used by all browsers</a></td>
</tr>
<tr>
<td><code>document</code></td>
<td><a href="https://developer.mozilla.org/en-US/docs/Web/API/document">This is a object used by all browsers</a></td>
</tr>
<tr>
<td><code>$</code></td>
<td><a href="http://api.prototypejs.org/dom/dollar/">Prototypejs selector</a></td>
</tr>
<tr>
<td><code>$$</code></td>
<td><a href="http://api.prototypejs.org/dom/dollar-dollar/">Prototypejs css selector</a></td>
</tr>
<tr>
<td><code>jQuery</code></td>
<td><a href="http://api.jquery.com/">jQuery</a></td>
</tr>
<tr>
<td><code>$j</code></td>
<td>Alias for <a href="http://api.jquery.com/">jQuery</a></td>
</tr>
<tr>
<td><code>angular</code></td>
<td><a href="https://docs.angularjs.org/api/">Angular</a></td>
</tr>
<tr>
<td><code>jslog</code></td>
<td><a href="https://docs.servicenow.com/bundle/jakarta-servicenow-platform/page/script/debugging/concept/c_WritingToTheDebugLog.html">Docs</a></td>
</tr>
<tr>
<td><code>gel</code></td>
<td>Shortcut for <code>window.getElementByID()</code></td>
</tr>
</tbody>
</table>
<h2>Re-usable utility functions</h2>
<p>Macros and any <a href="https://jace.pro/jelly">Jelly</a> are not supported on Service Portal. Two ways around this is Widget dependencies or the ScriptLoader utility.</p>
<h3>Widget Dependencies</h3>
<p>In Service Portal, you can add <a href="https://docs.servicenow.com/bundle/jakarta-servicenow-platform/page/build/service-portal/task/widget-dependencies.html">widget dependencies</a> for re-usable utility functions.</p>
<h3>ScriptLoader</h3>
<p>Another way would be to add a <a href="https://sn.jace.pro/docs/scripting/scriptloader/">ScriptLoader</a> to the client script.</p>
<h2>UI Type for Catalog Client Scripts and Catalog UI Policies</h2>
<p>If you want a catalog client script to work on both service portal / mobile and regular platform, you must select UI Type = ALL or service portal / mobile. It may be tempting to update every client script's UI Type to All. for all catalog client scripts, but it may not be a good idea for performance reasons. Sometimes, there is a valid reason not to make the catalog client script available on portal due to functional reasons.</p>
<p>If you want a catalog UI policy to work on both service portal / mobile and regular platform, you must select Run scripts in UI Type = All. Use All, Desktop or Service Portal / Mobile based on your ask as explained above. This field is not available on the form, you can change it from list view.</p>
<p>You can use window object to detect if your catalog item is being used in Service Portal or CMS (Rest of platform).</p>
<pre class="language-javascript"><code class="language-javascript"><span class="token keyword">if</span> <span class="token punctuation">(</span>window<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token comment">// you are in CMS</span><br /><span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><br /> <span class="token comment">// you are in Service Portal</em></span><br /><span class="token punctuation">}</span></code></pre>
<!--EndFragment-->Kingston2017-10-17T02:00:46Zhttps://jace.pro/post/2017-10-16-kingston/Jace Benson<!--StartFragment-->
<table>
<thead>
<tr>
<th>Section</th>
<th>Link</th>
</tr>
</thead>
<tbody>
<tr>
<td>Flow Designer & IntegrationHub</td>
<td><a href="https://youtu.be/GtAFuOgnfU8?t=594">https://youtu.be/GtAFuOgnfU8?t=594</a></td>
</tr>
<tr>
<td>Function Fields</td>
<td><a href="https://youtu.be/av8Azb6nOqE?t=925">https://youtu.be/av8Azb6nOqE?t=925</a></td>
</tr>
<tr>
<td>Agent Intelligence</td>
<td><a href="https://youtu.be/av8Azb6nOqE?t=1292">https://youtu.be/av8Azb6nOqE?t=1292</a></td>
</tr>
<tr>
<td>Email Digests</td>
<td><a href="https://youtu.be/av8Azb6nOqE?t=1442">https://youtu.be/av8Azb6nOqE?t=1442</a></td>
</tr>
<tr>
<td>Service Portal announcements</td>
<td><a href="https://youtu.be/av8Azb6nOqE?t=1996">https://youtu.be/av8Azb6nOqE?t=1996</a></td>
</tr>
<tr>
<td>Service Portal order guide widget</td>
<td><a href="https://youtu.be/av8Azb6nOqE?t=2212">https://youtu.be/av8Azb6nOqE?t=2212</a></td>
</tr>
<tr>
<td>Service Portal dynamic page titles</td>
<td><a href="https://youtu.be/av8Azb6nOqE?t=2909">https://youtu.be/av8Azb6nOqE?t=2909</a></td>
</tr>
</tbody>
</table>
<h2>Flow Designer & IntegrationHub</h2>
<p>ServiceNow® Flow Designer is a new Now Platform feature in the Kingston release.</p>
<p>Enable process owners to use natural language to automate approvals, tasks, notifications, and record operations without having to code. Use a single design environment to author flows and actions and manage flow executions.</p>
<p>Lower the barrier for automation and speed up development by creating an ecosystem of reusable content available to any flow. Reduce upgrade times and technical debt by replacing customized business logic with native Now Platform actions.</p>
<p><a href="https://docs.servicenow.com/bundle/kingston-release-notes/page/release-notes/servicenow-platform/flow-designer-rn.html">Release Notes</a></p>
<h2>Agent Intelligence</h2>
<p>ServiceNow® Agent Intelligence is a new Now Platform feature in the Kingston release.</p>
<p>Use machine-learning algorithms to set field values during record creation such as setting the incident category based on the short description. Train predictive models to act as an agent to categorize and route work based on your past record-handling experience.</p>
<p><a href="https://docs.servicenow.com/bundle/kingston-release-notes/page/release-notes/servicenow-platform/agent-intelligence-rn.html">Release Notes</a></p>
<h2>Function Fields</h2>
<p>ServiceNow® Function fields are a new Now Platform feature in the Kingston release.</p>
<p>All supported relational database management systems (RDBMS) provide a common set of built-in functions that can be used in SQL statements: string, mathematical, and so on. Function fields and function scripts let application developers and administrators use those functions in the platform in an integrated and familiar way without requiring any knowledge of SQL or RDBMS specifics.</p>
<p><a href="https://docs.servicenow.com/bundle/kingston-release-notes/page/release-notes/servicenow-platform/platform-support-functions-rn.html">Release Notes</a></p>
<h2>Email Digests</h2>
<p>Enable an email digest, a single email that summarizes the activity for a notification during a digest (time) interval that you specify. By enabling an email digest for a selected notification, you can reduce the number of emails received when associated records are frequently updated. Admins create the email digest format for a notification and control the digest intervals that users can choose when enabling a digest in their notification preferences.</p>
<p><a href="https://docs.servicenow.com/bundle/kingston-release-notes/page/release-notes/servicenow-platform/notifications-rn.html">Release Notes</a></p>
<h2>Service Portal</h2>
<p>ServiceNow® Service Portal product enhancements and updates in the Kingston release.</p>
<p>Service Portal is a portal framework that helps you build a mobile-friendly self-service experience.</p>
<p><a href="https://docs.servicenow.com/bundle/kingston-release-notes/page/release-notes/servicenow-platform/service-portal-rn.html">Release Notes</a></p>
<h3>Order Guide Widget</h3>
<p>The order guides are available and decent with Service portal.</p>
<p><a href="https://docs.servicenow.com/bundle/kingston-servicenow-platform/page/build/service-portal/concept/sc-order-guide-widget.html">Notes</a></p>
<h3>Font Awesome upgraded to 4.7</h3>
<p>The Font Awesome library has been upgraded to version 4.7 and includes new icon names and syntax changes. If your Service Portal implementation includes custom use of the Font Awesome library, you may need to update icon names in your custom widgets.</p>
<h3>Announcements</h3>
<p>Use announcements to broadcast messages to Service Portal users.</p>
<p>Announcements can be displayed in an announcement banner or an announcement widget instance.</p>
<p>Announcements are active on new instances. To activate announcements after upgrade, activate the Service Portal Announcements (<code>com.glide.service-portal.announcements</code>) plugin.</p>
<!--EndFragment-->Jakarta2017-10-17T02:00:37Zhttps://jace.pro/post/2017-10-16-jakarta/Jace Benson<!--StartFragment-->
<ul>
<li>In the left hand search field, <code>table.config</code> has been added.</li>
<li>In journaled fields, now videos are added like image files in the activity formatters.</li>
<li>Export to JSON is new and neat.</li>
<li><a href="https://jace.pro/search-api">Global search</a> is different</li>
</ul>
<table>
<thead>
<tr>
<th>Section</th>
<th>Link</th>
</tr>
</thead>
<tbody>
<tr>
<td>UI changes</td>
<td><a href="https://youtu.be/D_R6j4xmfiE?t=506">https://youtu.be/D_R6j4xmfiE?t=506</a></td>
</tr>
<tr>
<td>Mobile</td>
<td><a href="https://youtu.be/D_R6j4xmfiE?t=793">https://youtu.be/D_R6j4xmfiE?t=793</a></td>
</tr>
<tr>
<td>Security Auth</td>
<td><a href="https://youtu.be/D_R6j4xmfiE?t=848">https://youtu.be/D_R6j4xmfiE?t=848</a></td>
</tr>
<tr>
<td>Securit Role mgmt</td>
<td><a href="https://youtu.be/D_R6j4xmfiE?t=918">https://youtu.be/D_R6j4xmfiE?t=918</a></td>
</tr>
<tr>
<td>Service portal</td>
<td><a href="https://youtu.be/D_R6j4xmfiE?t=995">https://youtu.be/D_R6j4xmfiE?t=995</a></td>
</tr>
<tr>
<td>Global search</td>
<td><a href="https://youtu.be/D_R6j4xmfiE?t=1162">https://youtu.be/D_R6j4xmfiE?t=1162</a></td>
</tr>
<tr>
<td>Interfaces</td>
<td><a href="https://youtu.be/D_R6j4xmfiE?t=1343">https://youtu.be/D_R6j4xmfiE?t=1343</a></td>
</tr>
<tr>
<td>Guided tour designer</td>
<td><a href="https://youtu.be/D_R6j4xmfiE?t=1529">https://youtu.be/D_R6j4xmfiE?t=1529</a></td>
</tr>
<tr>
<td>Notifications</td>
<td><a href="https://youtu.be/D_R6j4xmfiE?t=1940">https://youtu.be/D_R6j4xmfiE?t=1940</a></td>
</tr>
<tr>
<td>Orchestatrion</td>
<td><a href="https://youtu.be/D_R6j4xmfiE?t=2469">https://youtu.be/D_R6j4xmfiE?t=2469</a></td>
</tr>
<tr>
<td>Update sets</td>
<td><a href="https://youtu.be/D_R6j4xmfiE?t=2582">https://youtu.be/D_R6j4xmfiE?t=2582</a></td>
</tr>
<tr>
<td>Upgrades</td>
<td><a href="https://youtu.be/D_R6j4xmfiE?t=2795">https://youtu.be/D_R6j4xmfiE?t=2795</a></td>
</tr>
<tr>
<td>ATF</td>
<td><a href="https://youtu.be/D_R6j4xmfiE?t=2936">https://youtu.be/D_R6j4xmfiE?t=2936</a></td>
</tr>
<tr>
<td>Workflow</td>
<td><a href="https://youtu.be/D_R6j4xmfiE?t=3055">https://youtu.be/D_R6j4xmfiE?t=3055</a></td>
</tr>
<tr>
<td>Edge Encryption</td>
<td><a href="https://youtu.be/D_R6j4xmfiE?t=3339">https://youtu.be/D_R6j4xmfiE?t=3339</a></td>
</tr>
<tr>
<td>Summary</td>
<td><a href="https://youtu.be/D_R6j4xmfiE?t=3420">https://youtu.be/D_R6j4xmfiE?t=3420</a></td>
</tr>
</tbody>
</table>
<h2>Batched Update Sets</h2>
<p>Wow. Save time by batching update sets in the same scope. Bring up from dev, and apply the batch instead of applying each update set in order, one at a time.</p>
<p><a href="https://docs.servicenow.com/bundle/jakarta-release-notes/page/release-notes/servicenow-platform/system-update-sets-rn.html">Releas Notes</a></p>
<h2>Service Portal enhancements</h2>
<p><a href="https://docs.servicenow.com/bundle/jakarta-release-notes/page/release-notes/servicenow-platform/service-portal-rn.html">Release Notes</a></p>
<h3>User Criteria</h3>
<p>Before Jakarta you could lock portals, pages, widgets, and widget instances with a role and not User Criteria. Now you can.</p>
<h3>Lists widget have filter builder</h3>
<p>Use the platform UI condition builder in the Data table from URL definition widget to create more complex table searches. The condition builder is disabled by default. Administrators can enable using the widget instance options for the Data table from URL definition widget.</p>
<h3>Contextual Search sources are not contextual</h3>
<p>Narrow search results to specific sources by configuring the contextual search sources in the instance options of a search widget.</p>
<h3>A11y work "WCAG level AA"</h3>
<p>Improvements to accessibility were made throughout the platform in congruence with WCAG 2.0 A standards. Improvements made specifically to Service Portal are listed here.</p>
<ul>
<li>High contrast theme: Changes the Service Portal ESM to be more accessible for users who have a hard time seeing low contrast colors.</li>
<li>Screen reader title: Use the Edit Container background option in the context menu for to add a title that screen readers read aloud.</li>
</ul>
<p><a href="https://docs.servicenow.com/bundle/jakarta-release-notes/page/release-notes/servicenow-platform/accessibility-rn.html">Release<br />
Notes</a></p>
<h2>Embedded Help</h2>
<p>ServiceNow® Embedded Help is a new application in the Jakarta release.</p>
<p>It includes the guided tour feature.</p>
<p>Embedded help and guided tours have been in the instance since the Helsinki release. In the Jakarta release, administrators can use the new Embedded Help application to create customized embedded help and develop guided tours.</p>
<p><a href="https://docs.servicenow.com/bundle/jakarta-release-notes/page/release-notes/application-development/embedded-help-guided-tours-rn.html">Release Notes</a></p>
<h2>Communities</h2>
<p>ServiceNow® Communities is a new application in the Jakarta release.</p>
<p>Communities provides a place for you to engage and interact with your organization.</p>
<ul>
<li>help solve issues faster</li>
<li>learn about best practices from others</li>
<li>engage with your organization for product feedback</li>
</ul>
<p>Use Communities to:</p>
<ul>
<li>improve support call deflection because users help themselves via<br />
crowd-sourced knowledge</li>
<li>communicate product updates</li>
<li>increase engagement with existing customers and lure prospects</li>
</ul>
<p><a href="https://docs.servicenow.com/bundle/jakarta-release-notes/page/release-notes/service-management/communities-rn.html">Release Notes</a></p>
<!--EndFragment-->Istanbul2017-10-17T02:00:28Zhttps://jace.pro/post/2017-10-16-istanbul/Jace Benson<!--StartFragment-->
<table>
<thead>
<tr>
<th>Section</th>
<th>Link</th>
</tr>
</thead>
<tbody>
<tr>
<td>GlideDate/Time API Updates</td>
<td><a href="https://youtu.be/s2aRGT9WIRk?t=778">https://youtu.be/s2aRGT9WIRk?t=778</a></td>
</tr>
<tr>
<td>Search Synonyms</td>
<td><a href="https://youtu.be/s2aRGT9WIRk?t=866">https://youtu.be/s2aRGT9WIRk?t=866</a></td>
</tr>
<tr>
<td>Condition Builder v2</td>
<td><a href="https://youtu.be/s2aRGT9WIRk?t=967">https://youtu.be/s2aRGT9WIRk?t=967</a></td>
</tr>
<tr>
<td>Mobile</td>
<td><a href="https://youtu.be/s2aRGT9WIRk?t=1301">https://youtu.be/s2aRGT9WIRk?t=1301</a></td>
</tr>
<tr>
<td>Email API</td>
<td><a href="https://youtu.be/s2aRGT9WIRk?t=1505">https://youtu.be/s2aRGT9WIRk?t=1505</a></td>
</tr>
<tr>
<td>Unsubscribe</td>
<td><a href="https://youtu.be/s2aRGT9WIRk?t=1679">https://youtu.be/s2aRGT9WIRk?t=1679</a></td>
</tr>
<tr>
<td>Email Layouts</td>
<td><a href="https://youtu.be/s2aRGT9WIRk?t=1786">https://youtu.be/s2aRGT9WIRk?t=1786</a></td>
</tr>
<tr>
<td>API Analytics</td>
<td><a href="https://youtu.be/s2aRGT9WIRk?t=1917">https://youtu.be/s2aRGT9WIRk?t=1917</a></td>
</tr>
<tr>
<td>HTTP Message Logging</td>
<td><a href="https://youtu.be/s2aRGT9WIRk?t=2027">https://youtu.be/s2aRGT9WIRk?t=2027</a></td>
</tr>
<tr>
<td>ATF</td>
<td><a href="https://youtu.be/s2aRGT9WIRk?t=2228">https://youtu.be/s2aRGT9WIRk?t=2228</a></td>
</tr>
<tr>
<td>Studio/Source Control changes</td>
<td><a href="https://youtu.be/s2aRGT9WIRk?t=2962">https://youtu.be/s2aRGT9WIRk?t=2962</a></td>
</tr>
<tr>
<td>Debugger</td>
<td><a href="https://youtu.be/s2aRGT9WIRk?t=3091">https://youtu.be/s2aRGT9WIRk?t=3091</a></td>
</tr>
<tr>
<td>Summary</td>
<td><a href="https://youtu.be/s2aRGT9WIRk?t=3726">https://youtu.be/s2aRGT9WIRk?t=3726</a></td>
</tr>
</tbody>
</table>
<h2>Automated Testing Framework</h2>
<p>This is the first small step to try to allow upgrades to happen<br />
with less issues.</p>
<p>With the Automated Test Framework, you create and run automated tests on<br />
your ServiceNow instance. When you upgrade or change an instance, run<br />
these tests to confirm that the instance still works as designed.</p>
<p>Initially it could open a form, set field values, test values, and submit the form.</p>
<p><a href="https://docs.servicenow.com/bundle/istanbul-release-notes/page/release-notes/servicenow-platform/automated-test-framework-rn.html">Release Notes</a></p>
<h2>Email REST API</h2>
<p><a href="https://docs.servicenow.com/bundle/istanbul-release-notes/page/release-notes/servicenow-platform/email-service-rn.html">Release Notes</a></p>
<h2>Script Debugger</h2>
<p>Wow. The Script Debugger allows application developers to debug<br />
server-side JavaScript. The Script Debugger allows each application<br />
developer to:</p>
<ul>
<li>Have a dedicated debug transaction, which applies to the current session.</li>
<li>Set and remove breakpoints.</li>
<li>Pause the current session at a breakpoint.</li>
<li>Step through code line-by-line.</li>
<li>Step into and out of function and method calls.</li>
<li>View the value of local and global variables.</li>
<li>View the value of private variables from function closures.</li>
<li>View the call stack.</li>
<li>View the transaction the system is processing.</li>
<li>Turn off the script debugger to resume running paused scripts.</li>
</ul>
<p><a href="https://docs.servicenow.com/bundle/istanbul-release-notes/page/release-notes/application-development/script-debugger-rn.html">Release Notes</a></p>
<h2>HR Service Management (Scoped)</h2>
<p>Before Istanbul the HRSM was a "global" application. After Istanbul it<br />
is now scoped. They are separate, but going forward the scoped<br />
version has been getting all the attention.</p>
<p><a href="https://docs.servicenow.com/bundle/istanbul-release-notes/page/release-notes/service-management/human-resources-rn.html">Release Notes</a></p>
<!--EndFragment-->Geneva2017-10-17T02:00:15Zhttps://jace.pro/post/2017-10-16-geneva/Jace Benson<!--StartFragment-->
<p>Video Review of this;</p>
<table>
<thead>
<tr>
<th>Section</th>
<th>Link</th>
</tr>
</thead>
<tbody>
<tr>
<td>Scripted REST Apis</td>
<td><a href="https://youtu.be/B3K385rJ_mI">https://youtu.be/B3K385rJ_mI</a></td>
</tr>
<tr>
<td>ServiceWatch</td>
<td><a href="https://youtu.be/Qj0NjaEudnU">https://youtu.be/Qj0NjaEudnU</a></td>
</tr>
<tr>
<td>Connect Chat</td>
<td><a href="https://youtu.be/w9gi5pm6WjQ">https://youtu.be/w9gi5pm6WjQ</a></td>
</tr>
<tr>
<td>Knowledge Updates</td>
<td><a href="https://youtu.be/dbU9fiimcaU">https://youtu.be/dbU9fiimcaU</a></td>
</tr>
</tbody>
</table>
<p>But here's my list of notable features;</p>
<h2>Web services update</h2>
<p>This got notable updates;</p>
<h3>Scripted REST APIs</h3>
<p>Wow. This allows you to make endpoints return what you want without using processors.</p>
<h3>Attachment REST API</h3>
<p>This is a great api to reintroduce. Before you had to use the AttachmentCreator SOAP web service. The SOAP API has less limitations then this new REST API. You can't create an attachment without a record to attach it to. You might think that's trivial, until you try to do some catalog work via REST. This is a great api.</p>
<h3>CORS support</h3>
<p>Allows customers to specify which REST APIs on their ServiceNow instance allow cross-domain AJAX requests from specified whitelisted domains.</p>
<h2>Service Watch -> ServiceMapping</h2>
<p>Before this release Service Watch was a separate product requiring a stand alone product. After this release ServiceNow it re-branded as ServiceMapping and is now built into ServiceNow.</p>
<p><a href="https://docs.servicenow.com/bundle/geneva-release-notes/page/release-notes/it_operations_mgmt/r_ServiceMappingRN.html">Release Notes</a></p>
<h2>Security Operations</h2>
<p>This is a new line of business that ServiceNow can sell to clients for tracking vulnerability responses, configuration compliance, threat intelligence, and trusted security circles within ServiceNow.</p>
<p><a href="https://docs.servicenow.com/bundle/geneva-release-notes/page/release-notes/security_management/c_SecurityOpsManagementRN.html">Release Notes</a></p>
<h2>Edge Encryption</h2>
<p>A separate line of business ServiceNow can sell to clients to allow the encryption of sensitive data on your company premises before sending it over the Internet to your ServiceNow instance (encrypted in flight)<br />
where it remains encrypted at rest.</p>
<p><a href="https://docs.servicenow.com/bundle/geneva-release-notes/page/release-notes/servicenow_platform/r_EdgeEncryptionRN.html">Release Notes</a></p>
<!--EndFragment-->Set Duration and Business Duration2017-10-14T02:00:00Zhttps://jace.pro/post/2017-10-13-set-duration-and-business-duration/Jace Benson<p>I had to add some code to set this for some reporting needs. This should be part of the offering ServiceNow provides.</p>
<p>Below is my business rule, and fix script to catch new records and fix<br />
old records.</p>
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">// Business Rule</span><br /><span class="token comment">// Table: Task [task]</span><br /><span class="token comment">// Active: true</span><br /><span class="token comment">// Advanced: true</span><br /><span class="token comment">// When: Before</span><br /><span class="token comment">// Order 100000000</span><br /><span class="token comment">// Insert: true</span><br /><span class="token comment">// Update:true</span><br /><span class="token comment">// Condition:</span><br /><span class="token comment">// calendar_durationISEMPTY^</span><br /><span class="token comment">// opened_atISNOTEMPTY^</span><br /><span class="token comment">// closed_atISNOTEMPTY^</span><br /><span class="token comment">// sys_class_name!=incident^</span><br /><span class="token comment">// sys_class_name!=problem</span><br /><span class="token comment">//</span><br /><span class="token comment">// Script</span><br /><span class="token keyword">var</span> opened <span class="token operator">=</span> current<span class="token punctuation">.</span>opened_at<span class="token punctuation">.</span><span class="token function">getDisplayValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token keyword">var</span> closed <span class="token operator">=</span> current<span class="token punctuation">.</span>closed_at<span class="token punctuation">.</span><span class="token function">getDisplayValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br />current<span class="token punctuation">.</span>calendar_duration <span class="token operator">=</span> gs<span class="token punctuation">.</span><span class="token function">dateDiff</span><span class="token punctuation">(</span>opened<span class="token punctuation">,</span> closed<span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br />current<span class="token punctuation">.</span>business_duration <span class="token operator">=</span> gs<span class="token punctuation">.</span><span class="token function">calDateDiff</span><span class="token punctuation">(</span>opened<span class="token punctuation">,</span> closed<span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p>Here's my fix script.</p>
<pre class="language-javascript"><code class="language-javascript"><span class="token keyword">var</span> log <span class="token operator">=</span> <span class="token string">'calc. old durations'</span><span class="token punctuation">;</span><br /><span class="token keyword">var</span> query <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">;</span><br />query <span class="token operator">+=</span> <span class="token string">'calendar_durationISEMPTY^'</span><span class="token punctuation">;</span><br />query <span class="token operator">+=</span> <span class="token string">'opened_atISNOTEMPTY^'</span><span class="token punctuation">;</span><br />query <span class="token operator">+=</span> <span class="token string">'closed_atISNOTEMPTY^'</span><span class="token punctuation">;</span><br />query <span class="token operator">+=</span> <span class="token string">'sys_class_name!=incident^'</span><span class="token punctuation">;</span><br />query <span class="token operator">+=</span> <span class="token string">'sys_class_name!=problem^'</span><span class="token punctuation">;</span><br /><br /><span class="token keyword">var</span> task <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'task'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br />task<span class="token punctuation">.</span><span class="token function">addEncodedQuery</span><span class="token punctuation">(</span>query<span class="token punctuation">)</span><span class="token punctuation">;</span><br />task<span class="token punctuation">.</span><span class="token function">query</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token keyword">var</span> x <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span><br /><span class="token keyword">while</span><span class="token punctuation">(</span>task<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> x<span class="token operator">++</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span><span class="token punctuation">(</span>x<span class="token operator">%</span><span class="token number">1000</span> <span class="token operator">===</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> gs<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'x: '</span> <span class="token operator">+</span> x <span class="token operator">+</span> <span class="token string">' of '</span> <span class="token operator">+</span> task<span class="token punctuation">.</span><span class="token function">getRowCount</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> log<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">var</span> opened <span class="token operator">=</span> task<span class="token punctuation">.</span>opened_at<span class="token punctuation">.</span><span class="token function">getDisplayValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> closed <span class="token operator">=</span> task<span class="token punctuation">.</span>closed_at<span class="token punctuation">.</span><span class="token function">getDisplayValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> task<span class="token punctuation">.</span>business_duration <span class="token operator">=</span> gs<span class="token punctuation">.</span><span class="token function">calDateDiff</span><span class="token punctuation">(</span>opened<span class="token punctuation">,</span> closed<span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> task<span class="token punctuation">.</span>calendar_duration <span class="token operator">=</span> gs<span class="token punctuation">.</span><span class="token function">dateDiff</span><span class="token punctuation">(</span>opened<span class="token punctuation">,</span> closed<span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> task<span class="token punctuation">.</span><span class="token function">setWorkflow</span><span class="token punctuation">(</span><span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> task<span class="token punctuation">.</span><span class="token function">autoSysFields</span><span class="token punctuation">(</span><span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> task<span class="token punctuation">.</span><span class="token function">update</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span></code></pre>
Service Portal - Ticket Assignments2017-10-05T01:59:45Zhttps://jace.pro/post/2017-10-04-sp-ticket-assignments/Jace Benson<!--StartFragment-->
<p>I created a ticket assignments and wanted to share that code. Should<br />
work on any instance unless you have a business rule blocking the<br />
update.</p>
<!--EndFragment-->
<p><img src="https://jace.pro/static/img/sp-ticket-assignments.png" alt="" /></p>
<h2>Client Script</h2>
<pre class="language-javascript"><code class="language-javascript"><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token comment">/* widget controller */</span><br /> <span class="token keyword">var</span> c <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span></code></pre>
<!--EndFragment-->
<h2>Server Script</h2>
<pre class="language-javascript"><code class="language-javascript"><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token comment">/* populate the 'data' object */</span><br /> <span class="token comment">/* e.g., data.table = $sp.getValue('table'); */</span><br /> <span class="token keyword">var</span> gr <span class="token operator">=</span> $sp<span class="token punctuation">.</span><span class="token function">getRecord</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> data<span class="token punctuation">.</span>canRead <span class="token operator">=</span> gr<span class="token punctuation">.</span><span class="token function">canRead</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> data<span class="token punctuation">.</span>table <span class="token operator">=</span> gr<span class="token punctuation">.</span><span class="token function">getTableName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>data<span class="token punctuation">.</span>canRead <span class="token operator">||</span> gr<span class="token punctuation">.</span><span class="token function">getTableName</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token string">'sc_req_item'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">return</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /><br /> data<span class="token punctuation">.</span>sc_task <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> sc_task <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'sc_task'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> sc_task<span class="token punctuation">.</span><span class="token function">addQuery</span><span class="token punctuation">(</span><span class="token string">'request_item'</span><span class="token punctuation">,</span> gr<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token string">'sys_id'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> sc_task<span class="token punctuation">.</span><span class="token function">addQuery</span><span class="token punctuation">(</span><span class="token string">'active'</span><span class="token punctuation">,</span><span class="token string">'true'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> sc_task<span class="token punctuation">.</span><span class="token function">orderByDesc</span><span class="token punctuation">(</span><span class="token string">'sys_created_on'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> sc_task<span class="token punctuation">.</span><span class="token function">query</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> data<span class="token punctuation">.</span>sc_task_query <span class="token operator">=</span> sc_task<span class="token punctuation">.</span><span class="token function">getEncodedQuery</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">while</span><span class="token punctuation">(</span>sc_task<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">var</span> label <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> assignment <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span><span class="token punctuation">(</span>sc_task<span class="token punctuation">.</span>assignment_group <span class="token operator">!=</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> assignment <span class="token operator">=</span> sc_task<span class="token punctuation">.</span><span class="token function">getDisplayValue</span><span class="token punctuation">(</span><span class="token string">'assignment_group'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><br /> assignment <span class="token operator">=</span> sc_task<span class="token punctuation">.</span><span class="token function">getDisplayValue</span><span class="token punctuation">(</span><span class="token string">'assigned_to'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> data<span class="token punctuation">.</span>sc_task<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token punctuation">{</span><br /> <span class="token literal-property property">number</span><span class="token operator">:</span> sc_task<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token string">'number'</span><span class="token punctuation">)</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">assignment</span><span class="token operator">:</span> assignment<span class="token punctuation">,</span><br /> <span class="token literal-property property">link</span><span class="token operator">:</span> <span class="token string">'?id=ticket&table=sc_task&sys_id='</span> <span class="token operator">+</span> sc_task<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token string">'sys_id'</span><span class="token punctuation">)</span><br /> <span class="token punctuation">}</span><span class="token punctuation">)</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<h2>HTML</h2>
<pre class="language-html"><code class="language-html"><span class="token comment"><!--Template--></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>panel b<span class="token punctuation">"</span></span><br /> <span class="token attr-name">ng-if</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>data.canRead && data.sc_task.length > 0 && data.table == 'sc_req_item'<span class="token punctuation">"</span></span> <span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>panel-heading bg-primary<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>span</span> <span class="token attr-name">ng-if</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>true<span class="token punctuation">"</span></span> <span class="token punctuation">></span></span>Task Assignments<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>span</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>panel-body<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>table</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>table<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>thead</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>tr</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>th</span><span class="token punctuation">></span></span>Assignment<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>th</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>th</span><span class="token punctuation">></span></span>Task<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>th</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>tr</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>thead</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>tbody</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>tr</span> <span class="token attr-name">ng-repeat</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>task in data.sc_task<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>td</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>td</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>td</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>td</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>tr</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>tbody</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>table</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span></code></pre>
Service Portal - Modify Watch List2017-10-04T01:59:32Zhttps://jace.pro/post/2017-10-03-sp-modify-watch-list/Jace Benson<p>I created a widget and wanted to share that code. Should work on any<br />
instance unless you have a business rule blocking the update.</p>
<h2>Client Script</h2>
<pre class="language-javascript"><code class="language-javascript"><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">$scope<span class="token punctuation">,</span> spUtil</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> c <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">;</span><br /> $scope<span class="token punctuation">.</span>watch_list <span class="token operator">=</span> <span class="token punctuation">{</span><br /> <span class="token literal-property property">displayValue</span><span class="token operator">:</span> c<span class="token punctuation">.</span>data<span class="token punctuation">.</span>watch_list<span class="token punctuation">.</span>displayValue<span class="token punctuation">,</span><br /> <span class="token literal-property property">value</span><span class="token operator">:</span> c<span class="token punctuation">.</span>data<span class="token punctuation">.</span>watch_list<span class="token punctuation">.</span>value<span class="token punctuation">,</span><br /> <span class="token literal-property property">name</span><span class="token operator">:</span> <span class="token string">'watch_list'</span><br /> <span class="token punctuation">}</span><span class="token punctuation">;</span><br /> $scope<span class="token punctuation">.</span><span class="token function-variable function">updateRecord</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> c<span class="token punctuation">.</span>data<span class="token punctuation">.</span>watch_list <span class="token operator">=</span> $scope<span class="token punctuation">.</span>watch_list<span class="token punctuation">;</span><br /> c<span class="token punctuation">.</span>server<span class="token punctuation">.</span><span class="token function">update</span><span class="token punctuation">(</span><span class="token punctuation">)</span><br /> <span class="token punctuation">}</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span></code></pre>
<h2>Server Script</h2>
<pre class="language-javascript"><code class="language-javascript"><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">if</span><span class="token punctuation">(</span>input <span class="token operator">&&</span> input<span class="token punctuation">.</span>sys_id <span class="token operator">&&</span> input<span class="token punctuation">.</span>table <span class="token operator">&&</span> input<span class="token punctuation">.</span>watch_list<span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">var</span> ticket <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span>input<span class="token punctuation">.</span>table<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span><span class="token punctuation">(</span>ticket<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>input<span class="token punctuation">.</span>sys_id<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> ticket<span class="token punctuation">.</span><span class="token function">setValue</span><span class="token punctuation">(</span><span class="token string">'watch_list'</span><span class="token punctuation">,</span> input<span class="token punctuation">.</span>watch_list<span class="token punctuation">.</span>value<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> ticket<span class="token punctuation">.</span><span class="token function">update</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><br /> <span class="token keyword">if</span><span class="token punctuation">(</span>$sp<span class="token punctuation">.</span><span class="token function">getParameter</span><span class="token punctuation">(</span><span class="token string">'table'</span><span class="token punctuation">)</span> <span class="token operator">&&</span> $sp<span class="token punctuation">.</span><span class="token function">getParameter</span><span class="token punctuation">(</span><span class="token string">'sys_id'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token keyword">var</span> table <span class="token operator">=</span> $sp<span class="token punctuation">.</span><span class="token function">getParameter</span><span class="token punctuation">(</span><span class="token string">'table'</span><span class="token punctuation">)</span><br /> <span class="token keyword">var</span> sys_id <span class="token operator">=</span> $sp<span class="token punctuation">.</span><span class="token function">getParameter</span><span class="token punctuation">(</span><span class="token string">'sys_id'</span><span class="token punctuation">)</span><br /> <span class="token keyword">var</span> gr <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span>table<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span><span class="token punctuation">(</span>gr<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>sys_id<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> data<span class="token punctuation">.</span>canRead <span class="token operator">=</span> gr<span class="token punctuation">.</span>watch_list<span class="token punctuation">.</span><span class="token function">canRead</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> data<span class="token punctuation">.</span>canWrite <span class="token operator">=</span> gr<span class="token punctuation">.</span>watch_list<span class="token punctuation">.</span><span class="token function">canWrite</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span><span class="token punctuation">(</span>data<span class="token punctuation">.</span>canRead<span class="token punctuation">)</span><span class="token punctuation">{</span><br /> data<span class="token punctuation">.</span>sys_id <span class="token operator">=</span> sys_id<span class="token punctuation">;</span><br /> data<span class="token punctuation">.</span>table <span class="token operator">=</span> table<span class="token punctuation">;</span><br /> data<span class="token punctuation">.</span>watch_list <span class="token operator">=</span> <span class="token punctuation">{</span><br /> <span class="token literal-property property">displayValue</span> <span class="token operator">:</span> gr<span class="token punctuation">.</span><span class="token function">getDisplayValue</span><span class="token punctuation">(</span><span class="token string">'watch_list'</span><span class="token punctuation">)</span> <span class="token operator">||</span> <span class="token string">''</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">value</span> <span class="token operator">:</span> gr<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token string">'watch_list'</span><span class="token punctuation">)</span> <span class="token operator">||</span> <span class="token string">''</span><br /> <span class="token punctuation">}</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><br /> <span class="token comment">//missing url params</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<h2>HTML</h2>
<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">ng-if</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>data.canRead<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>panel panel-primary b<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>panel-heading<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>h4</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>panel-title pull-left<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> ${Watch list}<br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>h4</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>clearfix<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>panel-body<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>text-center text-italic text-muted<span class="token punctuation">"</span></span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>watch_list_div<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>sn-record-picker</span> <br /> <span class="token attr-name">ng-blur</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>updateRecord()<span class="token punctuation">"</span></span><br /> <span class="token attr-name">field</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>watch_list<span class="token punctuation">"</span></span><br /> <span class="token attr-name">sn-disabled</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>!data.canWrite<span class="token punctuation">"</span></span><br /> <span class="token attr-name">table</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token punctuation">'</span>sys_user'<span class="token punctuation">"</span></span><br /> <span class="token attr-name">display-field</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token punctuation">'</span>name'<span class="token punctuation">"</span></span><br /> <span class="token attr-name">search-fields</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token punctuation">'</span>name'<span class="token punctuation">"</span></span><br /> <span class="token attr-name">value-field</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token punctuation">'</span>sys_id'<span class="token punctuation">"</span></span><br /> <span class="token attr-name">default-query</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token punctuation">'</span>active=true^name!=NULL'<span class="token punctuation">"</span></span><br /> <span class="token attr-name">multiple</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>true<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>sn-record-picker</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>p</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>p</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>button</span> <br /> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>button<span class="token punctuation">"</span></span><br /> <span class="token attr-name">ng-click</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>updateRecord()<span class="token punctuation">"</span></span><br /> <span class="token attr-name">ng-if</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>data.canWrite<span class="token punctuation">"</span></span><br /> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>btn btn-default ng-scope<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> Update Watch List<br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>button</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span></code></pre>
Undocumented Scripts2017-10-01T01:59:17Zhttps://jace.pro/post/2017-09-30-undocumented-scripts/Jace Benson<!--StartFragment-->
<p>This page is to document scripts that are undocumented in ServiceNow.</p>
<ul>
<li>
<p>Server-Side APIs (gathered using<br />
<a href="https://developer.servicenow.com/connect.do#!/share/contents/9650888_xplore_developer_toolkit?v=4.9&t=PRODUCT_DETAILS">Xplore</a><br />
manually and via posts on community)</p>
<ul>
<li>
<p>Glide</p>
<ul>
<li>get()</li>
<li>checkInitiated()</li>
</ul>
</li>
<li>
<p>GlideAbstractBucketCollector -- Expects Object</p>
</li>
<li>
<p>GlideSysAttachmentInputStream</p>
</li>
<li>
<p>GlideChecksum</p>
<ul>
<li>calculateMD5CheckSum.</li>
</ul>
</li>
<li>
<p>GlideSecurityManager</p>
<ul>
<li>setUser</li>
</ul>
</li>
<li>
<p>GlideTableCreator</p>
<ul>
<li><a href="https://community.servicenow.com/thread/247897">https://community.servicenow.com/thread/247897</a></li>
<li><a href="https://community.servicenow.com/thread/248771">https://community.servicenow.com/thread/248771</a></li>
</ul>
</li>
<li>
<p>GlideappCatalogItem</p>
</li>
<li>
<p>GlideappQuestion -- <a href="https://hi.service-now.com/kb_view.do?sysparm_article=KB0596785">Memory Leak issues<br />
(PRB697208)</a></p>
</li>
<li>
<p>GlideappVariablePoolQuestionSet</p>
<ul>
<li>generally used to print out variables and answers in email. I recommend: /printing-out-variables/</li>
<li><a href="https://community.servicenow.com/thread/284468">https://community.servicenow.com/thread/284468</a> -- not working in scoped application</li>
<li><a href="https://community.servicenow.com/thread/221479">https://community.servicenow.com/thread/221479</a> -- controlling what variables show up</li>
</ul>
</li>
<li>
<p>GlideZipOutputStream aka Packages.java.util.zip.ZipOutputStream</p>
</li>
<li>
<p>GlideZipEntry aka Packages.java.util.zip.ZipEntry</p>
</li>
<li>
<p>GlideRecord.applyEncodedQuery -- found in activity definitions</p>
<ul>
<li>This applies an encoded query to a record and sets it's values.</li>
</ul>
</li>
<li>
<p>task.wf_activity</p>
<ul>
<li>Note: the wf_activity field is disabled in the dictionary, so is not visible in the form or list views. But it's still valid to use in a script.</li>
<li>Clearing this out on tasks when "restarting" workflow will reuse tasks, if you clear this out, it will make new.</li>
<li>I had a ask where a customer wanted a "Revert to New" UI Action inside a Change record but wanted to keep the history of Closed Incomplete Change Tasks to show that a change failed and had to be restarted</li>
</ul>
<p>Every time I'd restart the workflow it would re-use the last made change tasks and overwrite information that we wanted to keep for history's sake. -- Lee Hollister</p>
</li>
<li>
<p>GlideTemplate</p>
</li>
<li>
<p>GlideTemplate.get</p>
</li>
<li>
<p>GlideMutex</p>
<ul>
<li><a href="https://community.servicenow.com/message/953897">https://community.servicenow.com/message/953897</a></li>
<li>exclusiveWithSpin</li>
<li>get()</li>
<li>getExclusiveWithSpin()</li>
<li>getNonExclusive()</li>
<li>getWithSpin()</li>
<li>invalidate()</li>
<li>nonExclusive</li>
<li>withSpin</li>
</ul>
</li>
</ul>
</li>
<li>
<p>Client-Side APIs</p>
<ul>
<li>
<p><a href="https://hi.service-now.com/scripts/classes/doctype/NotificationMessage.js">UINotification aka NotificationMessage</a></p>
</li>
<li>
<p><a href="https://hi.service-now.com/scripts/consts/GlideEvent.js">Event</a></p>
</li>
<li>
<p><a href="https://hi.service-now.com/scripts/sn/common/util/service.dateUtils.js">service.dateUtils.js</a></p>
<ul>
<li>getDateFromFormat</li>
</ul>
</li>
<li>
<p><a href="https://hi.service-now.com/scripts/doctype/GlideForm14.js">g_form (desktop)</a></p>
</li>
<li>
<p><a href="https://hi.service-now.com/scripts/scoped_object_generators.js">g_form (mobile/service portal)</a></p>
<ul>
<li>setVariablesReadOnly</li>
</ul>
</li>
<li>
<p>Client-Side Properties</p>
<ul>
<li>
<p><a href="https://hi.service-now.com/scripts/calendar.js">calendar.js</a></p>
<ul>
<li>g_user_date_format</li>
<li>g_user_date_time_format</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>
<p>REST APIS</p>
<ul>
<li>Search Endpoint:<br />
<code>/now/globalsearch/search?sysparm_search=TERMGOESHERE&sysparm_groups=SYSIDOFSEARCHGROUP</code><br />
Header: <code>header: application/json</code></li>
</ul>
</li>
</ul>
<p>Inspiration/Resources; <a href="https://snprotips.com/undocumented-servicenow-apis/">Undocumented Scripts by SN Pro Tips</a></p>
<!--EndFragment-->Logtail a node in ServiceNow2017-09-26T10:59:07Zhttps://jace.pro/post/2017-09-26-logtail/Jace Benson<p>Point your browser to <code>/channel.do?sysparm_channel=logtail</code></p>
<p>What does this load?</p>
<p><img src="https://jace.pro/static/img/screenshot-logtail.png" alt="Screenshot of logtail.do in ServiceNow" title="Screenshot of logtail.do in ServiceNow" /></p>
<p>This was posted on (now defunct) servicenowgems.com but I have to cover it too.</p>
<p>I was wondering how this worked. This is a logtail for the logs in ServiceNow in the system on the UI page
<code>channel.do?sysparm_channel=logtail</code>.</p>
<p>This is called via the UI page channel.do which make a GlideAjax request to ChannelAjax.
I tried to find all the parts that make this work, and I was able to create a new channel, but I was unable to direct any logs to it.
Below are all the exposed files I could find that made this work. This points to <code>channel_stream.do</code> and <code>threads.do</code> which are both black boxed.</p>
Client Script - Validating Phone2017-09-26T01:58:56Zhttps://jace.pro/post/2017-09-25-validating-phone/Jace Benson<!--StartFragment-->
<p>I've found two real ways to verify the data meets the needs you have.</p>
<ol>
<li>Client script to do entire validation</li>
<li>Client script to ask server if data is valid</li>
</ol>
<p>This will use all client-side validation. I set up a config variable<br />
where you need to;</p>
<ul>
<li>Specify the field to check</li>
<li>Specify how long you need the number to be without non-digits</li>
<li>Specify the error that will appear</li>
<li>Specify how the number should be broken up</li>
</ul>
<!--EndFragment-->
<pre class="language-javascript"><code class="language-javascript"><span class="token keyword">function</span> <span class="token function">onChange</span><span class="token punctuation">(</span><span class="token parameter">control<span class="token punctuation">,</span> oldValue<span class="token punctuation">,</span> newValue<span class="token punctuation">,</span> isLoading</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> config <span class="token operator">=</span> <span class="token punctuation">{</span><br /> <span class="token literal-property property">field</span><span class="token operator">:</span> <span class="token string">'phone'</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">required_length</span><span class="token operator">:</span> <span class="token number">10</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">error</span><span class="token operator">:</span> <span class="token string">'Invalid telephone number. Please enter your telephone number including area code.'</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">sections</span><span class="token operator">:</span> <span class="token punctuation">{</span><br /> <span class="token literal-property property">one</span><span class="token operator">:</span> <span class="token number">3</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">two</span><span class="token operator">:</span> <span class="token number">3</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">three</span><span class="token operator">:</span> <span class="token number">4</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><span class="token punctuation">;</span><br /> <span class="token comment">// no need to change the below</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>isLoading <span class="token operator">||</span> newValue <span class="token operator">===</span> <span class="token string">''</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">return</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> config<span class="token punctuation">.</span>error_flag <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span><br /> g_form<span class="token punctuation">.</span><span class="token function">hideFieldMsg</span><span class="token punctuation">(</span>config<span class="token punctuation">.</span>field<span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> regexGoodForm <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">RegExp</span><span class="token punctuation">(</span><span class="token string">"^\\([\\d]{"</span><br /> <span class="token operator">+</span> config<span class="token punctuation">.</span>sections<span class="token punctuation">.</span>one<br /> <span class="token operator">+</span> <span class="token string">"}\\)\\s[\\d]{"</span><br /> <span class="token operator">+</span> config<span class="token punctuation">.</span>sections<span class="token punctuation">.</span>two<br /> <span class="token operator">+</span> <span class="token string">"}\\-[\\d]{"</span><br /> <span class="token operator">+</span> config<span class="token punctuation">.</span>sections<span class="token punctuation">.</span>three<br /> <span class="token operator">+</span> <span class="token string">"}$"</span><span class="token punctuation">,</span> <span class="token string">"g"</span><br /> <span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> isGoodForm <span class="token operator">=</span> regexGoodForm<span class="token punctuation">.</span><span class="token function">test</span><span class="token punctuation">(</span>newValue<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token comment">//if value does not match (n1) n2-n3 format</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>isGoodForm<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> regexNonDigits <span class="token operator">=</span> <span class="token regex"><span class="token regex-delimiter">/</span><span class="token regex-source language-regex">[^\d]</span><span class="token regex-delimiter">/</span><span class="token regex-flags">g</span></span><span class="token punctuation">;</span><br /> <span class="token comment">// remove all non number from string</span><br /> <span class="token keyword">var</span> userPhone <span class="token operator">=</span> newValue<span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span>regexNonDigits<span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token comment">// verify if number is x digits</span><br /> <span class="token keyword">var</span> regexXDigits <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">RegExp</span><span class="token punctuation">(</span><span class="token string">"[^d]\{"</span><br /> <span class="token operator">+</span> config<span class="token punctuation">.</span>required_length<br /> <span class="token operator">+</span> <span class="token string">"\}"</span><span class="token punctuation">,</span> <span class="token string">"g"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> isXDigits <span class="token operator">=</span> regexXDigits<span class="token punctuation">.</span><span class="token function">test</span><span class="token punctuation">(</span>userPhone<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>isXDigits<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token comment">// if true, reformat to (n1) n2-n3</span><br /> <span class="token keyword">var</span> onePlusTwo <span class="token operator">=</span> config<span class="token punctuation">.</span>sections<span class="token punctuation">.</span>two <span class="token operator">+</span> config<span class="token punctuation">.</span>sections<span class="token punctuation">.</span>one<span class="token punctuation">;</span><br /> <span class="token keyword">var</span> onePlusTwoPlusThree <span class="token operator">=</span> config<span class="token punctuation">.</span>sections<span class="token punctuation">.</span>three <span class="token operator">+</span> onePlusTwo<span class="token punctuation">;</span><br /> <span class="token keyword">var</span> newNum <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">;</span><br /> newNum <span class="token operator">+=</span> <span class="token string">'('</span> <span class="token operator">+</span> userPhone<span class="token punctuation">.</span><span class="token function">substring</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> config<span class="token punctuation">.</span>sections<span class="token punctuation">.</span>one<span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">') '</span><span class="token punctuation">;</span><br /> newNum <span class="token operator">+=</span> userPhone<span class="token punctuation">.</span><span class="token function">substring</span><span class="token punctuation">(</span>config<span class="token punctuation">.</span>sections<span class="token punctuation">.</span>one<span class="token punctuation">,</span> onePlusTwo<span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">'-'</span><span class="token punctuation">;</span><br /> newNum <span class="token operator">+=</span> userPhone<span class="token punctuation">.</span><span class="token function">substring</span><span class="token punctuation">(</span>onePlusTwo<span class="token punctuation">,</span> onePlusTwoPlusThree<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> g_form<span class="token punctuation">.</span><span class="token function">setValue</span><span class="token punctuation">(</span>config<span class="token punctuation">.</span>field<span class="token punctuation">,</span> newNum<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><br /> <span class="token comment">// if true not, trigger error</span><br /> config<span class="token punctuation">.</span>error_flag <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>config<span class="token punctuation">.</span>error_flag<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> g_form<span class="token punctuation">.</span><span class="token function">clearValue</span><span class="token punctuation">(</span>config<span class="token punctuation">.</span>field<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> g_form<span class="token punctuation">.</span><span class="token function">showFieldMsg</span><span class="token punctuation">(</span>config<span class="token punctuation">.</span>field<span class="token punctuation">,</span> config<span class="token punctuation">.</span>error<span class="token punctuation">,</span> <span class="token string">'error'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span></code></pre>
Client Script - Validating emails2017-09-26T01:58:42Zhttps://jace.pro/post/2017-09-25-validating-emails/Jace Benson<!--StartFragment-->
<p>I suggest you don't use it as you can't ensure the data.</p>
<p>I found two real ways to verify the data meets the needs you have.</p>
<ol>
<li>Client script to do entire validation</li>
<li>Client script to ask server if data is valid</li>
</ol>
<p>This will use all client-side validation.</p>
<!--EndFragment-->
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">// Name: Email Validator</span><br /><span class="token comment">// Type: onSubmit</span><br /><span class="token comment">// UI Type: All</span><br /><span class="token keyword">function</span> <span class="token function">onSubmit</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> field <span class="token operator">=</span> <span class="token string">'email'</span><span class="token punctuation">;</span><br /> g_form<span class="token punctuation">.</span><span class="token function">hideFieldMsg</span><span class="token punctuation">(</span>field<span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">return</span> <span class="token function">isEmailValid</span><span class="token punctuation">(</span>field<span class="token punctuation">,</span> g_form<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span>field<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span><br /><br /><span class="token keyword">function</span> <span class="token function">isEmailValid</span><span class="token punctuation">(</span><span class="token parameter">field<span class="token punctuation">,</span> value</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> problemMsg <span class="token operator">=</span> <span class="token function">isEmailValidWithReason</span><span class="token punctuation">(</span>value<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>problemMsg <span class="token operator">!==</span> <span class="token string">""</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token comment">//jslog("isEmailValid: " + problemMsg);</span><br /> g_form<span class="token punctuation">.</span><span class="token function">showFieldMsg</span><span class="token punctuation">(</span>field<span class="token punctuation">,</span> problemMsg<span class="token punctuation">,</span> <span class="token string">'error'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">return</span> <span class="token boolean">false</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span><br /><br /><span class="token keyword">function</span> <span class="token function">isEmailValidWithReason</span><span class="token punctuation">(</span><span class="token parameter">value</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> localPartChars <span class="token operator">=</span> <span class="token string">"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%*/?|^{}`~&'+-=_."</span><span class="token punctuation">,</span><br /> domainChars <span class="token operator">=</span> <span class="token string">"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_."</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>value<span class="token punctuation">.</span><span class="token function">indexOf</span><span class="token punctuation">(</span><span class="token string">"@"</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">return</span> <span class="token string">"missing @ sign"</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">var</span> s <span class="token operator">=</span> value<span class="token punctuation">.</span><span class="token function">split</span><span class="token punctuation">(</span><span class="token string">"@"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>s<span class="token punctuation">.</span>length <span class="token operator">!=</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">return</span> <span class="token string">"one at signs allowed"</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token function">containsOnlyChars</span><span class="token punctuation">(</span>localPartChars<span class="token punctuation">,</span> s<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">return</span> <span class="token string">"invalid character before the at sign"</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>s<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span>length <span class="token operator"><</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">return</span> <span class="token string">"at least one character must be before the at sign"</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>s<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">substr</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token string">"."</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">return</span> <span class="token string">"period cannot be the first character"</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>s<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">substr</span><span class="token punctuation">(</span>s<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span>length <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token string">"."</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">return</span> <span class="token string">"period cannot be the last character before the at sign"</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token function">containsOnlyChars</span><span class="token punctuation">(</span>domainChars<span class="token punctuation">,</span> s<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">return</span> <span class="token string">"invalid character after the at sign"</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">var</span> periodIndex <span class="token operator">=</span> s<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">indexOf</span><span class="token punctuation">(</span><span class="token string">"."</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>periodIndex <span class="token operator">==</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">return</span> <span class="token string">"missing period after the at sign"</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>periodIndex <span class="token operator">===</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">return</span> <span class="token string">"period cannot be the first character after the at sign"</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">var</span> periods <span class="token operator">=</span> s<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">split</span><span class="token punctuation">(</span><span class="token string">"."</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> lastPeriod <span class="token operator">=</span> periods<span class="token punctuation">[</span>periods<span class="token punctuation">.</span>length <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>lastPeriod<span class="token punctuation">.</span>length <span class="token operator"><</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">return</span> <span class="token string">"must be at least 1 character after the last period"</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token function">isAlphaNum</span><span class="token punctuation">(</span>s<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">substr</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">return</span> <span class="token string">"the first character after the at sign must be alphanumeric"</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token function">isAlphaNum</span><span class="token punctuation">(</span>s<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">substr</span><span class="token punctuation">(</span>s<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">.</span>length <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">return</span> <span class="token string">"the last character must be alphanumeric"</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">return</span> <span class="token string">""</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span><br /><br /><span class="token keyword">function</span> <span class="token function">isAlpha</span><span class="token punctuation">(</span><span class="token parameter">thchar</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">return</span> <span class="token punctuation">(</span>thchar <span class="token operator">>=</span> <span class="token string">'a'</span> <span class="token operator">&&</span> thchar <span class="token operator"><=</span> <span class="token string">'z\uffff'</span><span class="token punctuation">)</span> <span class="token operator">||</span> <span class="token punctuation">(</span>thchar <span class="token operator">>=</span> <span class="token string">'A'</span> <span class="token operator">&&</span> thchar <span class="token operator"><=</span> <span class="token string">'Z\uffff'</span><span class="token punctuation">)</span> <span class="token operator">||</span> thchar <span class="token operator">==</span> <span class="token string">'_'</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span><br /><br /><span class="token keyword">function</span> <span class="token function">isAlphaNum</span><span class="token punctuation">(</span><span class="token parameter">thchar</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">return</span> <span class="token function">isAlpha</span><span class="token punctuation">(</span>thchar<span class="token punctuation">)</span> <span class="token operator">||</span> <span class="token function">isDigit</span><span class="token punctuation">(</span>thchar<span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span><br /><br /><span class="token keyword">function</span> <span class="token function">isDigit</span><span class="token punctuation">(</span><span class="token parameter">thchar</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">return</span> <span class="token punctuation">(</span>thchar <span class="token operator">>=</span> <span class="token string">'0'</span> <span class="token operator">&&</span> thchar <span class="token operator"><=</span> <span class="token string">'9'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span><br /><br /><span class="token keyword">function</span> <span class="token function">containsOnlyChars</span><span class="token punctuation">(</span><span class="token parameter">validChars<span class="token punctuation">,</span> sText</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>sText<span class="token punctuation">)</span><br /> <span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span><br /> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">var</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> sText<span class="token punctuation">.</span>length<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> c <span class="token operator">=</span> sText<span class="token punctuation">.</span><span class="token function">charAt</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>validChars<span class="token punctuation">.</span><span class="token function">indexOf</span><span class="token punctuation">(</span>c<span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><br /> <span class="token keyword">return</span> <span class="token boolean">false</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span></code></pre>
Useful Client Scripts2017-09-26T01:58:29Zhttps://jace.pro/post/2017-09-25-useful-client-scripts/Jace Benson<!--StartFragment-->
<p>These are my useful catalog client scripts, I've found/written over the<br />
years. Please note the comments aren't<br />
the best and I do mean to improve them. Some of these functions aren't<br />
documented and won't work in all places.</p>
<h2>Run code on order guides in and out of the portal</h2>
<pre class="language-javascript"><code class="language-javascript"><span class="token keyword">function</span> <span class="token function">onLoad</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token comment">/**<br /> * So here is the case, I have a variable set being used in an order guide and catalog item.<br /> * I want to hide the set on the catalog item and make it visible on the form if the user<br /> * submits the order via order guide. If the user directly submits the catalog item then they<br /> * should not see the variable set on the form.<br /> */</span><br /> <span class="token keyword">try</span><span class="token punctuation">{</span><br /> <span class="token comment">//if on standard UI hide form</span><br /> <span class="token keyword">var</span> guide <span class="token operator">=</span> <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">"sysparm_guide"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//if on a guide, and the standard ui this will not eq null</span><br /> <span class="token keyword">if</span><span class="token punctuation">(</span>guide<span class="token punctuation">)</span><span class="token punctuation">{</span><br /> g_form<span class="token punctuation">.</span><span class="token function">setDisplay</span><span class="token punctuation">(</span><span class="token string">'create_for_user'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><br /> g_form<span class="token punctuation">.</span><span class="token function">setDisplay</span><span class="token punctuation">(</span><span class="token string">'create_for_user'</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span> <span class="token keyword">catch</span><span class="token punctuation">(</span>e<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//if on sp, $("") will fail</span><br /> <span class="token keyword">var</span> sp_guide <span class="token operator">=</span> g_service_catalog<span class="token punctuation">.</span><span class="token function">isOrderGuide</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span><span class="token punctuation">(</span>sp_guide<span class="token punctuation">)</span><span class="token punctuation">{</span><br /> g_form<span class="token punctuation">.</span><span class="token function">setDisplay</span><span class="token punctuation">(</span><span class="token string">'create_for_user'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><br /> g_form<span class="token punctuation">.</span><span class="token function">setDisplay</span><span class="token punctuation">(</span><span class="token string">'create_for_user'</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span></code></pre>
<h2>Date is after today</h2>
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">//Date is after today</span><br /><span class="token comment">//GwtDate not available on service portal</span><br /><span class="token keyword">function</span> <span class="token function">onSubmit</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token comment">//Type appropriate comment here, and begin script below</span><br /> <span class="token comment">//ensure that the start date is before the today's date</span><br /> <span class="token keyword">var</span> field <span class="token operator">=</span> <span class="token string">'start_date'</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> st <span class="token operator">=</span> g_form<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span>field<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> newTime <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GwtDate</span><span class="token punctuation">(</span>st<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> tm <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GwtDate</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> tm<span class="token punctuation">.</span><span class="token function">now</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> tm<span class="token punctuation">.</span><span class="token function">subtractHours</span><span class="token punctuation">(</span><span class="token number">24</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>newTime<span class="token punctuation">.</span><span class="token function">compare</span><span class="token punctuation">(</span>tm<span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span> <span class="token operator"><</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> g_form<span class="token punctuation">.</span><span class="token function">hideFieldMsg</span><span class="token punctuation">(</span>field<span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> g_form<span class="token punctuation">.</span><span class="token function">showFieldMsg</span><span class="token punctuation">(</span>field<span class="token punctuation">,</span> <span class="token string">'Start date must be after the today\'s date.'</span><span class="token punctuation">,</span> <span class="token string">'error'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">return</span> <span class="token boolean">false</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span></code></pre>
<h2>Ensure Date is after a set time</h2>
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">//Ensure Date is after set time</span><br /><span class="token keyword">function</span> <span class="token function">onSubmit</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> returnVal <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span><br /> <span class="token comment">//Type appropriate comment here, and begin script below</span><br /> <span class="token comment">//Ensure that the given field's date is at least or equal to the milleseconds to add.</span><br /> <span class="token keyword">var</span> field <span class="token operator">=</span> <span class="token string">'project_deadline'</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> msToAdd <span class="token operator">=</span> <span class="token number">1000</span> <span class="token operator">*</span> <span class="token number">60</span> <span class="token operator">*</span> <span class="token number">60</span> <span class="token operator">*</span> <span class="token number">24</span> <span class="token operator">*</span> <span class="token number">7</span><span class="token punctuation">;</span><span class="token comment">//ms * sec * minutes * hours * days//this is a week</span><br /> <span class="token keyword">var</span> errorMsg <span class="token operator">=</span> <span class="token string">'This must be at least a week out.'</span><span class="token punctuation">;</span><br /> <span class="token comment">/****************************************************/</span><br /> <span class="token comment">/* You shouldn't have to change anything below */</span><br /> <span class="token comment">/****************************************************/</span><br /> <span class="token keyword">var</span> now <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Date</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> givenDate <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Date</span><span class="token punctuation">(</span>g_form<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span>field<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token comment">//forwhatever reason, at this point this returns 9/24 when you select 9/25</span><br /> <span class="token comment">//givenauthor: 'jace'</span><br /><span class="token literal-property property">date</span><span class="token operator">:</span>Mon Sep <span class="token number">24</span> <span class="token number">2017</span> <span class="token number">19</span><span class="token operator">:</span><span class="token number">00</span><span class="token operator">:</span><span class="token number">00</span> <span class="token constant">GMT</span><span class="token operator">-</span><span class="token number">0500</span> <span class="token punctuation">(</span>Central Daylight Time<span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">1506347252815</span><span class="token punctuation">]</span><br /> <span class="token comment">//when you select 9/25</span><br /> givenDate<span class="token punctuation">.</span><span class="token function">setDate</span><span class="token punctuation">(</span>projectDeadline<span class="token punctuation">.</span><span class="token function">getDate</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//so add a day</span><br /> givenDate<span class="token punctuation">.</span><span class="token function">setHours</span><span class="token punctuation">(</span>now<span class="token punctuation">.</span><span class="token function">getHours</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> givenDate<span class="token punctuation">.</span><span class="token function">setMinutes</span><span class="token punctuation">(</span>now<span class="token punctuation">.</span><span class="token function">getMinutes</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> givenDate<span class="token punctuation">.</span><span class="token function">setSeconds</span><span class="token punctuation">(</span>now<span class="token punctuation">.</span><span class="token function">getSeconds</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> givenDate<span class="token punctuation">.</span><span class="token function">setMilliseconds</span><span class="token punctuation">(</span>now<span class="token punctuation">.</span><span class="token function">getMilliseconds</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token comment">//now returns;</span><br /> <span class="token comment">//givenauthor: 'jace'</span><br /><span class="token literal-property property">date</span><span class="token operator">:</span>Mon Sep <span class="token number">25</span> <span class="token number">2017</span> <span class="token number">08</span><span class="token operator">:</span><span class="token number">47</span><span class="token operator">:</span><span class="token number">32</span> <span class="token constant">GMT</span><span class="token operator">-</span><span class="token number">0500</span> <span class="token punctuation">(</span>Central Daylight Time<span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">1506347252815</span><span class="token punctuation">]</span><br /> <span class="token keyword">var</span> nextWeek <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Date</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> nextWeek<span class="token punctuation">.</span><span class="token function">setTime</span><span class="token punctuation">(</span>nextWeek<span class="token punctuation">.</span><span class="token function">getTime</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> msToAdd<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token comment">//console.log('projectDeadline: ' + projectDeadline + '[' + projectDeadline.getTime() + ']');</span><br /> <span class="token comment">//console.log('weekAhead : ' + weekAhead + '[' + weekAhead.getTime() + ']');</span><br /> <span class="token keyword">var</span> givenDateGreaterOrEqualToNextWeek <span class="token operator">=</span> givenDate<span class="token punctuation">.</span><span class="token function">getTime</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">>=</span> nextWeek<span class="token punctuation">.</span><span class="token function">getTime</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token comment">//console.log('givenDateGreaterOrEqualToNextWeek: ' + givenDateGreaterOrEqualToNextWeek);</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>givenDateGreaterOrEqualToNextWeek<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> returnVal <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><br /> g_form<span class="token punctuation">.</span><span class="token function">hideFieldMsg</span><span class="token punctuation">(</span>field<span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> g_form<span class="token punctuation">.</span><span class="token function">showFieldMsg</span><span class="token punctuation">(</span>field<span class="token punctuation">,</span> errorMsg<span class="token punctuation">,</span> <span class="token string">'error'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">return</span> returnVal<span class="token punctuation">;</span><br /><span class="token punctuation">}</span></code></pre>
<h2>Verify Date is after a variable</h2>
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">//Verify Date is after variable</span><br /><span class="token keyword">function</span> <span class="token function">onSubmit</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token comment">//Verify that the start date is before the end date</span><br /> <span class="token keyword">var</span> st <span class="token operator">=</span> <span class="token function">getDateFromFormat</span><span class="token punctuation">(</span>g_form<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token string">"start_date_time"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> g_user_date_time_format<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> et <span class="token operator">=</span> <span class="token function">getDateFromFormat</span><span class="token punctuation">(</span>g_form<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token string">"end_date_time"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> g_user_date_time_format<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>st <span class="token operator">></span> et<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> g_form<span class="token punctuation">.</span><span class="token function">hideAllFieldMsgs</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token function">alert</span><span class="token punctuation">(</span><span class="token string">"Estimated end date must be after the start date."</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> g_form<span class="token punctuation">.</span><span class="token function">showErrorBox</span><span class="token punctuation">(</span><span class="token string">"resource_est_end_date"</span><span class="token punctuation">,</span> <span class="token string">"Estimated end date must be after the start date."</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">return</span> <span class="token boolean">false</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span></code></pre>
<h2>Require Checkboxes</h2>
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">//require checkboxes</span><br /><br /><span class="token keyword">function</span> <span class="token function">onSubmit</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token comment">//Set the mandatory checkbox variable names and total mandatory count here</span><br /> <span class="token keyword">var</span> mandatoryVars <span class="token operator">=</span> <span class="token string">'option1,option2,option3,option4'</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> mandatoryCount <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> passed <span class="token operator">=</span> <span class="token function">forceMandatoryCheckboxes</span><span class="token punctuation">(</span>mandatoryVars<span class="token punctuation">,</span> mandatoryCount<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>passed<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token comment">//Abort the submit</span><br /> <span class="token function">alert</span><span class="token punctuation">(</span><span class="token string">'You must select at least '</span> <span class="token operator">+</span> mandatoryCount <span class="token operator">+</span> <span class="token string">' options.'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">return</span> <span class="token boolean">false</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span><br /><span class="token keyword">function</span> <span class="token function">forceMandatoryCheckboxes</span><span class="token punctuation">(</span><span class="token parameter">mandatory<span class="token punctuation">,</span> count</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token comment">//Split the mandatory variable names into an array</span><br /> mandatory <span class="token operator">=</span> mandatory<span class="token punctuation">.</span><span class="token function">split</span><span class="token punctuation">(</span><span class="token string">','</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> answer <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> varFound <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> numTrue <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span><br /> <span class="token comment">//Check each variable in the array</span><br /> <span class="token keyword">for</span> <span class="token punctuation">(</span>x <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> x <span class="token operator"><</span> mandatory<span class="token punctuation">.</span>length<span class="token punctuation">;</span> x<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//Check to see if variable exists</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>g_form<span class="token punctuation">.</span><span class="token function">getControl</span><span class="token punctuation">(</span>mandatory<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> varFound <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span> <span class="token comment">//Check to see if variable is set to 'true'</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>g_form<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span>mandatory<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token string">'true'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> numTrue<span class="token operator">++</span><span class="token punctuation">;</span> <span class="token comment">//Exit the loop if we have reached required number of 'true'</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>numTrue <span class="token operator">>=</span> count<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> answer <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span><br /> <span class="token keyword">break</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /> <span class="token comment">//If we didn't find any of the variables allow the submit</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>varFound <span class="token operator">==</span> <span class="token boolean">false</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> answer <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token comment">//Return true or false</span><br /> <span class="token keyword">return</span> answer<span class="token punctuation">;</span><br /><span class="token punctuation">}</span></code></pre>
<h2>Show field if x are checked</h2>
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">//show field if x are chekced</span><br /><br /><span class="token comment">/*<br /> * Origin;<br /> * https://community.servicenow.com/message/1025641<br />*/</span><br /><span class="token keyword">function</span> <span class="token function">onChange</span><span class="token punctuation">(</span><span class="token parameter">control<span class="token punctuation">,</span> oldValue<span class="token punctuation">,</span> newValue<span class="token punctuation">,</span> isLoading</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token comment">//Set the mandatory checkbox variable names and total mandatory count here</span><br /> <span class="token keyword">var</span> mandatoryVars <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">'option1'</span><span class="token punctuation">,</span> <span class="token string">'option2'</span><span class="token punctuation">,</span> <span class="token string">'option3'</span><span class="token punctuation">,</span> <span class="token string">'option4'</span><span class="token punctuation">,</span> <span class="token string">'option5'</span><span class="token punctuation">]</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> variableToShow <span class="token operator">=</span> <span class="token string">'someothervariable'</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> requiredCount <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> actualCount <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span><br /> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">var</span> x <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> x <span class="token operator"><</span> mandatoryVars<span class="token punctuation">.</span>length<span class="token punctuation">;</span> x<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>g_form<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span>mandatoryVars<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token string">'true'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> actualCount<span class="token operator">++</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>requiredCount <span class="token operator"><=</span> actualCount<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> g_form<span class="token punctuation">.</span><span class="token function">setDisplay</span><span class="token punctuation">(</span>variableToShow<span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><br /> g_form<span class="token punctuation">.</span><span class="token function">setDisplay</span><span class="token punctuation">(</span>variableToShow<span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span></code></pre>
<h2>Require numbers</h2>
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">//Require numbers</span><br /><span class="token keyword">function</span> <span class="token function">onChange</span><span class="token punctuation">(</span><span class="token parameter">control<span class="token punctuation">,</span> oldValue<span class="token punctuation">,</span> newValue<span class="token punctuation">,</span> isLoading<span class="token punctuation">,</span> isTemplate</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>isLoading <span class="token operator">||</span> newValue <span class="token operator">==</span> <span class="token string">''</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">return</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">var</span> regexp <span class="token operator">=</span> <span class="token regex"><span class="token regex-delimiter">/</span><span class="token regex-source language-regex">^[0-9]*$</span><span class="token regex-delimiter">/</span></span><span class="token punctuation">;</span><br /> g_form<span class="token punctuation">.</span><span class="token function">hideFieldMsg</span><span class="token punctuation">(</span>control<span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>regexp<span class="token punctuation">.</span><span class="token function">test</span><span class="token punctuation">(</span>newValue<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> g_form<span class="token punctuation">.</span><span class="token function">showFieldMsg</span><span class="token punctuation">(</span>control<span class="token punctuation">,</span> <span class="token string">'That is not a number'</span><span class="token punctuation">,</span> <span class="token string">'error'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> control<span class="token punctuation">.</span>value <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span></code></pre>
<h2>Set Placeholder</h2>
<p>This is unnecessary after Jakarta</p>
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">//set place holder</span><br /><span class="token comment">//this is unnecessary in Jakarta see https://servicenow.implementation.blog/great-ui-trick-html-placeholders/</span><br /><span class="token keyword">function</span> <span class="token function">onLoad</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token function">u_addPlaceholderAttribute</span><span class="token punctuation">(</span><span class="token string">'user'</span><span class="token punctuation">,</span><span class="token string">'Someones name goes here'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span><br /><span class="token keyword">function</span> <span class="token function">u_addPlaceholderAttribute</span><span class="token punctuation">(</span><span class="token parameter">variableName<span class="token punctuation">,</span> hint</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">try</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> fieldName <span class="token operator">=</span> g_form<span class="token punctuation">.</span><span class="token function">getControl</span><span class="token punctuation">(</span>variableName<span class="token punctuation">)</span><span class="token punctuation">.</span>name<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>Prototype<span class="token punctuation">.</span>Browser<span class="token punctuation">.</span><span class="token constant">IE</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> fieldName<span class="token punctuation">.</span>placeholder <span class="token operator">=</span> hint<span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><br /> <span class="token function">$</span><span class="token punctuation">(</span>fieldName<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">writeAttribute</span><span class="token punctuation">(</span><span class="token string">'placeholder'</span><span class="token punctuation">,</span> hint<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>err<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><br /><span class="token punctuation">}</span></code></pre>
<h2>Make variables ReadOnly</h2>
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">//make variables readonly</span><br /><span class="token keyword">function</span> <span class="token function">onLoad</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">try</span> <span class="token punctuation">{</span><br /> <span class="token comment">//Get the 'Variables' section</span><br /> <span class="token keyword">var</span> ve <span class="token operator">=</span> <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'variable_map'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">up</span><span class="token punctuation">(</span><span class="token string">'table'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token comment">//Disable all elements within with a class of 'cat_item_option'</span><br /> ve<span class="token punctuation">.</span><span class="token function">select</span><span class="token punctuation">(</span><span class="token string">'.cat_item_option'</span><span class="token punctuation">,</span> <span class="token string">'.slushselectmtm'</span><span class="token punctuation">,</span> <span class="token string">'.questionsetreference'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">each</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">elmt</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> elmt<span class="token punctuation">.</span>disabled <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token comment">//Remove any reference or calendar icons</span><br /> ve<span class="token punctuation">.</span><span class="token function">select</span><span class="token punctuation">(</span><span class="token string">'img[src*=reference_list.gifx]'</span><span class="token punctuation">,</span> <span class="token string">'img[src*=small_calendar.gifx]'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">each</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">img</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> img<span class="token punctuation">.</span><span class="token function">hide</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token comment">//Hide list collector icons</span><br /> ve<span class="token punctuation">.</span><span class="token function">select</span><span class="token punctuation">(</span><span class="token string">'img[src*=arrow]'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">each</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">img</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> img<span class="token punctuation">.</span><span class="token function">up</span><span class="token punctuation">(</span><span class="token string">'table'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">hide</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>e<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><br /><span class="token punctuation">}</span></code></pre>
<h2>Flash variable</h2>
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">//flash variable</span><br /><span class="token keyword">function</span> <span class="token function">flashVar</span><span class="token punctuation">(</span><span class="token parameter">v</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> g_form<span class="token punctuation">.</span>nameMap<span class="token punctuation">.</span><span class="token function">map</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">rec</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>rec<span class="token punctuation">.</span>prettyName <span class="token operator">===</span> v<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> g_form<span class="token punctuation">.</span><span class="token function">flash</span><span class="token punctuation">(</span><span class="token string">"ni.VE"</span> <span class="token operator">+</span> rec<span class="token punctuation">.</span>realName<span class="token punctuation">,</span> <span class="token string">"#FFFACD"</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span><br /><span class="token function">flashVar</span><span class="token punctuation">(</span><span class="token string">'server_decom_prepinfo'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<h2>Require Attachment</h2>
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">//require attachment</span><br /><span class="token keyword">function</span> <span class="token function">onSubmit</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token string">'use strict'</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> attachment <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">"sys_attachment"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> attachment<span class="token punctuation">.</span><span class="token function">addQuery</span><span class="token punctuation">(</span><span class="token string">"table_name"</span><span class="token punctuation">,</span> <span class="token string">"sc_cart_item"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> attachment<span class="token punctuation">.</span><span class="token function">addQuery</span><span class="token punctuation">(</span><span class="token string">"table_sys_id"</span><span class="token punctuation">,</span> <span class="token function">gel</span><span class="token punctuation">(</span><span class="token string">'sysparm_item_guid'</span><span class="token punctuation">)</span><span class="token punctuation">.</span>value<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> attachment<span class="token punctuation">.</span><span class="token function">query</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>attachment<span class="token punctuation">.</span><span class="token function">hasNext</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token function">alert</span><span class="token punctuation">(</span><span class="token string">"You must attach your public SSH Key. Please see instructions for more information."</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">return</span> <span class="token boolean">false</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span></code></pre>
<h2>Set Server fields</h2>
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">//ser server fields</span><br /><span class="token keyword">function</span> <span class="token function">onChange</span><span class="token punctuation">(</span><span class="token parameter">control<span class="token punctuation">,</span> oldValue<span class="token punctuation">,</span> newValue<span class="token punctuation">,</span> isLoading</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">try</span> <span class="token punctuation">{</span><br /> g_form<span class="token punctuation">.</span><span class="token function">clearValue</span><span class="token punctuation">(</span><span class="token string">'server_ip'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> g_form<span class="token punctuation">.</span><span class="token function">clearValue</span><span class="token punctuation">(</span><span class="token string">'environment'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> g_form<span class="token punctuation">.</span><span class="token function">getReference</span><span class="token punctuation">(</span><span class="token string">'server'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">server</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> g_form<span class="token punctuation">.</span><span class="token function">setValue</span><span class="token punctuation">(</span><span class="token string">'server_ip'</span><span class="token punctuation">,</span> server<span class="token punctuation">.</span>ip_address<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> g_form<span class="token punctuation">.</span><span class="token function">setValue</span><span class="token punctuation">(</span><span class="token string">'environment'</span><span class="token punctuation">,</span> server<span class="token punctuation">.</span>u_env_list<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">catch</span><span class="token punctuation">(</span>error<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>error<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span></code></pre>
<h2>Set Date or Date Time locally to user's format</h2>
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">//This is not documented, but here ya go;</span><br /><br /><span class="token keyword">function</span> <span class="token function">onChange</span><span class="token punctuation">(</span><span class="token parameter">control<span class="token punctuation">,</span> oldValue<span class="token punctuation">,</span> newValue<span class="token punctuation">,</span> isLoading<span class="token punctuation">,</span> isTemplate</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>isLoading <span class="token operator">||</span> newValue <span class="token operator">===</span> <span class="token string">''</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">return</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /><br /> <span class="token keyword">var</span> today <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Date</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> g_form<span class="token punctuation">.</span><span class="token function">setValue</span><span class="token punctuation">(</span><span class="token string">'date_raised_with_vendor'</span><span class="token punctuation">,</span> <span class="token function">formatDate</span><span class="token punctuation">(</span>today<span class="token punctuation">,</span> g_user_date_format<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> g_form<span class="token punctuation">.</span><span class="token function">setValue</span><span class="token punctuation">(</span><span class="token string">'date_time_raised_with_vendor'</span><span class="token punctuation">,</span> <span class="token function">formatDate</span><span class="token punctuation">(</span>today<span class="token punctuation">,</span> g_user_date_time_format<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span><br /><br /><span class="token comment">// Where is 'formatDate' defined? </span><br /><span class="token comment">// Well, let me show you; </span><br /><span class="token comment">// This is available on UI16, and may need to be ported over but until then it's loaded from `calendar.js`</span><br /><span class="token comment">// https://hi.service-now.com/scripts/calendar.js</span></code></pre>
<!--EndFragment-->Working from home (WFH)2017-09-22T01:58:19Zhttps://jace.pro/post/2017-09-21-wfh/Jace Benson<!--StartFragment-->
<p>I think <a href="http://theoatmeal.com/">theoatmeal.com</a>'s <a href="http://theoatmeal.com/comics/working_home">Why working from home is both awesome and HORRIBLE</a> sum's up a lot of the social considerations to keep in mind. I'll breakdown my opinion of these thoughts and how to combat them below.</p>
<h2>Degradation of social skills</h2>
<ul>
<li>Work from co-working spaces.</li>
<li>Be an extrovert on evenings and weekends (e.g. go to Meetups or<br />
other social gatherings.)</li>
</ul>
<h2>Distractions</h2>
<ul>
<li>Close Reddit/Facebook/Twitch/etc.</li>
<li>Don't play games.</li>
</ul>
<h2>Stress on relationships</h2>
<ul>
<li>
<p>Have a honest conversation about this with your significant other to<br />
clear this up. If they don't get it, go to a co-working space on<br />
days they'll be home, or send them away.</p>
</li>
<li>
<p>Working from home can sometimes give the impression you have time to<br />
do errands you shouldn't do;</p>
<ul>
<li>fold laundry</li>
<li>rotate laundry</li>
<li>do dishes</li>
<li>clean the floors</li>
</ul>
</li>
</ul>
<h2>Loss of regimen</h2>
<ul>
<li>It's crucial to have a set of hours you're working and then stick to<br />
it.</li>
<li>This tells you when you need to get up and when you need to get out.</li>
</ul>
<h2>Lack of employee banter</h2>
<ul>
<li>Physical interactions with people.</li>
<li>They don't have to be co-workers, but anyone.</li>
<li>Go to a co-working space.</li>
<li>Your cat/dog cannot provide this.</li>
</ul>
<h2>Stay active</h2>
<ul>
<li>Go for a walk on break, get away from your office when you do.</li>
</ul>
<h2>Don't skimp on equipment</h2>
<ul>
<li>
<p>I'd suggest having;</p>
<ol>
<li>Computer Chair (you'll be logging hundreds, if not thousands of<br />
hours in this thing, get one that's comfortable)</li>
<li><a href="https://www.amazon.com/Plantronics-Voyager-Focus-B825-Headset/dp/B013F4LJTI">Active Noise Cancelling headset</a></li>
<li>Webcam (sometimes you need to see someone's face, sometimes<br />
someone needs to see yours)</li>
<li>Mouse and Keyboard (again you'll be spending a lot of time with<br />
these devices, make sure they are great for yourself to use)</li>
</ol>
</li>
</ul>
Notification Troubleshooting2017-09-19T01:57:59Zhttps://jace.pro/post/2017-09-18-notification-troubleshooting/Jace Benson<!--StartFragment-->
<p>Check these steps.</p>
<ol>
<li>
<p>On the notification, verify the notification table is correct.</p>
</li>
<li>
<p>On the notification, verify the conditions are met. <a href="https://hi.service-now.com/kb_view.do?sysparm_article=KB0528655">KB0528655</a></p>
</li>
<li>
<p>On the notification, verify the "Send to event creator" is correct. This doesn't care how the event creator is included if scripted, parm1 or 2 it will include if checked and exclude if unchecked.</p>
</li>
<li>
<p>On the notification, verify the "Send To" or "Send to Event Parm1"<br />
or "Send to Event Parm2".</p>
</li>
<li>
<p>On the notification, verify there is something in the Body of the<br />
notification.</p>
</li>
<li>
<p>On the notification, verify the weight is set. If it's not zero, check the skipped folder. <a href="https://jace.pro/post/2017-09-18-notification-troubleshooting/#weight">Weight</a></p>
</li>
<li>
<p>On the target record, verify the "Send To" or "Send to Event Parm1"<br />
or "Send to Event Parm2" evaluates to an actual email or user or group</p>
</li>
<li>
<p>On the user, verify they are not locked out. <a href="https://hi.service-now.com/kb_view.do?sysparm_article=KB0528699">KB0528699</a></p>
</li>
<li>
<p>On the user, verify they have an email, and it's properly formed. <a href="https://hi.service-now.com/kb_view.do?sysparm_article=KB0528671">KB0528671</a></p>
</li>
<li>
<p>On the user, verify they have an email account, is active, has no notification issues</p>
</li>
<li>
<p>On the user's notification devices (<code>cmn_notif_device_list.do</code>), verify the user has a "Primary Email" device and it correct. <a href="https://hi.service-now.com/kb_view.do?sysparm_article=KB0528667">KB0528667</a></p>
</li>
<li>
<p>On the user's notification subscriptions, verify they haven't disabled this notification. <a href="https://hi.service-now.com/kb_view.do?sysparm_article=KB0516987">KB0516987</a></p>
</li>
<li>
<p>If event generated</p>
<ul>
<li>Verify the event exists on <code>sysevent_list.do?sysparm_query=sys_id=-1</code>. <a href="https://hi.service-now.com/kb_view.do?sysparm_article=KB0523579">KB0523579</a></li>
<li>Check the Event record table is table is correct.</li>
<li>Verify the Events Process job is running <a href="https://hi.service-now.com/kb_view.do?sysparm_article=KB0523580">KB0523580</a> <a href="https://www.youtube.com/watch?v=gYVwq8pH0-A">Youtube</a></li>
</ul>
</li>
<li>
<p>Ensure any mail is working</p>
</li>
<li>
<p>Ensure the system is not sending to the debug user. <a href="https://docs.servicenow.com/bundle/helsinki-servicenow-platform/page/administer/reference-pages/reference/r_OutboundMailConfiguration.html">Outbound Mail Configuration</a></p>
</li>
<li>
<p>Ensure the system is enabled to send email <a href="https://hi.service-now.com/kb_view.do?sysparm_article=KB0524529">KB0524529</a></p>
</li>
</ol>
<p>Thanks Andrew Barnes and some other random person from <a href="http://sndevs.slack.com/">sndevs.slack.com</a> for the inspiration to make this post.</p>
<h2><a href="https://jace.pro/post/2017-09-18-notification-troubleshooting/#weight">Weight</a></h2>
<blockquote>
<p>Set a numerical value for the notification priority relative to other notifications with the same target table and recipients. The system only sends the notification with the highest weight. All other notifications are moved from the Outbox to the Skipped mailbox. The default value 0 causes the system to always send the notification<br />
(assuming the conditions are met).</p>
<p>For example, suppose that a service desk agent adds a comment to an incident and shortly thereafter closes it. By default, these actions trigger both the Incident commented and Incident Closed notifications.</p>
<p>However, both notifications are from the Incident table and also notify the incident caller. The system only sends the notification with the highest weight, which in this case is the Incident Closed<br />
notification.</p>
<p>Determine whether any of the troubleshooting steps below are true for your environment. Each step provides a link to an article that will help you eliminate possible causes and take corrective action as<br />
necessary.</p>
</blockquote>
<p>This is from the <a href="https://docs.servicenow.com/bundle/helsinki-servicenow-platform/page/administer/notification/task/t_CreateANotification.html">docs</a>.</p>
<!--EndFragment-->Search for specific code and sys ids in code and workflow activities2017-09-16T01:57:40Zhttps://jace.pro/post/2017-09-15-search-code-and-wf-activities/Jace Benson<!--StartFragment-->
<p>Searching for code is crucial to understand how something works. As such<br />
here a four ways to do it</p>
<ul>
<li>SNC Guru's "<a href="https://www.servicenowguru.com/system-definition/find-references-specific-record/">Find All System References to a Specific Record</a>"</li>
<li>SN Pro Tip's, "<a href="https://snprotips.com/blog/sncprotips/2015/12/locate-any-record-in-any-table-by-sysidhtml">Locate any record in any table by sysid</a>"</li>
<li>GarretNow's "<a href="https://garrettnow.com/2014/08/12/developer-search/">Developer Search</a>"</li>
<li><a href="https://community.servicenow.com/community/develop/blog/2017/01/15/where-did-i-write-that-piece-of-code">Servicenow's Studio's Code Search</a> as described by Goran Lundqvist</li>
</ul>
<p>One thing none of these do is find Workflow Activities using that value.</p>
<p>Navigating to your <code>/sys_variable_value_list.do?sysparm_query=valueLIKEa033355d95364600ab0db5e2bc674c27</code> will search workflow activities for workflow "variables" containing that sys_id, but you may set have to set your query with the display value, you may have a to do some extra or statements in there to find those. Something to keep in mind, this table has no idea what workflow activities are on "published" workflows, so that is frustrating but it will at least give you a direction of what activities need updating and you can see what workflows those are associated to.</p>
<p>Thanks Michael Domke for sharing this. I've referenced your <a href="https://community.servicenow.com/thread/157997">post on the community</a> a lot.</p>
<!--EndFragment-->Two Step Unsubscribe2017-09-14T01:57:06Zhttps://jace.pro/post/2017-09-13-unsubscribe/Jace Benson<!--StartFragment-->
<p>A stakeholder asked to have users verify they actually want to unsubscribe from an email instead of assuming they want to unsubscribe. To do this I made a simple UI Page. Below is the code</p>
<p>Below is the mail script and ui page. They work together.</p>
<h2>Callable Mail Script Code</h2>
<pre class="language-js"><code class="language-js">$<span class="token punctuation">{</span><span class="token literal-property property">mail_script</span><span class="token operator">:</span>unsubscribe_emails<span class="token punctuation">}</span></code></pre>
<h2>Mail Script</h2>
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">//name this unsubscribe_emails</span><br /><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token function">runMailScript</span><span class="token punctuation">(</span><br /> <span class="token parameter">current<span class="token punctuation">,</span> <br /> template<span class="token punctuation">,</span> <br /> email<span class="token punctuation">,</span> <br /> email_action<span class="token punctuation">,</span> <br /> event</span><br /><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> link <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> emailSysId <span class="token operator">=</span> email_action<span class="token punctuation">.</span>sys_id<br /> <span class="token keyword">var</span> instanceLink <span class="token operator">=</span> gs<span class="token punctuation">.</span><span class="token function">getProperty</span><span class="token punctuation">(</span><span class="token string">'glide.servlet.uri'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> link <span class="token operator">+=</span> <span class="token string">'<a href="'</span> <span class="token operator">+</span> instanceLink<span class="token punctuation">;</span><br /> link <span class="token operator">+=</span> <span class="token string">'verify_unsubscribe.do?'</span><span class="token punctuation">;</span><br /> link <span class="token operator">+=</span> <span class="token string">'notification='</span> <span class="token operator">+</span> emailSysId<span class="token punctuation">;</span><br /> link <span class="token operator">+=</span> <span class="token string">'">Unsubscribe from this email.</a><br />\n'</span><span class="token punctuation">;</span><br /> <span class="token comment">//can this be unsubscribed from?</span><br /> <span class="token keyword">var</span> notification <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'sysevent_email_action'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> notification<span class="token punctuation">.</span><span class="token function">addQuery</span><span class="token punctuation">(</span><span class="token string">'active=true^sys_id='</span> <span class="token operator">+</span> emailSysId<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token comment">//this controls when someone can unsubscribe</span><br /> notification<span class="token punctuation">.</span><span class="token function">addQuery</span><span class="token punctuation">(</span><span class="token string">'mandatory=false'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <br /> notification<span class="token punctuation">.</span><span class="token function">query</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>notification<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> template<span class="token punctuation">.</span><span class="token function">print</span><span class="token punctuation">(</span>link<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">(</span>current<span class="token punctuation">,</span> template<span class="token punctuation">,</span> email<span class="token punctuation">,</span> email_action<span class="token punctuation">,</span> event<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<h2>UI Page</h2>
<pre class="language-xml"><code class="language-xml"><span class="token comment"><!--Name: verify_unsubscribe--></span><br /><span class="token prolog"><?xml version="1.0" encoding="utf-8" ?></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">j:</span>jelly</span> <span class="token attr-name">trim</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>false<span class="token punctuation">"</span></span> <br /> <span class="token attr-name"><span class="token namespace">xmlns:</span>j</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>jelly:core<span class="token punctuation">"</span></span> <br /> <span class="token attr-name"><span class="token namespace">xmlns:</span>g</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>glide<span class="token punctuation">"</span></span> <br /> <span class="token attr-name"><span class="token namespace">xmlns:</span>j2</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>null<span class="token punctuation">"</span></span> <br /> <span class="token attr-name"><span class="token namespace">xmlns:</span>g2</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>null<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">g:</span>evaluate</span><span class="token punctuation">></span></span><br /> var type = false;<br /> var notificationGR = new GlideRecord('sysevent_email_action');<br /> if(notificationGR.get(RP.getParameterValue('notification'))){<br /> type = notificationGR.getValue('name');<br /> }<br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span><span class="token namespace">g:</span>evaluate</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">j:</span>if</span> <span class="token attr-name">test</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>${type!=false}<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>form</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>h1</span><span class="token punctuation">></span></span><br /> Are you sure you want to unsubscribe from this notification?<br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>h1</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>p</span><span class="token punctuation">></span></span><br /> By clicking "Unsubscribe" you will no longer receive<br /> any notifications for "${type}".<br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>p</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>unsubscribe.do?sysparm_notification=${RP.getParameterValue('notification')}<span class="token punctuation">"</span></span> <br /> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>btn btn-primary<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> Unsubscribe<br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>form</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span><span class="token namespace">j:</span>if</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">j:</span>if</span> <span class="token attr-name">test</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>${type==false}<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>h1</span><span class="token punctuation">></span></span>Oops there was an error.<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>h1</span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span><span class="token namespace">j:</span>if</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"></</span><span class="token namespace">j:</span>jelly</span><span class="token punctuation">></span></span></code></pre>
<!--EndFragment-->Redirect old CMS pages to your Service Portal2017-09-10T07:43:48Zhttps://jace.pro/post/2017-09-10-sp-redirect/Jace<!--StartFragment-->
<p>After your go live (congratulations) if you made the mistake I made and wanted to replace the namespace of your cms with your service portal you will have an issue where old links from past emails, bookmarks and 3rd party sources link to the cms pages.</p>
<p>When I sought out help for this after the fact the responses I got were not helpful.</p>
<p>Don't use the same name space</p>
<ul>
<li>Correct all links</li>
<li>Now that information might have been useful before the go live.</li>
</ul>
<p>What I did to correct what I could was the following;</p>
<ul>
<li>Correct links in outbound messages</li>
<li>Create a ui page for each page the cms had. E.g. <code>cmssearchpage.do</code></li>
</ul>
<p>This page you can toss a HTML redirect to the appropriate Service Portal page.</p>
<!--EndFragment-->
<pre class="language-xml"><code class="language-xml"><span class="token prolog"><?xml version="1.0" encoding="utf-8" ?></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">j:</span>jelly</span> <span class="token attr-name">trim</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>false<span class="token punctuation">"</span></span><br /> <span class="token attr-name"><span class="token namespace">xmlns:</span>j</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>jelly:core<span class="token punctuation">"</span></span><br /> <span class="token attr-name"><span class="token namespace">xmlns:</span>g</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>glide<span class="token punctuation">"</span></span><br /> <span class="token attr-name"><span class="token namespace">xmlns:</span>j2</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>null<span class="token punctuation">"</span></span><br /> <span class="token attr-name"><span class="token namespace">xmlns:</span>g2</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>null<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>script</span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"><br /> window<span class="token punctuation">.</span>location<span class="token punctuation">.</span>href <span class="token operator">=</span> <span class="token string">'/cms'</span><br /> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>script</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"></</span><span class="token namespace">j:</span>jelly</span><span class="token punctuation">></span></span></code></pre>
Show hints for choice lists2017-09-08T07:27:17Zhttps://jace.pro/post/2017-09-08-show-hints-for-choice-lists/Jace<!--StartFragment-->
<p>A stakeholder asked me to show hints in a more obvious way on a form. This was my suggestion. Using the hint field on the <code>sys_choice</code> table. Have a client script onChange check for the value, if one is set, clear the message for this field, and show the found message.</p>
<!--EndFragment-->
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">// script include global.choiceUtil</span><br /><span class="token comment">// client callable true</span><br /><span class="token keyword">var</span> choiceUtil <span class="token operator">=</span> Class<span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br />choiceUtil<span class="token punctuation">.</span>prototype <span class="token operator">=</span> Object<span class="token punctuation">.</span><span class="token function">extendsObject</span><span class="token punctuation">(</span>AbstractAjaxProcessor<span class="token punctuation">,</span> <span class="token punctuation">{</span><br /> <span class="token function-variable function">getHint</span><span class="token operator">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">try</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> returnObj <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> hint <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'sys_choice'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> hint<span class="token punctuation">.</span><span class="token function">addQuery</span><span class="token punctuation">(</span><span class="token string">'name'</span><span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">getParameter</span><span class="token punctuation">(</span><span class="token string">'sysparm_table'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> hint<span class="token punctuation">.</span><span class="token function">addQuery</span><span class="token punctuation">(</span><span class="token string">'element'</span><span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">getParameter</span><span class="token punctuation">(</span><span class="token string">'sysparm_field'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> hint<span class="token punctuation">.</span><span class="token function">addQuery</span><span class="token punctuation">(</span><span class="token string">'value'</span><span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">getParameter</span><span class="token punctuation">(</span><span class="token string">'sysparm_val'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> hint<span class="token punctuation">.</span><span class="token function">addQuery</span><span class="token punctuation">(</span><span class="token string">'inactive'</span><span class="token punctuation">,</span> <span class="token string">'false'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> hint<span class="token punctuation">.</span><span class="token function">query</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>hint<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> returnObj<span class="token punctuation">.</span>hint <span class="token operator">=</span> hint<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token string">'hint'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><br /> returnObj<span class="token punctuation">.</span>error <span class="token operator">=</span> <span class="token string">'no choice found for '</span><span class="token punctuation">;</span><br /> returnObj<span class="token punctuation">.</span>error <span class="token operator">+=</span> hint<span class="token punctuation">.</span><span class="token function">getEncodedQuery</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">return</span> <span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">stringify</span><span class="token punctuation">(</span>returnObj<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>error<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">return</span> <span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">stringify</span><span class="token punctuation">(</span>error<span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">,</span> <span class="token string">' '</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><span class="token punctuation">,</span><br /> <span class="token literal-property property">type</span><span class="token operator">:</span> <span class="token string">'choiceUtil'</span><br /><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<pre class="language-javascript"><code class="language-javascript"><span class="token keyword">function</span> <span class="token function">onChange</span><span class="token punctuation">(</span><span class="token parameter">control<span class="token punctuation">,</span> oldValue<span class="token punctuation">,</span> newValue<span class="token punctuation">,</span> isLoading<span class="token punctuation">,</span> isTemplate</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>isLoading <span class="token operator">||</span> newValue <span class="token operator">===</span> <span class="token string">''</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">return</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">var</span> field <span class="token operator">=</span> <span class="token string">'state'</span><span class="token punctuation">;</span><br /><br /> <span class="token keyword">var</span> ga <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideAjax</span><span class="token punctuation">(</span><span class="token string">'global.choiceUtil'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> ga<span class="token punctuation">.</span><span class="token function">addParam</span><span class="token punctuation">(</span><span class="token string">'sysparm_name'</span><span class="token punctuation">,</span> <span class="token string">'getHint'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> ga<span class="token punctuation">.</span><span class="token function">addParam</span><span class="token punctuation">(</span><span class="token string">'sysparm_table'</span><span class="token punctuation">,</span> g_form<span class="token punctuation">.</span><span class="token function">getTableName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> ga<span class="token punctuation">.</span><span class="token function">addParam</span><span class="token punctuation">(</span><span class="token string">'sysparm_field'</span><span class="token punctuation">,</span> field<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> ga<span class="token punctuation">.</span><span class="token function">addParam</span><span class="token punctuation">(</span><span class="token string">'sysparm_val'</span><span class="token punctuation">,</span> newValue<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> ga<span class="token punctuation">.</span><span class="token function">getXML</span><span class="token punctuation">(</span>HintParse<span class="token punctuation">)</span><span class="token punctuation">;</span><br /><br /> <span class="token keyword">function</span> <span class="token function">HintParse</span><span class="token punctuation">(</span><span class="token parameter">response</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> answer <span class="token operator">=</span> <span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">parse</span><span class="token punctuation">(</span>response<span class="token punctuation">.</span>responseXML<span class="token punctuation">.</span>documentElement<span class="token punctuation">.</span><span class="token function">getAttribute</span><span class="token punctuation">(</span><span class="token string">"answer"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> g_form<span class="token punctuation">.</span><span class="token function">hideFieldMsg</span><span class="token punctuation">(</span>field<span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>answer<span class="token punctuation">.</span>hint<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> g_form<span class="token punctuation">.</span><span class="token function">showFieldMsg</span><span class="token punctuation">(</span>field<span class="token punctuation">,</span> answer<span class="token punctuation">.</span>hint<span class="token punctuation">,</span> <span class="token string">'info'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span></code></pre>
<p>Here's the out of box hints.</p>
<p><img src="https://jace.pro/static/img/hint-oob.png" alt="" /></p>
<p>Here's the alternative.</p>
<p><img src="https://jace.pro/static/img/hint-as-message.png" alt="" /></p>
Syncing Comments on Requested Item and Catalog Task2017-09-06T07:22:59Zhttps://jace.pro/2017-09-06-syncing-comments/Jace<!--StartFragment-->
<p>To me, this is a terrible request to fulfill. The best way to handle this is to have fulfillers go to the requested item and communicate there. You may not have that option because of one reason or another.</p>
<p>Steps</p>
<ul>
<li>Comments are not on Catalog Task, so add that first.</li>
<li>Then Register an event called, <code>custom.catalog.ritm.commented</code></li>
<li>Copy your Request Item Commented Notification.</li>
<li>Change your notification to be triggered by event, <code>custom.catalog.ritm.commented</code> instead of by update or insert.</li>
<li>Change your notification so that the Who Will Receive is unset, and check the box, Event parm 1 contains recipient</li>
<li>Insert and stay on the notification for (<code>sc_req_item</code>)</li>
<li>Insert and stay on the notification for (<code>sc_task</code>)</li>
<li>Create the business rules below;</li>
</ul>
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">// Name: push comments to ritm</span><br /><span class="token comment">// Table: Catalog Task</span><br /><span class="token comment">// When: Before</span><br /><span class="token comment">// Insert: false</span><br /><span class="token comment">// Update:true</span><br /><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token function">executeRule</span><span class="token punctuation">(</span>current<span class="token punctuation">,</span> previous <span class="token comment">/*null when async*/</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">try</span><span class="token punctuation">{</span><br /> <span class="token keyword">var</span> item <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'sc_req_item'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span><span class="token punctuation">(</span>item<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>current<span class="token punctuation">.</span>request_item<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> item<span class="token punctuation">.</span>comments <span class="token operator">=</span> current<span class="token punctuation">.</span>comments<span class="token punctuation">;</span><br /> item<span class="token punctuation">.</span><span class="token function">setUseEngines</span><span class="token punctuation">(</span><span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token comment">// Tells the system not to run anything</span><br /> <span class="token comment">// with "engine" in the name from this list.</span><br /> <span class="token comment">// https://is.gd/gsNiQZ</span><br /> item<span class="token punctuation">.</span><span class="token function">update</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> email <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span><br /> email<span class="token punctuation">.</span>sys_id <span class="token operator">=</span> item<span class="token punctuation">.</span>u_requested_for<span class="token punctuation">.</span>sys_id<span class="token punctuation">;</span><br /> email<span class="token punctuation">.</span>name <span class="token operator">=</span> item<span class="token punctuation">.</span>u_requested_for<span class="token punctuation">.</span><span class="token function">getDisplayValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> gs<span class="token punctuation">.</span><span class="token function">eventQueue</span><span class="token punctuation">(</span><br /> <span class="token string">"custom.catalog.ritm.commented"</span><span class="token punctuation">,</span><br /> item<span class="token punctuation">,</span><br /> email<span class="token punctuation">.</span>sys_id<span class="token punctuation">,</span><br /> email<span class="token punctuation">.</span>name<br /> <span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>error<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> log <span class="token operator">=</span> <span class="token string">'Push comments to ritm'</span><span class="token punctuation">;</span><br /> gs<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'Error: '</span> <span class="token operator">+</span> error<span class="token punctuation">,</span> log<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">(</span>current<span class="token punctuation">,</span> previous<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">// Name: push comments to tasks</span><br /><span class="token comment">// Table: Request Item</span><br /><span class="token comment">// When: Before</span><br /><span class="token comment">// Insert: false</span><br /><span class="token comment">// Update:true</span><br /><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token function">executeRule</span><span class="token punctuation">(</span>current<span class="token punctuation">,</span> previous <span class="token comment">/*null when async*/</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">try</span><span class="token punctuation">{</span><br /> <span class="token keyword">var</span> sc_task <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'sc_task'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> sc_task<span class="token punctuation">.</span><span class="token function">addQuery</span><span class="token punctuation">(</span><span class="token string">'request_item'</span><span class="token punctuation">,</span> current<span class="token punctuation">.</span>sys_id<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> sc_task<span class="token punctuation">.</span><span class="token function">addQuery</span><span class="token punctuation">(</span><span class="token string">'active'</span><span class="token punctuation">,</span><span class="token string">'true'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> sc_task<span class="token punctuation">.</span><span class="token function">query</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">while</span><span class="token punctuation">(</span>sc_task<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br /> sc_task<span class="token punctuation">.</span>comments <span class="token operator">=</span> current<span class="token punctuation">.</span>comments<span class="token punctuation">;</span><br /> sc_task<span class="token punctuation">.</span><span class="token function">setUseEngines</span><span class="token punctuation">(</span><span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token comment">// Tells the system not to run anything</span><br /> <span class="token comment">// with "engine" in the name from this list.</span><br /> <span class="token comment">// https://is.gd/gsNiQZ</span><br /> sc_task<span class="token punctuation">.</span><span class="token function">update</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> email <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span><span class="token punctuation">(</span>sc_task<span class="token punctuation">.</span>assigned_to<span class="token punctuation">)</span><span class="token punctuation">{</span><br /> email<span class="token punctuation">.</span>sys_id <span class="token operator">=</span> sc_task<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token string">'assigned_to'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> email<span class="token punctuation">.</span>name <span class="token operator">=</span> sc_task<span class="token punctuation">.</span>assigned_to<span class="token punctuation">.</span><span class="token function">getDisplayValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><br /> email<span class="token punctuation">.</span>sys_id <span class="token operator">=</span> sc_task<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token string">'assignment_group'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> email<span class="token punctuation">.</span>name <span class="token operator">=</span> sc_task<span class="token punctuation">.</span>assignment_group<span class="token punctuation">.</span><span class="token function">getDisplayValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> gs<span class="token punctuation">.</span><span class="token function">eventQueue</span><span class="token punctuation">(</span><br /> <span class="token string">"custom.catalog.ritm.commented"</span><span class="token punctuation">,</span><br /> sc_task<span class="token punctuation">,</span><br /> email<span class="token punctuation">.</span>sys_id<span class="token punctuation">,</span><br /> email<span class="token punctuation">.</span>nam<br /> <span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>error<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> log <span class="token operator">=</span> <span class="token string">'Push comments to tasks'</span><span class="token punctuation">;</span><br /> gs<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'Error: '</span> <span class="token operator">+</span> error<span class="token punctuation">,</span> log<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">(</span>current<span class="token punctuation">,</span> previous<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<!--EndFragment-->Integration Considerations2017-09-06T07:17:30Zhttps://jace.pro/post/2017-09-06-integrations/Jace<!--StartFragment-->
<p>I'm recalling this from memory and this is old and could be updated for Scripted Rest APIs and such, but I want to get this out here.</p>
<p><a href="https://workflow.jace.pro/?flow=can-sn-integrate#"><img src="https://github.com/jacebenson/jace.pro/raw/master/src/post/2017-09-06-integrations/Capture.png" alt="Flow Decisions" /></a></p>
<p>That is verbose but all you need to know is what your doing, and what is preferred like so;</p>
<p><a href="https://github.com/jacebenson/jace.pro/blob/master/src/post/2017-09-06-integrations/Capture2.png"><img src="https://github.com/jacebenson/jace.pro/raw/master/src/post/2017-09-06-integrations/Capture2.png" alt="Flow Decisions" /></a></p>
<p>Generally if you are doing a "one time" import, generally almost always easiest to do a file import. Sometimes, a database connection is better, it's the same work. You'll set up a import table, and a transform map.</p>
<p>If you are setting up a recurring import like from the stock market or some weather source the following questions have to be asked;</p>
<h2><a href="https://github.com/jacebenson/jace.pro/blob/master/src/post/2017-09-06-integrations/index.md#what-triggers-this-data-coming-into-servicenow"></a>What triggers this data coming into ServiceNow</h2>
<ul>
<li>If what triggers this data is an interval, then make a scheduled job/workflow that runs on that interval.</li>
<li>If what triggers this data is an action, like a major change is created, then it's a matter of running the code triggered from that update. I'd do this by registering an event, and then in the business rule, triggering said event. Then create a script action to actually make the web service call (via a script include). This might seem like a lot of extra steps, but by abstracting this, it's much easier to test.</li>
<li>If the trigger is a task getting closed in certain state, you can try to disable rules to allow you make these changes, or you can trigger the event.</li>
</ul>
<h2>What data comes into ServiceNow, a full pull or what's requested</h2>
<ul>
<li>If the data that comes into ServiceNow is an individual record, it probably makes the most sense to do a outbound web service call like a REST or SOAP Call, that response you get back will have to be parsed and then dealt with. I'd recommend dealing with it on a transform table because then you can deal with the data and massage it like any other imported data.</li>
<li>If the data that comes into ServiceNow is a full set of the data, it probably doesn't make sense to do it over a web service, as those are generally paginated and that can be a pain to deal with, ideally, you would have read access to their database, and you can pull it in.</li>
<li>If not, the next best thing would be if they can prepare a single file for you to parse that you can read hosted some place. If that's not possible, I'd then look into the possibility of them pushing the data to you.</li>
</ul>
<!--EndFragment-->Legacy Workflow considerations2017-08-15T07:09:28Zhttps://jace.pro/post/2017-08-15-workflow/Jace<!--StartFragment-->
<p>These should be considered when using a workflow.</p>
<ul>
<li><a href="https://github.com/jacebenson/jace.pro/blob/master/src/post/2017-08-15-workflow/index.md#patterns">Patterns</a></li>
<li><a href="https://github.com/jacebenson/jace.pro/blob/master/src/post/2017-08-15-workflow/index.md#activities">Activities</a></li>
<li><a href="https://github.com/jacebenson/jace.pro/blob/master/src/post/2017-08-15-workflow/index.md#script">Script</a></li>
</ul>
<h1><a href="https://github.com/jacebenson/jace.pro/blob/master/src/post/2017-08-15-workflow/index.md#patterns"></a>Patterns</h1>
<ol>
<li>Always, always add a timer after the Begin activity.</li>
<li>Avoid Switches because they don't update when their conditioned field changes.</li>
<li>Avoid Email Activities, instead, opt for Event activities.</li>
</ol>
<p>Here I have a diagram showing a timer added after the Begin activity. This timer returns makes the event queue process the work instead of the user's session. This is great for user experience. But, it makes your workflow dependent on the events queue. If that goes down, this is the least of your worries.</p>
<p><a href="https://github.com/jacebenson/jace.pro/blob/master/src/post/2017-08-15-workflow/workflow-1.png"><img src="https://github.com/jacebenson/jace.pro/raw/master/src/post/2017-08-15-workflow/workflow-1.png" alt="" /></a></p>
<p>Next, I have a Diagram showing the Switch, if some changed the variable/field values of "Standard" to "Mechanical" the workflow activity won't know to use the new value until you check it out, then recreate the switch, and check it back in. Because of this, I use If activities. This will result in more activities but, because the If activities are scripted, they won't break when you change the variable. If activities used to allow you to create any number of "result" boxes below, one of them being an "else" but now If's are either yes or no for results. Below is an example Switch Workflow and it in the If pattern.</p>
<p><a href="https://github.com/jacebenson/jace.pro/blob/master/src/post/2017-08-15-workflow/workflow-2.png"><img src="https://github.com/jacebenson/jace.pro/raw/master/src/post/2017-08-15-workflow/workflow-2.png" alt="" /></a></p>
<p><a href="https://github.com/jacebenson/jace.pro/blob/master/src/post/2017-08-15-workflow/workflow-3.png"><img src="https://github.com/jacebenson/jace.pro/raw/master/src/post/2017-08-15-workflow/workflow-3.png" alt="" /></a></p>
<p>Because you should avoid checking out workflows, always use events in workflows if you need a workflow to generate a notification. Some extra steps are needed to do this but it's well worth it because now you can use the notification records how they are for the rest of the system, you can generate the notification without the workflow by running the following in a business rule or any server-side script;</p>
<p><code>gs.eventQueue('custom.notification', current, 'parm1', 'parm2');</code></p>
<p>Now if you were using variables and are not sure how to pass more than two parameters, don't fear. Make your first parm a <code>JSON.stringify</code> object. Sure you'll need to <code>JSON.parse</code> the object in the notification, but now you can pass everything in a way not dependent on the workflow.</p>
<!--EndFragment-->Automagically Link records from journaled fields.2017-08-07T06:57:51Zhttps://jace.pro/post/2017-08-07-automagically-link/Jace<p><strong>This is old and I wouldn't recommend anymore. I'm keeping this up because I want to find it later. - Jace May 21, 2022</strong></p>
<p>Here I'll write the logic out some and note the issues identified so far.</p>
<p>The way this works is if a <code>sys_journal_field</code> record is created or updated, then verify the field is a journal type. Then pass the value of the notes to <code>paddAndRefLinks</code> function. This will iterate over most the sys_number records to find possible records, do a get against possible record and if found rewrite the entry either a link.</p>
<p>The places I've seen this not work well.</p>
<ol>
<li>Virtual task boards don't handle [code] tags well if the second tag is cut off from the display.</li>
<li>If you insert knowledge into comments it prepends and appends the [code] tags. I don't account for this in the script</li>
</ol>
<p>Below is the script.</p>
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">/* Business Rule: Automagically Link*/</span><br /><span class="token comment">/* Table: sys_journal_field*/</span><br /><span class="token comment">/* When: After*/</span><br /><span class="token comment">/* Order: 100*/</span><br /><span class="token comment">/* Insert: true*/</span><br /><span class="token comment">/* Update:true*/</span><br /><span class="token comment">/* jslint sloppy: true, vars: true*/</span><br /><span class="token comment">/* global GlideRecord, current, paddAndLinkRefs*/</span><br /><span class="token keyword">function</span> <span class="token function">onAfter</span><span class="token punctuation">(</span><span class="token parameter">current<span class="token punctuation">,</span> previous</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token comment">//This function will be automatically called when this rule</span><br /> <span class="token comment">// is processed.</span><br /> <span class="token comment">//if dict.type is journal... rewrite teh notes</span><br /> <span class="token keyword">var</span> dict <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'sys_dictionary'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> dictQuery <span class="token operator">=</span> <span class="token string">'internal_type=journal'</span><span class="token punctuation">;</span><br /> dictQuery <span class="token operator">+=</span> <span class="token string">'^ORinternal_type=journal_input'</span><span class="token punctuation">;</span><br /> dictQuery <span class="token operator">+=</span> <span class="token string">'^name='</span> <span class="token operator">+</span> current<span class="token punctuation">.</span>name<span class="token punctuation">;</span><br /> dictQuery <span class="token operator">+=</span> <span class="token string">'^element='</span> <span class="token operator">+</span> current<span class="token punctuation">.</span>element<span class="token punctuation">;</span><br /> dict<span class="token punctuation">.</span><span class="token function">addEncodedQuery</span><span class="token punctuation">(</span>dictQuery<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> dict<span class="token punctuation">.</span><span class="token function">query</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">while</span> <span class="token punctuation">(</span>dict<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> newValue <span class="token operator">=</span> <span class="token function">paddAndLinkRefs</span><span class="token punctuation">(</span>current<span class="token punctuation">.</span>value<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> current<span class="token punctuation">.</span>value <span class="token operator">=</span> newValue<span class="token punctuation">;</span> <span class="token comment">//update audit record</span><br /> current<span class="token punctuation">.</span><span class="token function">setWorkflow</span><span class="token punctuation">(</span><span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> current<span class="token punctuation">.</span><span class="token function">autoSysFields</span><span class="token punctuation">(</span><span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> current<span class="token punctuation">.</span><span class="token function">update</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> audit <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'sys_audit'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> auditQuery <span class="token operator">=</span> <span class="token string">'documentkey='</span> <span class="token operator">+</span> current<span class="token punctuation">.</span>element_id<span class="token punctuation">;</span><br /> auditQuery <span class="token operator">+=</span> <span class="token string">'^fieldname='</span> <span class="token operator">+</span> current<span class="token punctuation">.</span>element<span class="token punctuation">;</span><br /> auditQuery <span class="token operator">+=</span> <span class="token string">'^ORDERBYDESCrecord_checkpoint'</span><span class="token punctuation">;</span><br /> audit<span class="token punctuation">.</span><span class="token function">addEncodedQuery</span><span class="token punctuation">(</span>auditQuery<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> audit<span class="token punctuation">.</span><span class="token function">query</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>audit<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> audit<span class="token punctuation">.</span>newvalue <span class="token operator">=</span> newValue<span class="token punctuation">;</span><br /> audit<span class="token punctuation">.</span><span class="token function">setWorkflow</span><span class="token punctuation">(</span><span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> audit<span class="token punctuation">.</span><span class="token function">autoSysFields</span><span class="token punctuation">(</span><span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> audit<span class="token punctuation">.</span><span class="token function">update</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span><br /><br /><span class="token keyword">function</span> <span class="token function">paddAndLinkRefs</span><span class="token punctuation">(</span><span class="token parameter">text</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token comment">//below finds http links</span><br /> <span class="token keyword">var</span> httpregex <span class="token operator">=</span> <span class="token operator">/</span><span class="token punctuation">(</span>https<span class="token operator">?</span><span class="token operator">:</span><span class="token operator">/</span><span class="token regex"><span class="token regex-delimiter">/</span><span class="token regex-source language-regex">[^s]+)</span><span class="token regex-delimiter">/</span><span class="token regex-flags">gi</span></span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> httpsubst <span class="token operator">=</span> <span class="token string">'[code]'</span><span class="token punctuation">;</span><br /> httpsubst <span class="token operator">+=</span> <span class="token string">'<a href="$1" target="_blank" rel="noopener">'</span><span class="token punctuation">;</span><br /> httpsubst <span class="token operator">+=</span> <span class="token string">'$1</a>[/code]'</span><span class="token punctuation">;</span><br /> <span class="token comment">// The substituted value will be contained in the result </span><br /> <span class="token comment">// variable</span><br /> text <span class="token operator">=</span> text<span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span>httpregex<span class="token punctuation">,</span> httpsubst<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token comment">//above finds http links</span><br /> <span class="token comment">//below finds links to records based on numbers</span><br /> <span class="token keyword">var</span> num <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span><span class="token string">'sys_number'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> numQuery <span class="token operator">=</span> <span class="token string">'category!=sc_ic_task_defn_staging'</span><span class="token punctuation">;</span><br /> numQuery <span class="token operator">+=</span> <span class="token string">'^category!=task'</span><span class="token punctuation">;</span><br /> numQuery <span class="token operator">+=</span> <span class="token string">'^category!=ts_index_name'</span><span class="token punctuation">;</span><br /> num<span class="token punctuation">.</span><span class="token function">addEncodedQuery</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> num<span class="token punctuation">.</span><span class="token function">query</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> tables <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span><br /> <span class="token keyword">while</span> <span class="token punctuation">(</span>num<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> tables<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token punctuation">{</span><br /> <span class="token string-property property">'name'</span><span class="token operator">:</span> num<span class="token punctuation">.</span>category<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span><br /> <span class="token string-property property">'prefix'</span><span class="token operator">:</span> num<span class="token punctuation">.</span>prefix<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span><br /> <span class="token string-property property">'digits'</span><span class="token operator">:</span> num<span class="token punctuation">.</span>maximum_digits<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><br /> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">var</span> x <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> x <span class="token operator"><</span> tables<span class="token punctuation">.</span>length<span class="token punctuation">;</span> x <span class="token operator">=</span> x <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> table <span class="token operator">=</span> tables<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">.</span>name<span class="token punctuation">;</span><br /> <span class="token keyword">var</span> prefix <span class="token operator">=</span> tables<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">.</span>prefix<span class="token punctuation">;</span><br /> <span class="token keyword">var</span> digits <span class="token operator">=</span> <span class="token function">parseInt</span><span class="token punctuation">(</span>tables<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">.</span>digits<span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> re <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">RegExp</span><span class="token punctuation">(</span><span class="token string">"(\s|^)("</span> <span class="token operator">+</span> prefix <span class="token operator">+</span> <span class="token string">")(\d+)"</span><span class="token punctuation">,</span> <span class="token string">"gi"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><br /> text <span class="token operator">=</span> text<span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span>re<span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">m</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">var</span> result <span class="token operator">=</span> <span class="token string">""</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> copy <span class="token operator">=</span> m<span class="token punctuation">.</span><span class="token function">toUpperCase</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> number <span class="token operator">=</span> copy<span class="token punctuation">.</span><span class="token function">split</span><span class="token punctuation">(</span>prefix<span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span><br /> <span class="token keyword">var</span> space <span class="token operator">=</span> copy<span class="token punctuation">.</span><span class="token function">split</span><span class="token punctuation">(</span>prefix<span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">;</span><br /> <span class="token keyword">while</span> <span class="token punctuation">(</span>number<span class="token punctuation">.</span>length <span class="token operator"><</span> digits<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> number <span class="token operator">=</span> <span class="token string">"0"</span> <span class="token operator">+</span> number<span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">var</span> recordnumber <span class="token operator">=</span> prefix <span class="token operator">+</span> number<span class="token punctuation">;</span><br /> <span class="token keyword">var</span> test <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GlideRecord</span><span class="token punctuation">(</span>table<span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token comment">//number field by default to 'number'</span><br /> <span class="token keyword">var</span> numberField <span class="token operator">=</span> <span class="token string">'number'</span><span class="token punctuation">;</span> <br /> <span class="token comment">//test if 'u_number' is valid</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>test<span class="token punctuation">.</span><span class="token function">isValidField</span><span class="token punctuation">(</span><span class="token string">'u_number'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <br /> numberField <span class="token operator">=</span> <span class="token string">'u_number'</span><span class="token punctuation">;</span> <span class="token comment">//if so, use it</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>test<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>numberField<span class="token punctuation">,</span> recordnumber<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> result <span class="token operator">+=</span> space<span class="token punctuation">;</span><br /> result <span class="token operator">+=</span> <span class="token string">"[code]"</span><span class="token punctuation">;</span><br /> result <span class="token operator">+=</span> <span class="token string">'<a style="'</span><span class="token punctuation">;</span><br /> result <span class="token operator">+=</span> <span class="token string">'text-decoration: underline; '</span><span class="token punctuation">;</span><br /> result <span class="token operator">+=</span> <span class="token string">'color: #0000ff;" '</span><span class="token punctuation">;</span><br /> result <span class="token operator">+=</span> <span class="token string">'href="'</span> <span class="token operator">+</span> table <span class="token operator">+</span> <span class="token string">'.do?sysparm_query='</span><span class="token punctuation">;</span><br /> result <span class="token operator">+=</span> numberField <span class="token operator">+</span> <span class="token string">'='</span> <span class="token operator">+</span> recordnumber<span class="token punctuation">;</span><br /> result <span class="token operator">+=</span> <span class="token string">'" target="_blank" rel="noopener" '</span><span class="token punctuation">;</span><br /> result <span class="token operator">+=</span> <span class="token string">'data-mce-href="'</span><span class="token punctuation">;</span><br /> result <span class="token operator">+=</span> table <span class="token operator">+</span> <span class="token string">'.do?'</span><span class="token punctuation">;</span><br /> result <span class="token operator">+=</span> <span class="token string">'sysparm_query='</span> <span class="token operator">+</span> numberField <span class="token operator">+</span> <span class="token string">'='</span><span class="token punctuation">;</span><br /> result <span class="token operator">+=</span> recordnumber <span class="token operator">+</span> <span class="token string">'" data-mce-style="'</span><span class="token punctuation">;</span><br /> result <span class="token operator">+=</span> <span class="token string">'text-decoration: underline; '</span><span class="token punctuation">;</span><br /> result <span class="token operator">+=</span> <span class="token string">'color: #0000ff;">"'</span><span class="token punctuation">;</span><br /> result <span class="token operator">+=</span> recordnumber <span class="token operator">+</span> <span class="token string">"</a>[/code]"</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><br /> result <span class="token operator">=</span> m<span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">return</span> result<span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token punctuation">}</span><br /> <span class="token keyword">return</span> text<span class="token punctuation">;</span><br /><span class="token punctuation">}</span></code></pre>
5 rules for emails2016-03-24T06:50:03Zhttps://jace.pro/post/2016-03-24-5-rules-for-emails/Jace Benson<h2>Do not use the ServiceNow provided email address</h2>
<ul>
<li><a href="https://docs.servicenow.com/csh?version=latest&topicname=c_AlternateEmailConfigurations">Always set up your own mailbox</a></li>
<li>Once someone knows about the email address, they never, ever, forget it, at least now you can get rid of it or change it accordingly.</li>
<li>Changing the "From" on notifications is not possible without setting this up.</li>
<li>This puts all the content submitted on your own servers where you can control it. Otherwise they are all on ServiceNow's servers where you don't have the same control.</li>
</ul>
<h2><a href="https://github.com/jacebenson/jace.pro/blob/master/src/post/2016-03-24-5-rules-for-emails/index.md#events-or-workflow-activities-always-events-and-heres-a-list-of-reasons-why"></a>Events or Workflow Activities? Always Events and here's a list of reasons why</h2>
<ol>
<li>Ability to trigger the notification from any server side script.</li>
<li>Faster prototyping of the notification. Why? Because you can trigger the notification on <code>sysevent</code>.</li>
<li>Events can also trigger Script Actions which allow you to run server scripts.</li>
<li>Workflow notifications are limited compared to notification events.</li>
<li>Workflow notifications need you to checkout the workflow to update the notification.</li>
</ol>
<h2>Send email that require action</h2>
<ul>
<li>
<p>Ideally, emails require action and can be handled from the email. If they cannot, consider summarizing that information for a email sent on a recurring frequency.</p>
<ul>
<li>
<p>Examples of actionable subjects with commentary</p>
</li>
<li>
<p>RITM1234 Laptop Approval for Bart Simpson</p>
<ul>
<li>Can be handled on your phone, searchable by record number, who and what is clear.</li>
</ul>
</li>
<li>
<p>Reminder to Please take this survey related to Request INC1370</p>
<ul>
<li>Should be as concise as possible, so I'd start at "Take this ..." or "Survey for INC1370"</li>
</ul>
</li>
<li>
<p>ServiceNow Customer Satisfaction Survey for INT3389</p>
<ul>
<li>From HI as of August 2017</li>
</ul>
</li>
</ul>
</li>
<li>
<p>Informing users is sometimes useful, but may also be unnecessary.</p>
<ul>
<li>Examples of informational subjects with commentary</li>
<li>INC1370 Opened on your behalf</li>
<li>INC1370 Resolved</li>
<li>TASK1234 Provision User Access Assigned to you (cannot be handled on your phone, so essentially, you're informing someone they have work.)</li>
<li>TASK1235 Revoke Location Access Assign to your group (cannot be handled on your phone, so essentially, you're informing someone they have work.)</li>
</ul>
</li>
<li>
<p>One way to sending more useful content less often is to send out a summary notification daily or weekly. Don't send a summary if there is nothing to tell them about.</p>
<ul>
<li>ServiceNow Weekly Summary for 2017-09-08</li>
<li>ServiceNow Daily Summary for 2017-09-04</li>
</ul>
</li>
</ul>
<h2><a href="https://github.com/jacebenson/jace.pro/blob/master/src/post/2016-03-24-5-rules-for-emails/index.md#allow-users-to-unsubscribe-to-actionable-or-informational-emails-or-not"></a>Allow users to unsubscribe to actionable, or informational emails or not</h2>
<blockquote>
<p>Actively discourage the use of Inbound Email as a mechanism for ticket creation. It should be used when the sending party is a robot. Over time, the conditions desired by your stakeholders, and the propensity for user input error will make inbound email a horrific mess. Its also like Pandora's Box. Once you tell users they can email into ServiceNow, they'll never stop. I force stakeholders to sign off to knowing about a 30% failure rate if they want inbound email processing. -- <a href="https://community.servicenow.com/message/990963#991021">Robert Fedoruk</a></p>
</blockquote>
<h2><a href="https://github.com/jacebenson/jace.pro/blob/master/src/post/2016-03-24-5-rules-for-emails/index.md#memorize-this-diagram"></a>Memorize this diagram</h2>
<p><img src="https://jace.pro/static/img/2016-servicenow-email-diagram.png" alt="A diagram showing the logic of when an incoming email is processed in ServiceNow" title="ServiceNow Email Processing Diagram" /></p>