Utiliza la macro de ONLYOFFICE para obtener e insertar información detallada sobre la dirección

8 junio 2023By Sergey

A menudo trabajar con datos mal introducidos puede ser un gran problema. Pero, ¿y si hubiera una forma de automatizar esta tarea? En este artículo te ayudaremos a crear una macro que recupere información detallada sobre la dirección a partir de los datos básicos de la dirección y la inserte en una hoja de cálculo.

Utiliza la macro de ONLYOFFICE para obtener e insertar información detallada sobre la dirección

 

Acerca de la API de geocodificación de Geoapify

La API de geocodificación de Geoapify es una potente herramienta que permite a los desarrolladores integrar funciones de geocodificación en sus aplicaciones y servicios. La geocodificación es el proceso de convertir direcciones o nombres de lugares en coordenadas geográficas.

Con la API de geocodificación de Geoapify, es posible recuperar datos detallados sobre direcciones, incluidos nombres de calles, nombres de ciudades, códigos postales, regiones administrativas, etc. Y tenemos previsto aprovechar esta función e integrarla en nuestra macro.

Concepto de la macro

  • Leer la dirección de la celda especificada.
  • Enviar una solicitud a la API de geocodificación de Geoapify para obtener los detalles de la dirección.
  • Procesar la respuesta y crear el objeto Detalles de la dirección.
  • Pegar los detalles de la dirección en la hoja de cálculo.
  • Leer la siguiente dirección y repetir el proceso.

Creación de la macro

En primer lugar, declaramos las variables:

    const API_KEY = 'your_API_key'
    const ENDPOINT = 'https://api.geoapify.com/v1/geocode/search'
    const oWorksheet = Api.GetActiveSheet()
    let row = 2

La variable API_KEY contiene tu clave de la API de Geoapify. La variable ENDPOINT almacena el punto final de la API para el servicio de geocodificación. La variable oWorksheet se refiere a la hoja de cálculo activa. Y la variable row permite seleccionar la fila deseada.

A continuación añadimos la función makeRequest que se encarga de enviar una solicitud a la API:

  makeRequest(oWorksheet.GetRange(`A${row}`).GetText())
 
    // REQUEST
    function makeRequest(ADDRESS) {
        if (ADDRESS === '') return
        $.ajax({
            url: `${ENDPOINT}?text=${addressToRequest(ADDRESS)}&apiKey=${API_KEY}`,
            dataType: 'json',
        }).done(successFunction)
    }

Utiliza la función $.ajax para realizar una solicitud HTTP GET al endpoint, pasando la dirección como parámetro.

A continuación, la función addressToRequest transforma la dirección en un formato compatible con la URL:

function addressToRequest (address) {
        return address.replaceAll(' ', '%20').replaceAll(',', '%2C')
    }

Si la solicitud a la API tiene éxito, se llama a la función successFunction. Recibe la respuesta de la API como parámetro:

  function successFunction(response) {
        const data = createAddressDetailsObject(response)
        pasteAddressDetails(data)
        reload()
    }

A continuación, la función createAddressDetailsObject procesa la respuesta. Si no se encuentra la dirección, se devuelve un mensaje de error. En caso contrario, la función crea el objeto Detalles de la dirección:

    // Create Address Details object if address is found
    function createAddressDetailsObject(response) {
        if (response.features.length === 0) {
            return { error: 'Address not found' }
        }
        let data = {
            country: response.features[0].properties.country,
            county: response.features[0].properties.county,
            city: response.features[0].properties.city,
            post_code: response.features[0].properties.postcode,
            full_address_line: response.features[0].properties.formatted
        }
        data = checkMissingData(data)
        return data
    }

Para comprobar los datos recibidos, utilizamos la función checkMissingData. Sustituye los campos que faltan por un guion:

 function checkMissingData(data) {
        Object.keys(data).forEach(key => {
            if(data[key] === undefined) data[key] = '-'
        })
        return data
    }

A continuación, pegamos los datos con la función pasteAddressDetails. La función utiliza el objeto oWorksheet para localizar la hoja activa y seleccionar el rango apropiado:

function pasteAddressDetails(data) {
        const oRange = oWorksheet.GetRange(`B${row}:F${row}`)

Si hay un mensaje de error, se pega en el rango:

 if (data.error !== undefined) {
            oRange.SetValue([[data.error]])
        } 

De lo contrario, los detalles de la dirección se rellenan en el rango utilizando la función SetValue:

 else {
            oRange.SetValue([
                [data.country],
                [data.county],
                [data.city],
                [data.post_code],
                [data.full_address_line]
            ])
        }

A continuación, la función incrementa la fila y llama recursivamente a makeRequest para procesar la siguiente dirección:

 // Execute recursively until "Address" value is empty
        row++
        makeRequest(oWorksheet.GetRange(`A${row}:A${row}`).GetText())
    }

Después, invocamos la función de recarga. Ésta provoca un nuevo cálculo de la hoja de cálculo después de procesar cada dirección:

 function reload() {
        let reload = setInterval(function(){
            Api.asc_calculate(Asc.c_oAscCalculateType.All);
        })
    }

El código completo de la macro es el siguiente:

(function()
{
    const API_KEY = 'your_API_key'
    const ENDPOINT = 'https://api.geoapify.com/v1/geocode/search'
    const oWorksheet = Api.GetActiveSheet()
    let row = 2
    makeRequest(oWorksheet.GetRange(`A${row}`).GetText())
    
    
    // REQUEST
    function makeRequest(ADDRESS) {
        if (ADDRESS === '') return
        $.ajax({
            url: `${ENDPOINT}?text=${addressToRequest(ADDRESS)}&apiKey=${API_KEY}`,
            dataType: 'json',
        }).done(successFunction)
    }
    // London, United Kingdom -> London%2C%20United%20Kingdom
    function addressToRequest (address) {
        return address.replaceAll(' ', '%20').replaceAll(',', '%2C')
    }
    
    
    // RESPONSE
    function successFunction(response) {
        const data = createAddressDetailsObject(response)
        pasteAddressDetails(data)
        reload()
    }
    // Create Address Details object if address is found
    function createAddressDetailsObject(response) {
        if (response.features.length === 0) {
            return { error: 'Address not found' }
        }
        let data = {
            country: response.features[0].properties.country,
            county: response.features[0].properties.county,
            city: response.features[0].properties.city,
            post_code: response.features[0].properties.postcode,
            full_address_line: response.features[0].properties.formatted
        }
        data = checkMissingData(data)
        return data
    }
    // Replace missing fields with '-'
    function checkMissingData(data) {
        Object.keys(data).forEach(key => {
            if(data[key] === undefined) data[key] = '-'
        })
        return data
    }
    
    
    // PASTE
    function pasteAddressDetails(data) {
        const oRange = oWorksheet.GetRange(`B${row}:F${row}`)
        if (data.error !== undefined) {
            oRange.SetValue([[data.error]])
        } else {
            oRange.SetValue([
                [data.country],
                [data.county],
                [data.city],
                [data.post_code],
                [data.full_address_line]
            ])
        }
        // Execute recursively until "Address" value is empty
        row++
        makeRequest(oWorksheet.GetRange(`A${row}:A${row}`).GetText())
    }
    
    // Sheet has to be reloaded on changes
    function reload() {
        let reload = setInterval(function(){
            Api.asc_calculate(Asc.c_oAscCalculateType.All);
        })
    }
})();

Vamos a ejecutar la macro y ver cómo funciona:

Ahora, con esta macro, puedes automatizar tu rutina y recuperar información detallada de direcciones sin esfuerzo. Esperamos que te ahorre tiempo y minimice la introducción manual de datos. Este es solo uno de los muchos ejemplos de lo que puedes hacer implementando nuestros métodos de la API.

Te animamos a que experimentes y crees tus propias macros. No dudes en hacernos preguntas o compartir tus ideas con nosotros. Estamos abiertos al debate y la cooperación. Te deseamos mucha suerte en tus exploraciones.