Получение имени столбца таблицы для события onChange - PullRequest
0 голосов
/ 29 октября 2018

Задача:

Используя событие 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 голосов
/ 31 октября 2018

Спасибо за ваш запрос и использование нашего 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]]
}

или ...

Кажется, что либоони сложны.Было бы здорово, если бы вы могли поделиться своими идеями по этому поводу.Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...