Usa il metodo attachEvent per gestire gli eventi nel codice delle macro

13 novembre 2024By Alice

Aggiornando continuamente i nostri editor e migliorandone le funzionalità, ci impegniamo a fornire ai nostri utenti la possibilità di adattarli alle loro esigenze specifiche. Uno dei potenti strumenti di personalizzazione disponibili sono le macro di ONLYOFFICE. In questo post introdurremo il metodo attachEvent e spiegheremo come funziona con gli eventi nel codice delle macro.
Lo script che utilizzeremo eseguirà due macro separate in un’unica esecuzione.

Use the attachEvent method to handle events in your macro code

A proposito del metodo attachEvent 

Questo metodo è in ascolto dell’evento specificato e chiama la funzione di callback quando l’evento viene attivato, consentendoci di eseguire uno script aggiuntivo all’interno di questa callback. Ecco un esempio di implementazione utilizzando l’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());
});

Utilizzo del metodo attachEvent per eseguire due macro in un’unica esecuzione

Nella prima parte del nostro script, utilizzeremo la macro Import CSV per importare dati da un file CSV esterno e inserirli in una tabella. Nella seconda parte, eseguita all’interno del callback, calcoleremo tutti i valori di una colonna specifica e visualizzeremo il risultato.

Quindi, per prima cosa importiamo il CSV esterno e inseriamo i dati nella tabella:

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

Dopodiché introduciamo la funzione calculateSum() che calcolerà i valori nel range selezionato:

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

Successivamente, richiamiamo la funzione LoadFile ed eseguiamo il metodo attachEvent, che ascolterà le modifiche apportate al foglio di lavoro. Quando si verifica una modifica, la funzione calculateSum() viene eseguita nel callback:

    LoadFile();

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

Alla fine della macro, eseguiamo la funzione asc_calculate per ricaricare il foglio di calcolo e visualizzare il risultato del calcolo nella cella selezionata:

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

Ecco l’intero codice della macro:

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

Ora eseguiamo la macro e vediamola in azione!

Nel mondo di ONLYOFFICE, cerchiamo sempre di migliorare la flessibilità e la versatilità del nostro prodotto. Le macro di ONLYOFFICE sono uno strumento eccellente che consente di personalizzare le funzionalità e di rispondere alle tue esigenze specifiche: la nostra ampia libreria di metodi API costantemente aggiornata consente di creare soluzioni personalizzate.

Ti invitiamo ad approfittare di questa risorsa e a creare le tue macro. Se hai domande o macro da condividere, non esitare a contattarci. Siamo lieti di discutere e collaborare con te. Buon lavoro!

Crea il tuo account ONLYOFFICE gratuito

Visualizza, modifica e collabora su documenti, fogli, diapositive, moduli e file PDF online.