Usa la macro ONLYOFFICE per ottenere e inserire informazioni dettagliate sull’indirizzo

9 giugno 2023By Elena

Molto spesso, lavorare con dati non strutturati inseriti in foglio Excel potrebbe ostacolare i calcoli. Esiste un modo per inserire i dati in Excel in automatico? In questo articolo ti guideremo attraverso la creazione di una macro che recupera informazioni dettagliate sull’indirizzo in base ai dati dell’indirizzo e li inserisce in un foglio di calcolo.

Use ONLYOFFICE macro to obtain and insert detailed address information

 

Informazioni sull’API di Geoapify Geocoding

Geoapify Geocoding API è un potente strumento che consente agli sviluppatori di integrare funzionalità di geocoding nelle loro applicazioni e servizi. La geocodifica è il processo di conversione di indirizzi o nomi di luoghi in coordinate geografiche.

Con l’API Geoapify Geocoding, puoi recuperare dati dettagliati sugli indirizzi, inclusi nomi di strade, nomi di città, codici postali, regioni amministrative e altro. E abbiamo in programma di sfruttare questa funzionalità e integrarla nella nostra macro.

Concetto di macro

  • Legge l’indirizzo dalla cella specificata.
  • Invia una richiesta all’API Geoapify Geocoding per recuperare i dettagli dell’indirizzo.
  • Elabora la risposta e crea l’oggetto Dettagli indirizzo.
  • Incolla i dettagli dell’indirizzo nel foglio di lavoro.
  • Legge l’indirizzo successivo e ripeti il processo.

Costruire la macro

Innanzitutto, segniamo le variabili:

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

La variabile API_KEY contiene la chiave API Geoapify. La variabile ENDPOINT memorizza l’endpoint API per il servizio di geocodifica. La variabile oWorksheet ha come target il foglio di calcolo attivo. E la variabile row  consente di selezionare la riga desiderata.

Quindi aggiungiamo la funzione makeRequest che è responsabile dell’invio di una richiesta all’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)
    }

Utilizza la funzione $.ajax per effettuare una richiesta HTTP GET all’endpoint, passando l’indirizzo come parametro.

Quindi la funzione addressToRequest trasforma l’indirizzo in un formato compatibile con l’URL:

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

Se la richiesta API ha esito positivo, viene chiamata successFunction. Riceve la risposta dall’API come parametro:

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

Quindi la funzione createAddressDetailsObject elabora la risposta. Se l’indirizzo non viene trovato, viene restituito un messaggio di errore. In caso contrario, la funzione crea l’oggetto Dettagli indirizzo:

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

Per controllare i dati ricevuti, utilizziamo la funzione checkMissingData. Sostituisce i campi mancanti con un trattino:

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

Quindi incolliamo i dati con la funzione pasteAddressDetails. La funzione utilizza l’oggetto oWorksheet per indirizzare il foglio attivo e selezionare l’intervallo appropriato:

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

Se è presente un messaggio di errore, viene incollato nell’intervallo:

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

In caso contrario, i dettagli dell’indirizzo vengono popolati nell’intervallo utilizzando la funzione SetValue:

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

La funzione quindi incrementa la riga e chiama in modo ricorsivo makeRequest per elaborare l’indirizzo successivo:

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

Successivamente, invochiamo la funzione di ricarica. Attiva un ricalcolo del foglio di calcolo dopo l’elaborazione di ciascun indirizzo:

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

L’intero codice della macro è il seguente:

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

Eseguiamo la macro e vediamo come funziona!

Ora, con questa macro, puoi automatizzare la tua routine e recuperare facilmente informazioni dettagliate sull’indirizzo. Ci auguriamo che ti farà risparmiare tempo e ridurrà al minimo l’inserimento manuale dei dati. Questo è solo uno dei tanti esempi di cosa puoi fare implementando i nostri metodi API.

Ti invitiamo gentilmente a sperimentare e creare le tue macro. Non esitate a fare domande o condividere le vostre idee con noi. Siamo aperti alla collaborazione. Buona fortuna!