使用 attachEvent 方法处理宏代码中的事件

2024年11月14日作者: Alina

随着编辑器的不断迭代和功能的增强,我们致力于为用户提供定制的解决方案,以满足其特定需求。ONLYOFFICE 宏便是其中一个强大的自定义工具。在本文中,我们将介绍 attachEvent 方法并说明它如何与宏代码事件协同工作,同时提供一个脚本示例,该示例能在一次执行中运行两个独立的宏。

Use the attachEvent method to handle events in your macro code

关于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 方法,助您打造专属解决方案。

我们诚邀您利用此资源创建个性化宏。如果您有任何问题或想要分享的宏,请随时与我们联系。我们期待与您交流合作。

创建免费的 ONLYOFFICE 账户

在线查看并协作编辑文本文档、电子表格、幻灯片、表单和 PDF 文件。