获取表onChange事件的列名

时间:2018-10-28 21:23:35

标签: office-js

任务:

使用表对象的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
}

1 个答案:

答案 0 :(得分:0)

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

但是一个问题是,当您更改某个非连续范围(例如A4和B5 Discontinue Range)时,它将在一个事件中返回地址“ A​​4,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]]
}

或...

似乎他们两个都很复杂。如果您可以分享自己的想法,那可能会很棒。预先感谢。