79530469

Date: 2025-03-24 08:08:18
Score: 0.5
Natty:
Report link

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);
        }
    };           
Reasons:
  • Blacklisted phrase (0.5): I cannot
  • Long answer (-1):
  • Has code block (-0.5):
  • Self-answer (0.5):
  • Low reputation (1):
Posted by: FlorentS