@GiGs... I gave the return this way o nly because I wanted to give maximum flexibility to the output... For most scripts you could imagine a single action/data point attached to each argument name even if the name were supplied a number of times. For something like that, what you suggest would be better. However, other scripts might chain outcomes one after the other. For instance, when I initially wrote this, it was for the "replace" function of Plugger. In that one, you might have operations where you need them to happen one after another (like a cyclic permutation where you displace all A to C before B becomes A, then C becomes A). For that one, *all* of the find/replace arguments are called "--find," and the parts of them say what should be searched for, and what should be used to replace. It would be easy enough to throw a reduce() at the array that tickSplit returns in order to convert it to an object with unique properties... or to map the objects in the tickSplit return to be their "type" property and turn that into a Set (to get unique entries for each), then use another map operation to get the correct values out of the original array (maybe the last entry for that type, or maybe the aggregate of all, etc.). Lots of options if tickSplit is agnostic to what the data means -- just leave it all in there -- and leave it to you to massage it further. @Kenneth R.... There are a couple of options for getting the roll data into your command line. The simplest is to use a function like this: const processInlineRolls = (msg) => { if(msg.hasOwnProperty('inlinerolls')){ return msg.inlinerolls .reduce((m,v,k) => { let ti=v.results.rolls.reduce((m2,v2) => { if(v2.hasOwnProperty('table')){ m2.push(v2.results.reduce((m3,v3) => [...m3,(v3.tableItem||{}).name],[]).join(", ")); } return m2; },[]).join(', '); return [...m,{k:`$[[${k}]]`, v:(ti.length && ti) || v.results.total || 0}]; },[]) .reduce((m,o) => m.replaceAll(o.k,o.v), msg.content); } else { return msg.content; } }; (this is taken from The Aaron's TokenMod script, with one change for formatting, and one change from a conversation he and I had, but which he hasn't gotten around to updating/implementing -- long story) The above function is basically looking at the message's inlinerolls property and extracting the correct value for the roll (either the total or the table item if we're reading from a table). Since the index of the roll in the array in the inlinerolls property is the same as the roll marker (ie, the 0th roll in the array referenced by the $[[0]] roll marker, the index 1 roll by the $[[1]] roll marker, etc.), we can get the correct value for the correct roll, then perform a replaceAll() on the command line. To use the above function, you'd want to do something like: let newContent = processInlineRolls(msg); Pretty straightforward. If you can't figure out what the processInlineRolls function is doing, post back and I can break it down. Another Option: libInline libInline is a helper/library script I wrote with The Aaron that can simplify the work of getting other information from an inline roll. The upside is that all of the code for working with the rolls is off-loaded from your script; the downside (and it's not that big of a downside) is that you have to make sure libInline is installed in your game (or create a dependency if you are going to release your script to the one-click repository). There are a number of examples in that linked thread, so if you want to go this route, give them a try and let us know if you have any issue. Want to See What an Inline Roll Looks Like? If you want to see what an inline roll looks like (other than the examples available in that linked thread or in the wiki, you can use the Inspector script. With Inspector installed, run the command line: !inspect --inline [[2d20]] And replace the roll with whatever equation you want to use. You'll get an output of what the inlinerolls property looks like.