Verwenden Sie das ONLYOFFICE-Makro, um detaillierte Adressinformationen zu erhalten und einzufügen

8 Juni 2023By Vlad

Oft ist die Arbeit mit schlecht eingegebenen Daten eine große Herausforderung. Aber was wäre, wenn es eine Möglichkeit gäbe, dies zu automatisieren? In diesem Artikel führen wir Sie durch die Erstellung eines Makros, das auf der Grundlage der grundlegenden Adressdaten detaillierte Adressinformationen abruft und diese in eine Tabellenkalkulation einfügt.

Use ONLYOFFICE macro to obtain and insert detailed address information

 

Über Geoapify Geokodierungs-API

Geoapify Geokodierungs-API ist ein leistungsstarkes Tool, mit dem Entwickler Geokodierungsfunktionen in ihre Anwendungen und Dienste integrieren können. Geokodierung ist der Prozess der Umwandlung von Adressen oder Ortsnamen in geografische Koordinaten.

Mit der Geoapify Geokodierungs-API können Sie detaillierte Daten über Adressen abrufen, einschließlich Straßennamen, Städtenamen, Postleitzahlen, Verwaltungsregionen und mehr. Und wir planen, diese Funktion zu nutzen und in unser Makro zu integrieren.

Konzept dieses Makros

  • Lesen Sie die Adresse aus der angegebenen Zelle.
  • Senden Sie eine Anfrage an die Geoapify Geokodierungs-API, um die Adressdetails abzurufen.
  • Verarbeiten Sie die Antwort und erstellen Sie das Objekt Address Details.
  • Fügen Sie die Adressdetails in die Tabellenkalkulation ein.
  • Lesen Sie die nächste Adresse und wiederholen Sie den Vorgang.

Erstellung eines Makros

Zunächst deklarieren wir Variablen:

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

Die Variable API_KEY enthält Ihren Geoapify-API-Schlüssel. Die Variable ENDPOINT speichert den API-Endpunkt für den Geokodierungsdienst. Die Variable oWorksheet zielt auf die aktive Tabellenkalkulation ab. Und die Variable row ermöglicht die Auswahl der gewünschten Zeile.

Dann fügen wir die Funktion makeRequest hinzu, die für das Senden einer Anfrage an die API zuständig ist:

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

Sie verwendet die Funktion $.ajax, um eine HTTP GET-Anforderung an den Endpunkt zu stellen und die Adresse als Parameter zu übergeben.

Anschließend wandelt die Funktion addressToRequest die Adresse in ein Format um, das mit der URL kompatibel ist:

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

Wenn die API-Anforderung erfolgreich ist, wird die successFunction aufgerufen. Sie erhält die Antwort von der API als Parameter:

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

Dann verarbeitet die Funktion createAddressDetailsObject die Antwort. Wenn die Adresse nicht gefunden wird, wird eine Fehlermeldung zurückgegeben. Andernfalls erstellt die Funktion die 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
    }

Um die empfangenen Daten zu überprüfen, verwenden wir die Funktion checkMissingData. Sie ersetzt die fehlenden Felder durch einen Bindestrich:

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

Dann fügen wir die Daten mit der Funktion pasteAddressDetails ein. Die Funktion verwendet das oWorksheet-Objekt, um das aktive Blatt anzuvisieren und den entsprechenden Bereich auszuwählen:

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

Wenn es eine Fehlermeldung gibt, wird sie in den Bereich eingefügt:

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

Andernfalls werden die Adressdaten mit der Funktion SetValue in den Bereich eingefügt:

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

Die Funktion inkrementiert dann die Zeile und ruft rekursiv makeRequest auf, um die nächste Adresse zu verarbeiten:

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

Danach rufen wir die Funktion reload auf. Sie löst eine Neuberechnung der Tabellenkalkulation aus, nachdem jede Adresse verarbeitet wurde:

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

Der gesamte Makrocode lautet wie folgt:

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

Führen wir das Makro aus und sehen wir, wie es funktioniert!

Mit diesem Makro können Sie nun Ihre Routine automatisieren und mühelos detaillierte Adressinformationen abrufen. Wir hoffen, dass Sie damit Zeit sparen und die manuelle Dateneingabe minimieren können. Dies ist nur eines von vielen Beispielen dafür, was Sie durch die Implementierung unserer API-Methoden erreichen können.

Wir möchten Sie ermutigen, zu experimentieren und Ihre eigenen Makros zu erstellen. Stellen Sie uns Ihre Fragen oder teilen Sie uns Ihre Ideen mit. Wir sind offen für Diskussionen und Zusammenarbeit. Viel Glück bei Ihren Versuchen!