Dos macros de ONLYOFFICE: resalte los duplicados y vaya a la siguiente fila vacía

15 junio 2020By Sergey

Nuestros usuarios nos preguntaron cómo recrear algunas macros de VBA que estaban usando en Excel. En este post mostraremos cómo hacerlo con dos ejemplos simples.

macros in onlyoffice

Acerca de las macros de ONLYOFFICE

Las macros de ONLYOFFICE utilizan la sintaxis del lenguaje JavaScript y la notación de scripts de la API del Constructor de Documentos de ONLYOFFICE (ONLYOFFICE Document Builder). Esto significa que no podrá usar las macros de VBA hasta que las recree usando JavaScript.

Elegimos usar JavaScript para nuestras macros porque:
 

  • es multiplataforma,
  • es realmente fácil de usar,
  • puede usar el código que escribió como una macro o como un plugin.

Además, nuestras macros están seguras porque no tienen ningún acceso al sistema. Son sólo el código JS que se ejecuta por los editores en la misma ventana.

Cómo empezar a escribir su propia macro

 

  1. En el editor de hojas de cálculo abra la pestaña Extensiones y haga clic en Macros.
  2. Haga clic en “Nuevo” en la ventana que apareció.
  3. Consulte la documentación de la API para escribir el script.
Ejemplo #1: Resaltar los duplicados

Vamos a escribir una macro para resaltar los duplicados en el área seleccionada con diferentes colores para reconocer rápidamente los valores duplicados. Usaremos esta simple macro de VBA como base.

Aquí está el script resultante con comentarios para que entiende cómo se hace. Los colores se determinan en el código de la macro.

(function () {
    // Background color of cells with non-repeating values
    var whiteFill = Api.CreateColorFromRGB(255, 255, 255);
    // The current index of the color range
    var uniqueColorIndex = 0;
    // Color range to highlight duplicate values
    var uniqueColors = [Api.CreateColorFromRGB(255, 255, 0),
        Api.CreateColorFromRGB(204, 204, 255),
        Api.CreateColorFromRGB(0, 255, 0),
        Api.CreateColorFromRGB(0, 128, 128),
        Api.CreateColorFromRGB(192, 192, 192),
        Api.CreateColorFromRGB(255, 204, 0)];
 
    // Function to get color for duplicates
    function getColor() {
        // If you have chosen all the unique colors, then let's go from the beginning
        if (uniqueColorIndex === uniqueColors.length) {
            uniqueColorIndex = 0;
        }
        return uniqueColors[uniqueColorIndex++];
    }
 
    // Getting an active sheet
    var activeSheet = Api.ActiveSheet;
    // Getting selection on the active sheet
    var selection = activeSheet.Selection;
    // Map of values in cells with the duplicates number
    var mapValues = {};
    // All cells range
    var arrRanges = [];
    // Going through the selection
    selection.ForEach(function (range) {
        // Getting value from cell
        var value = range.GetValue();
        if (!mapValues.hasOwnProperty(value)) {
            mapValues[value] = 0;
        }
        mapValues[value] += 1;
        arrRanges.push(range);
    });
    var value;
    var mapColors = {};
    // We go through all the cells of the selection and setting the highlighting if this value is repeated more than 1 time
    for (var i = 0; i < arrRanges.length; ++i) {
        value = arrRanges[i].GetValue();
        if (mapValues[value] > 1) {
            if (!mapColors.hasOwnProperty(value)) {
                mapColors[value] = getColor();
            }
            arrRanges[i].SetFillColor(mapColors[value]);
        } else {
            arrRanges[i].SetFillColor(whiteFill);
        }
    }
})();

Esto es lo que obtenemos con esta macro:

ONLYOFFICE macro highlight duplicates

Ejemplo #2

Esta macro encuentra la siguiente fila en blanco disponible en una hoja de trabajo. Tomamos esta macro de VBA como ejemplo y creamos este script:

(function()
{
    // Getting the active sheet
    var activeSheet = Api.ActiveSheet;
    // Minimum row index
    var indexRowMin = 0;
    // Maximum row index
    var indexRowMax = 1048576;
    // Column 'A'
    var indexCol = 0;
    // Row index for empty cell search
    var indexRow = indexRowMax;
    for (; indexRow >= indexRowMin; --indexRow) {
        // Getting the cell
        var range = activeSheet.GetRangeByNumber(indexRow, indexCol);
        // Checking the value
        if (range.GetValue() && indexRow !== indexRowMax) {
            range = activeSheet.GetRangeByNumber(indexRow + 1, indexCol);
            range.Select();
            break;
        }
    }
})();

Este código le ayudará a seleccionar la siguiente fila vacía (añadiremos el desplazamiento en una de las próximas versiones).

Tenga en cuenta que la macro salteará cualquier espacio en blanco que esté entre sus datos pero no al final de los mismos.

Cómo obtener ayuda con los macros

Si necesita ayuda para escribir macros o el método que necesita está ausente de nuestra API, publique un asunto en GitHub.

Enlaces útiles

ONLYOFFICE en GitHub

Artículo sobre cómo empezar a escribir plugins. Lea ahora>>

Ejemplo de plugin: rellene las celdas con color y convierta su hoja de trabajo en una imagen. Compruébelo>>