任务:
使用表对象的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
}
答案 0 :(得分:0)
感谢您的询问和使用我们的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]]
}
或...
似乎他们两个都很复杂。如果您可以分享自己的想法,那可能会很棒。预先感谢。