Utilisez la macro ONLYOFFICE pour obtenir et insérer des informations détaillées sur l’adresse

8 juin 2023By Dasha

Bien souvent, le fait de travailler avec des données mal saisies peut s’avérer très gênant. Existe-il un moyen d’automatiser cette tâche ? Dans cet article, nous vous guiderons dans la création d’une macro qui récupère des informations détaillées sur les adresses à partir des données de base et les insère dans une feuille de calcul.

Use ONLYOFFICE macro to obtain and insert detailed address information

À propos de l’API de géocodage Geoapify

L’API de géocodage de Geoapify est un outil puissant qui permet aux développeurs d’intégrer la fonctionnalité de géocodage dans leurs applications et services. Le géocodage consiste à convertir des adresses ou des noms de lieux en coordonnées géographiques.

Avec l’API de géocodage de Geoapify, vous pouvez récupérer des données détaillées sur les adresses, y compris les noms de rue, les noms de ville, les codes postaux, les régions administratives, etc. Nous prévoyons de tirer parti de cette fonctionnalité et de l’intégrer dans notre macro.

Concept de macro

  • Lire l’adresse de la cellule spécifiée.
  • Envoyer une demande à l’API de géocodage de Geoapify pour obtenir les détails de l’adresse.
  • Traiter la réponse et créer l’objet Détails de l’adresse.
  • Coller les détails de l’adresse dans la feuille de calcul.
  • Lire l’adresse suivante et répéter le processus.

Construire la macro

Tout d’abord, nous déclarons des 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 contient votre clé API Geoapify. La variable ENDPOINT contient le point de terminaison de l’API pour le service de géocodage. La variable oWorksheet cible la feuille de calcul active. La variable row permet de sélectionner la ligne souhaitée.

Nous ajoutons ensuite la fonction makeRequest qui est chargée d’envoyer une demande à l’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)
    }

Il utilise la fonction $.ajax pour effectuer une requête HTTP GET vers le point de terminaison, en transmettant l’adresse en tant que paramètre.

La fonction addressToRequest transforme ensuite l’adresse dans un format compatible avec l’URL :

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

Si la demande d’API aboutit, la fonction successFunction est appelée. Elle reçoit la réponse de l’API en tant que paramètre :

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

La fonction createAddressDetailsObject traite ensuite la réponse. Si l’adresse n’est pas trouvée, un message d’erreur est renvoyé. Dans le cas contraire, la fonction crée l’objet Address Details :

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

Pour vérifier les données reçues, nous utilisons la fonction checkMissingData. Elle remplace les champs manquants par un tiret :

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

Nous collons ensuite les données à l’aide de la fonction pasteAddressDetails. Cette fonction utilise l’objet oWorksheet pour cibler la feuille active et sélectionner la plage appropriée :

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

S’il y a un message d’erreur, il est collé dans la plage :

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

Dans le cas contraire, les détails de l’adresse sont renseignés dans la plage à l’aide de la fonction SetValue :

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

La fonction incrémente ensuite la ligne et appelle récursivement makeRequest pour traiter l’adresse suivante :

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

Ensuite, nous invoquons la fonction reload. Elle déclenche un nouveau calcul de la feuille de calcul après le traitement de chaque adresse :

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

Le code macro complet est le suivant :

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

Exécutons la macro et voyons comment elle fonctionne !

Désormais, grâce à cette macro, vous pouvez automatiser votre routine et récupérer sans effort des informations détaillées sur les adresses. Nous espérons qu’elle vous permettra de gagner du temps et de minimiser la saisie manuelle des données. Ce n’est qu’un exemple parmi tant d’autres de ce que vous pouvez faire en mettant en œuvre les méthodes de notre API.

Nous vous encourageons à expérimenter et à créer vos propres macros. N’hésitez pas à nous poser des questions ou à nous faire part de vos idées. Nous sommes ouverts à la discussion et à la coopération. Nous vous souhaitons bonne chance dans vos explorations !