If you need to resolve a repeating row by #, I have an API function that will do it, and an example script: on('ready',function(){
"use strict";
var attrLookup = function(character,name,caseSensitive){
let match=name.match(/^(repeating_.*)_\$(\d+)_.*$/);
if(match){
let index=match[2],
attrMatcher=new RegExp(`^${name.replace(/_\$\d+_/,'_([-\\da-zA-Z]+)_')}$`,(caseSensitive?'i':'')),
createOrderKeys=[],
attrs=_.chain(findObjs({type:'attribute', characterid:character.id}))
.map((a)=>{
return {attr:a,match:a.get('name').match(attrMatcher)};
})
.filter((o)=>o.match)
.each((o)=>createOrderKeys.push(o.match[1]))
.reduce((m,o)=>{ m[o.match[1]]=o.attr; return m;},{})
.value(),
sortOrderKeys = _.chain( ((findObjs({
type:'attribute',
characterid:character.id,
name: `_reporder_${match[1]}`
})[0]||{get:_.noop}).get('current') || '' ).split(/\s*,\s*/))
.intersection(createOrderKeys)
.union(createOrderKeys)
.value();
if(index<sortOrderKeys.length && _.has(attrs,sortOrderKeys[index])){
return attrs[sortOrderKeys[index]];
}
return;
}
return findObjs({ type:'attribute', characterid:character.id, name: name})[0];
};
on('chat:message',function(msg){
if('api' === msg.type && msg.content.match(/^!resolve-repeating\b/) ){
let args=_.rest(msg.content.split(/\s+/)),
who = getObj('player',msg.playerid).get('displayname');
if(args.length){
_.chain(msg.selected)
.map((o)=>getObj('graphic',o._id))
.reject(_.isUndefined)
.filter((t)=>t.get('represents').length)
.map(t=>{ return {token:t,character:getObj('character',t.get('represents'))};})
.reject(o=>_.isUndefined(o.character))
.map(o=>{
o.attrs=_.reduce(args,(m,a)=>{
let attr=attrLookup(o.character,a,false);
m[a]=(attr ? attr.get('name') : '[MISSING]');
return m;
},{});
return o;
})
.map(o=> `<div><h3>${o.character.get('name')}</h3><ul>${_.map(o.attrs,(a,n)=>`<li><b>${n}</b>-<code>${a}</code></li>`).join('')}</ul></div>`)
.tap(out=>{
sendChat('',`/w ${who} ${out.join('')}`);
});
} else {
sendChat('',`/w ${who} <b>No tokens selected</b>`);
}
}
});
});