Actually I've found a workaround that without performance issue. I keep the collection in memory and compare it each time there is a change.
But I cannot base this on the count of named items as some can be added/deleted.
I get all items like this
async function getNamedItems(ctx:Excel.RequestContext):Promise<NamedCell[]>{
var namedItemsColl : NamedCell[] = [];
const namedItems : Excel.NamedItemCollection = ctx.workbook.names.load('items');
await ctx.sync();
for (let i = 0; i < namedItems.items.length; i++) {
var namedCell : NamedCell = new NamedCell;
namedCell.name = namedItems.items[i].name;
namedCell.range = namedItems.items[i].value;
namedItemsColl.push(namedCell);
}
return namedItemsColl;
}
And here is how I compare :
var namedItems: NamedCell[] =[];
await getNamedItems(ctx).then(result => namedItems = result);
for (let i = 0; i < namedItems.length; i++) {
if(namedCollection.find(x => x.name == namedItems[i].name) ==null)
{
namedcoll = new CellChangeDataClient;
namedcoll.changeType = Excel.DataChangeType.rangeEdited;
var nameItem : CellNameUpdate = new CellNameUpdate;
nameItem.change='added';
nameItem.name = namedItems[i].name;
nameItem.range = namedItems[i].range;
namedcoll.namedItems = nameItem;
changesArray.push(namedcoll);
}
}
var tempCell: NamedCell|undefined;
for (let i = 0; i < namedCollection.length; i++) {
tempCell= namedItems.find(x => x.name == namedCollection[i].name);
if(tempCell == undefined)
{
namedcoll = new CellChangeDataClient;
namedcoll.changeType = Excel.DataChangeType.rangeEdited;
var nameItem : CellNameUpdate = new CellNameUpdate;
nameItem.change='deleted';
nameItem.name = namedCollection[i].name;
namedcoll.namedItems=nameItem;
changesArray.push(namedcoll);
}
else if(tempCell.range != namedCollection[i].range)
{
namedcoll = new CellChangeDataClient;
namedcoll.changeType = Excel.DataChangeType.rangeEdited;
var nameItem : CellNameUpdate = new CellNameUpdate;
nameItem.change='updated';
nameItem.name = tempCell.name;
nameItem.range = tempCell.range;
namedcoll.namedItems=nameItem;
changesArray.push(namedcoll);
}
};