In the 5e OGL by Roll20 character sheet, there is the option to flip a spell from SPELLCARD to ATTACK. When you flip it to ATTACK, it automatically creates an appropriate attack on the "CORE" tab of the character sheet. When you attempt do the same type of switch via the API to the underlying attribute, it creates a blank entry in the Attack & Spellcasting section. Here is a short script that recreates the problem: on('chat:message', function(msg) { if (msg.type === 'api' && msg.content.search(/^!test\b/) !== -1) { let character = createObj("character", {name: "Test Spell Import"}); let charid = character.id; let level = "2" let uuid = generateRowID(); setAttribute(charid, "repeating_spell-" + level + "_" + uuid + "_spellname", "Acid Arrow"); setAttribute(charid, "repeating_spell-" + level + "_" + uuid + "_spellschool", "evocation"); setAttribute(charid, "repeating_spell-" + level + "_" + uuid + "_spellcastingtime", "1 Action"); setAttribute(charid, "repeating_spell-" + level + "_" + uuid + "_spellrange", "90 feet"); setAttribute(charid, "repeating_spell-" + level + "_" + uuid + "_spellname", "Acid Arrow"); setAttribute(charid, "repeating_spell-" + level + "_" + uuid + "_spellcomp_v", "{{v=1}}"); setAttribute(charid, "repeating_spell-" + level + "_" + uuid + "_spellcomp_s", "{{s=1}}"); setAttribute(charid, "repeating_spell-" + level + "_" + uuid + "_spellcomp_m", "{{m=1}}"); setAttribute(charid, "repeating_spell-" + level + "_" + uuid + "_spellcomp_materials", "Powdered rhubarb leaf and an adder's stomach"); setAttribute(charid, "repeating_spell-" + level + "_" + uuid + "_spellduration", "Instantaneous"); setAttribute(charid, "repeating_spell-" + level + "_" + uuid + "_spelldescription", "A shimmering green arrow streaks toward a target within range and bursts in a spray of acid. Make a ranged spell attack against the target. On a hit, the target takes 4d4 acid damage immediately and 2d4 acid damage at the end of its next turn. On a miss, the arrow splashes the target with acid for half as much of the initial damage and no damage at the end of its next turn."); setAttribute(charid, "repeating_spell-" + level + "_" + uuid + "_spellathigherlevels", "When you cast this spell using a spell slot of 3rd level or higher, the damage (both initial and later) increases by 1d4 for each slot level above 2nd."); setAttribute(charid, "repeating_spell-" + level + "_" + uuid + "_spellattack", "Ranged"); setAttribute(charid, "repeating_spell-" + level + "_" + uuid + "_spelldamage", "4d4"); setAttribute(charid, "repeating_spell-" + level + "_" + uuid + "_spelldamagetype", "Acid"); setAttribute(charid, "repeating_spell-" + level + "_" + uuid + "_spelldamage2", "2d4"); setAttribute(charid, "repeating_spell-" + level + "_" + uuid + "_spelldamagetype2", "Acid"); setAttribute(charid, "repeating_spell-" + level + "_" + uuid + "_spellhldie", "1"); setAttribute(charid, "repeating_spell-" + level + "_" + uuid + "_spellhldietype","d4"); //// Problem seems to be with the following call triggering the attack creation //// setAttribute(charid, "repeating_spell-" + level + "_" + uuid + "_spelloutput", "ATTACK"); } }), setAttribute = function(charid, attr, val) { let attribute = createObj("attribute", {name: attr, characterid: charid}); attribute.setWithWorker("current", val); }, generateUUID = (function() { "use strict"; var a = 0, b = []; return function() { var c = (new Date()).getTime() + 0, d = c === a; a = c; for (var e = new Array(8), f = 7; 0 <= f; f--) { e[f] = "-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz".charAt(c % 64); c = Math.floor(c / 64); } c = e.join(""); if (d) { for (f = 11; 0 <= f && 63 === b[f]; f--) { b[f] = 0; } b[f]++; } else { for (f = 0; 12 > f; f++) { b[f] = Math.floor(64 * Math.random()); } } for (f = 0; 12 > f; f++){ c += "-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz".charAt(b[f]); } return c; }; }()), generateRowID = function () { "use strict"; return generateUUID().replace(/_/g, "Z"); }; NOTE: I did try to update all of the spells and later flip the "repeating_spell-" + level + "_" + uuid + "_spelloutput" to ATTACK, but it makes no difference in the result. It seems that anytime you flip this via the API, a blank Attack entry is created under Attacks & Spellcasting: The browsers console log doesn't suggest that there are any errors... really not sure what to do to troubleshoot this. Any advice?