You can try this mod script if you like, to see if it fixes the issue. It doesn't run passively so you'll need to run it on a test game which already has character sheets in it containing entries in the rangedweapons section. If it fixes the issue, it's at least a workaround until the sheet can be updated. Paste the below in to a new API/Mod script, and type !ammofix into chat when the sandbox restarts. /* globals on, sendChat, getObj, findObjs, createObj */ (() => { const repeatingSectionName = `Rangedweapons`, repeatingAttributeName = `my_hidden_row_id`, scriptName = 'heresyAmmoFix'; const rx = { rowId: /_(-[0-z-]{19})_/, targetSection: new RegExp(`^repeating_${repeatingSectionName}_`, 'i'), } on('ready', () => { watchRepeatingAttributes(); on('chat:message', (message) => { if (/^!ammofix/i.test(message.content)) { indexHeresyRepeatingRows(); } }); }); const watchRepeatingAttributes = () => { on('add:attribute', (newAttribute) => { if (rx.targetSection.test(newAttribute.get('name'))) { const rowId = (newAttribute.get('name').match(rx.rowId)||[])[1]; const targetAttribute = rowId ? `repeating_${repeatingSectionName}_${rowId}_${repeatingAttributeName}` : null; const character = targetAttribute ? getObj('character', newAttribute.get('characterid')) : null; if (character) { setOrCreateAttribute(character, targetAttribute, rowId); } } }); } const getRepeatingRowIds = (character) => { const allAttributes = findObjs({ type: 'attribute', characterid: character.id }); return allAttributes.reduce((output, attribute) => { if (rx.targetSection.test(attribute.get('name'))) { const rowId = (attribute.get('name').match(rx.rowId)||[])[1]; if (rowId && !(output.includes(rowId))) { return [ ...output, rowId ]; } } return output; }, []); } const setOrCreateAttribute = (character, attributeName, newValue, newMaxValue) => { if (newValue == null) return false; const existingAttribute = findObjs({ type: 'attribute', characterid: character.id, name: attributeName })[0]; if (existingAttribute) { existingAttribute.set({ current: newValue }); if (newMaxValue != null) existingAttribute.set({ max: newMaxValue }); } else { const newAttribute = createObj('attribute', { characterid: character.id, name: attributeName, current: newValue }); if (newMaxValue != null) newAttribute.set({ max: newMaxValue }); } // console.log(`Created/updated attribute with ${newValue}`); return true; } const indexHeresyRepeatingRows = async (characterId) => { const characterArray = characterId ? [ getObj('character', characterId) ] : findObjs({ type: 'character' }); if (characterArray && characterArray.length) { await Promise.all(characterArray.map(character => { const rowIds = getRepeatingRowIds(character, repeatingSectionName); rowIds.forEach(rowId => { setOrCreateAttribute(character, `repeating_${repeatingSectionName}_${rowId}_${repeatingAttributeName}`, rowId); }); })); sendChat(scriptName, 'Finished processing sheets.'); } else sendChat(scriptName, 'No characters found.'); } })();