首页 > 解决方案 > 获取表onChange事件的列名

问题描述

任务:

使用表对象的 OnChange 事件,检测该特定表的哪一列和哪一行发生了变化。

目前我有以下代码,它可以工作并且可能相当有效,但是我想知道是否有更简单的替代方案?因为这看起来确实应该内置到事件对象本身中......

async function registerOnChangeEvent(tableName,callback) {
    return await Excel.run(async (context) => {
        const pointsTab = context.workbook.tables.getItem(tableName);
        const headers = pointsTab.getHeaderRowRange().load("values");
        const headersAdd = pointsTab.getHeaderRowRange().load("address");
        await context.sync();

        //Register event
        pointsTab.onChanged.add((event)=>{
            return Excel.run(function(context){ 
                return context.sync()
                    .then(function () {
                        //event, context, this
                        //console.log(event, context, this)
                        var rootData  = headersAdd.address.match(/\!([A-Z]+)(\d+)/)
                        var rootCol   = getColumnIndex(rootData[1])
                        var rootRow   = parseInt(rootData[2])
                        var eventData = event.address.match(/([A-Z]+)(\d+)/)
                        var eventCol  = getColumnIndex(eventData[1])
                        var eventRow  = parseInt(eventData[2])

                        //column name and number from event and root data.
                        event["colNum"] = eventCol - rootCol;
                        event["colName"] = headers.values[0][event["colNum"]];
                        event["rowNum"] = eventRow - rootRow;

                        console.log(event)
                        callback(event); //If required.
                    })
            }).catch(function () {
                //...
            })
        })
        return
    });
}

function getColumnIndex(address) {
    const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    var arr = address.split("")
    var sum = 0
    arr.forEach((char, index) => {
        var i = arr.length - index - 1
        sum = sum + (alphabet.indexOf(char) + 1) * Math.pow(alphabet.length, i)
    })
    return sum
}

标签: office-js

解决方案


感谢您询问和使用我们的 API。让我再次确认您的要求。您需要的是事件参数中表的列/行索引,对吗?这也是我们正在考虑的。

但是一个问题是,当您更改某些中断范围(如 A4 和 B5 Discontinue Range)时,它将在一个事件中返回地址“A4,B5”。中断范围由逗号分隔。所以我们不能只为“A4”或“B5”返回索引和宽度/长度。所以也许我们可以返回列/行索引列表和宽度/长度列表,如

EventArgument {
    ...
    address: "A4, B5",
    columnIndexes: [1, 2],
    rowIndexes: [1, 2],
    weigths: [1, 1],
    lengths: [1, 1],
    ...
}

或者

EventArgument {
    address: "A4, B5",
    Indexes: [[1, 1, 1, 1], [2, 2, 1, 1]]
}

或者 ...

似乎它们中的任何一个都很复杂。如果您可以分享您的想法,那可能会很棒。提前致谢。


推荐阅读