Use o método attachEvent para tratar eventos em seu código de macro

14 novembro 2024By Sergey

À medida que atualizamos continuamente nossos editores e aprimoramos sua funcionalidade, nos esforçamos para fornecer aos nossos usuários a capacidade de adaptá-los às suas necessidades específicas. Uma das poderosas ferramentas de personalização disponíveis são as macros do ONLYOFFICE. Nesta postagem do blog, apresentaremos o método attachEvent e explicar como ele funciona com eventos em seu código de macro. O script que usaremos executará duas macros separadas em uma única execução.

Use o método attachEvent para tratar eventos em seu código de macro

Sobre o método attachEvent

Esse método escuta o evento especificado e chama a função de retorno de chamada quando o evento é acionado, o que nos permite executar um script adicional dentro desse retorno de chamada. Aqui está um exemplo da implementação usando o evento 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());
});

Uso do método attachEvent para executar duas macros em uma única execução

Na primeira parte do nosso script, usaremos a macro Import CSV para importar dados de um arquivo CSV externo e inseri-los em uma tabela. Na segunda parte, executada dentro do retorno de chamada, calcularemos todos os valores em uma coluna específica e exibiremos o resultado.

Portanto, primeiro importamos o CSV externo e inserimos os dados na tabela:

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;
        }
    }

Em seguida, introduzimos a função calculateSum() que calculará os valores no intervalo selecionado:

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
            }
        });
    }

Em seguida, invocamos a função LoadFile e executamos o método attachEvent, que ficará atento a qualquer alteração na planilha. Quando ocorrer uma alteração, a função calculateSum() será executada na chamada de retorno:

    LoadFile();

    // Attach event to recalculate sum when cells change
    Api.attachEvent("onWorksheetChange", function() {
        calculateSum();
    });

No final da nossa macro, executamos a função asc_calculate para recarregar a planilha e exibir o resultado do cálculo na célula selecionada:

 // Update the cell B17 with the calculated sum
    let reload = setInterval(function() {
        Api.asc_calculate(Asc.c_oAscCalculateType.All);
        result.SetValue(`The sum: ${sum}`);
    });

O código completo da macro é o seguinte:

(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}`);
    });

Agora vamos executar a macro e ver como ela funciona!

No reino do ONLYOFFICE, sempre nos esforçamos para aumentar a flexibilidade e a versatilidade do nosso produto. As macros do ONLYOFFICE são uma ferramenta excelente que permite personalizar a funcionalidade e atender às suas necessidades específicas. Nossa extensa biblioteca de métodos de API, que é constantemente atualizado, permite que você crie suas próprias soluções.

Nós encorajamos você a aproveitar este recurso e criar suas próprias macros. Se você tiver alguma dúvida ou macros para compartilhar, não hesite em nos contatar. Nós damos boas-vindas à discussão e colaboração. Boa sorte em seus esforços exploratórios!

Crie sua conta gratuita no ONLYOFFICE

Visualize, edite e colabore em documentos, planilhas, slides, formulários e arquivos PDF online.