It would help to see the sheet worker you have, and the html for the section above, or at least the actual attribute names. I cant see where you're going wrong without those. But sheet workers are fine with either letters or numbers. One thing I'm noticing is that disabled agility text box isnt big enough to hold all the text you want to put in it. Secondly, sheet workers cant change disabled inputs so you absolutely must change that from a disabled input to a readonly input. So for the sake of this example, lets assume those attributes are called agility_base , agility_extra , and agility_modifier . lets also assume the disabled input you change to a readonly is called agility_text . Here's a sheet worker that should do the trick: on('change:agility_base change:agility_extra change:agility_modifier', function(){ getAttrs(['agility_base', 'agility_extra', 'agility_modifier'], function(v){ const base = v.agility_base; const extra = parseInt(v.agility_extra) || 0; const mod = parseInt(v.agility_modifier) || 0; const final = 'd' + base + (extra ? '+d' + extra: '') + (mod ? (mod >= 0 ? '+' : '') + mod : '' ); setAttrs({ agility_text: final }); }); }); How it works: if you're not familiar with const, it's just like var, but only for variables you cannot change once it is declared. Since none of the variables here get changed after they are created, it's efficient to use it. I've assumed both dice are just showing numbers, so d8 will return 8 . That means we have to add the d to the string ourselves. So, lets look at the complicated section, starting const final . In javascript, you can use + to join strings together. so for example, const final = 'd' + '8' would give a result of d8 . Thats what the first line does. The second line is my favourite javascript operator, the ternary operate. This is a compact if statement, which works like this: var something = (if statement) ? (value if true) : (value if false) in this case we have (extra ? '+d' + extra: '') The bit before the question mark is an if statement - it is basically if (extra) . In javascript, values of '' or 0 , for example, are falsy values. That means when you do an if statement on them, they return false. Most other values are truthy , which means they return true. In this example, I'm assuming the extra die can have a value of either '' or 0 . In that case the "value if false" section is used, after the colon: that is ''. Otherwise, it adds the die value to the string. The last line is very similar: (mod ? (mod >= 0 ? '+' : '') + mod : '' ); It's a ternary operator with another ternary operator inside it. So it first checks if mod have a truthy value, and if so, adds it to the die string. But there's a complication here: if the modifier is negative, it works fine. If its positive, like 2 , you need to add a + before it. Thats what the middle ternary operator does. So, this should give you a text string like d10 , or d10+d6 , or d10+3 , or d10+d8-2 , whichever is appropriate.