使用 attachEvent 方法处理宏代码中的事件
2024年11月14日作者: Alina
随着编辑器的不断迭代和功能的增强,我们致力于为用户提供定制的解决方案,以满足其特定需求。ONLYOFFICE 宏便是其中一个强大的自定义工具。在本文中,我们将介绍 attachEvent 方法并说明它如何与宏代码事件协同工作,同时提供一个脚本示例,该示例能在一次执行中运行两个独立的宏。
关于attachEvent方法
此方法会监听特定事件,一旦事件被触发,就调用回调函数,使我们能够在回调中执行附加脚本。以下是使用 onWorksheetChange 事件实现的示例:
var oWorksheet = Api.GetActiveSheet();
var oRange = oWorksheet.GetRange("A1");
oRange.SetValue("1");
Api.attachEvent("onWorksheetChange", function(oRange){
console.log("onWorksheetChange");
console.log(oRange.GetAddress());
});
使用 attachEvent 方法在一次运行中执行两个宏
脚本的第一部分将使用导入 CSV 宏,从外部 CSV 文件读取数据并导入到表格中。第二部分则在回调函数中执行,负责计算特定列的总和并显示结果。
因此,首先我们导入外部 CSV 文件,并将数据填充到表格中:
const oWorksheet = Api.GetActiveSheet();
const oRange = oWorksheet.GetRange("B2:B16");// set the range for calculations
const result = Api.GetActiveSheet().GetRange("B17");// set the cell to display the result
let sum = 0;
function LoadFile() {
$.ajax({
url: 'pathToCsVfile',
dataType: 'text',
}).done(successFunction);
}
function successFunction(data) {
const arrAllRows = data.split(/\r?\n|\r/);
let i = 1;
let j = 1;
for (let singleRow = 0; singleRow < arrAllRows.length; singleRow++) {
const rowCells = arrAllRows[singleRow].split(',');
for (let rowCell = 0; rowCell < rowCells.length; rowCell++) {
oWorksheet.GetCells(i, j).SetValue(rowCells[rowCell]);
j += 1;
}
i += 1;
j = 1;
}
}
然后,引入 calculateSum() 函数来计算选定范围内的数值总和:
function calculateSum() {
sum = 0; // Reset the sum
oRange.ForEach(function(cell) { // Loop over all cells in the range
const value = cell.GetValue();
if (!isNaN(parseFloat(value))) {
sum += parseFloat(value); // Add the cell's numeric value to the sum
}
});
}
接下来,我们调用 LoadFile 函数并执行 attachEvent 方法,来监听工作表上的任何更改。一旦检测到更改, calculateSum() 函数将在回调中被触发并执行:
LoadFile();
// Attach event to recalculate sum when cells change
Api.attachEvent("onWorksheetChange", function() {
calculateSum();
});
在宏的末尾,我们调用 asc_calculate 函数,以重新加载电子表格并在选定的单元格中显示计算结果:
// Update the cell B17 with the calculated sum
let reload = setInterval(function() {
Api.asc_calculate(Asc.c_oAscCalculateType.All);
result.SetValue(`The sum: ${sum}`);
});
完整宏代码如下:
(function() {
const oWorksheet = Api.GetActiveSheet();
const oRange = oWorksheet.GetRange("B2:B16");// set the range for calculations
const result = Api.GetActiveSheet().GetRange("B17");// set the cell to display the result
let sum = 0;
function LoadFile() {
$.ajax({
url: 'pathToCsVfile',
dataType: 'text',
}).done(successFunction);
}
function successFunction(data) {
const arrAllRows = data.split(/\r?\n|\r/);
let i = 1;
let j = 1;
for (let singleRow = 0; singleRow < arrAllRows.length; singleRow++) {
const rowCells = arrAllRows[singleRow].split(',');
for (let rowCell = 0; rowCell < rowCells.length; rowCell++) {
oWorksheet.GetCells(i, j).SetValue(rowCells[rowCell]);
j += 1;
}
i += 1;
j = 1;
}
}
function calculateSum() {
sum = 0; // Reset the sum
oRange.ForEach(function(cell) { // Loop over all cells in the range
const value = cell.GetValue();
if (!isNaN(parseFloat(value))) {
sum += parseFloat(value); // Add the cell's numeric value to the sum
}
});
}
LoadFile();
// Attach event to recalculate sum when cells change
Api.attachEvent("onWorksheetChange", function() {
calculateSum();
});
// Update the cell B17 with the calculated sum
let reload = setInterval(function() {
Api.asc_calculate(Asc.c_oAscCalculateType.All);
result.SetValue(`The sum: ${sum}`);
});
})();
现在,让我们来执行这个宏,看看它的运行效果!
在 ONLYOFFICE 领域,我们始终致力于提升产品的灵活性和多功能性。ONLYOFFICE 宏作为一种出色的工具,能够让您自定义功能,以满足特定需求。我们持续更新的丰富 API 方法库,助您打造专属解决方案。
我们诚邀您利用此资源创建个性化宏。如果您有任何问题或想要分享的宏,请随时与我们联系。我们期待与您交流合作。