Access und Notion synchronisieren

Tabelle in Notion

Bild 1: Tabelle in Notion

In weiteren Beiträgen haben wir uns angesehen, wie wir Daten aus Notion abfragen und neu anlegen können. Spannend wird es, wenn wir diese Techniken nutzen, um Daten aus anderen Anwendungen mit Notion zu synchronisieren. Im vorliegenden Beitrag wollen wir uns daher zuerst einmal ansehen, wie wir die Daten aus einer Access-Tabelle in eine Notion-Tabelle übertragen können. Dabei wollen wir die ID, unter welcher die Tabelle in Notion angelegt wurde, auslesen und in der Access-Tabelle speichern, damit wir wissen, welche Datensätze bereits nach Notion übertragen wurden. Gleichzeitig können wir Änderungen an diesen Datensätzen in der Access-Datenbank dann in die Notion-Tabelle übertragen.

Als Beispiel verwenden wir die Tabelle Artikeldatenbank, die wir wie in Bild 1 angelegt haben. Wie Sie diese Tabelle anlegen, erfahren Sie im Beitrag Produktivität mit Notion steigern (www.access-im-unternehmen.de/1402). Hier finden Sie auch wichtige Informationen, auf denen der vorliegende Beitrag aufbaut.

Tabelle in Notion

Bild 1: Tabelle in Notion

Datenquelle in der Access-Datenbank

In der Access-Datenbank legen wir zwei Tabellen an. Die erste Tabelle hat den Namen tblArtikel und enthält die Felder aus Bild 2. Das Primärschlüsselfeld ArtikelID dient der eindeutigen Identifizierung der Datensätze in der Access-Tabelle.

Tabelle mit Artikeldaten in Access

Bild 2: Tabelle mit Artikeldaten in Access

Die Felder Artikelname und Veroeffentlichungsdatum sollen so in die Notion-Datenbank übernommen werden. Das Feld StatusID ist ein Nachschlagefeld zur Auswahl von Datensätzen aus einer weiteren Tabelle namens tblStatus.

Diese stellt die Daten aus Bild 3 zur Auswahl im Nachschlagefeld bereit.

Tabelle mit den verschiedenen Status-Werten

Bild 3: Tabelle mit den verschiedenen Status-Werten

Damit wir direkt auf die Daten der Felder Artikelname, Veroeffentlichungsdatum und Status der beiden Tabellen zugreifen können, erstellen wir noch eine Abfrage namens qryArtikelMitStatus. Diese enthält die beiden Tabellen tblArtikel und tblStatus als Datenquelle und zeigt die Felder ArtikelID, Artikelname, Veroeffentlichungsdatum, Status und NotionID an (siehe Bild 4).

Abfrage mit den Feldern aus den Tabellen tblArtikel und tblStatus

Bild 4: Abfrage mit den Feldern aus den Tabellen tblArtikel und tblStatus

Die Daten dieser Abfrage, die wir in der nachfolgend beschriebenen Prozedur nach Notion exportieren wollen, sehen in der Datenblattansicht der Abfrage wie in Bild 5 aus.

Ergebnis der Abfrage mit den Feldern aus den Tabellen tblArtikel und tblStatus

Bild 5: Ergebnis der Abfrage mit den Feldern aus den Tabellen tblArtikel und tblStatus

Prozedur zum Übertragen der Daten nach Notion

Damit steigen wir gleich in die Prozedur ein, welche die Daten aus den Tabellen unserer Access-Datenbank in die Notion-Datenbank exportieren soll.

Zur Erinnerung nochmal die Strukturierung in Notion, wo ein Benutzer üblicherweise einen eigenen Workspace verwendet, der eine oder mehrere Datenbanken enthält. Eine Datenbank ist dabei aber eher mit einer Access-Tabelle gleichzusetzen – sie enthält verschiedene Eigenschaften, sogenannte Properties, mit denen die enthaltenen Elemente beschrieben werden. Diese nennen wir Pages. Eine Page in einer Notion-Datenbank entspricht also in etwa einem Datensatz in einer Access-Tabelle.

Bevor wir uns die Prozedur im Detail ansehen, wollen wir noch kurz skizzieren, was darin passieren soll: Wir wollen dort zunächst alle Datensätze der Access-Abfrage qryArtikelMitStatus ermitteln, die im Feld NotionID den Wert NULL enthalten. Der Sinn dahinter ist, dass wir nach dem Hinzufügen der Daten eines Datensatzes der Access-Tabelle in die Notion-Datenbank die ID des in Notion angelegten Page-Elements ermitteln und diese für den zugrundeliegenden Datensatz der Tabelle tblArtikel in das Feld NotionID einfügen wollen. So können wir später immer erkennen, ob dieser Datensatz bereits nach Notion exportiert wurde. Und wenn wir die Daten gegebenenfalls einmal in der Access-Datenbank aktualisieren, können wir diese aktualisierten Datensätze in einer weiteren Prozedur im entsprechenden Datensatz der Notion-Datenbank aktualisieren.

Die Prozedur ArtikelInNotionAnlegen

Diese Prozedur beginnt in Listing 1. Hier deklarieren wir zunächst die benötigten Variablen, zum Beispiel eine namens db zum Speichern eines Verweises auf das aktuelle Database-Objekt und eine namens rst für das Recordset, in dem wir die zu übertragenden Datensätze durchlaufen wollen. Außerdem benötigen wir ein Dictionary, in das wir die Antwort der Notion-API einlesen können, um das Ergebnis auszuwerten. Außerdem benötigen wir diverse String-Variablen.

Public Sub ArtikelInNotionAnlegen()
     Dim db As DAO.Database
     Dim rst As DAO.Recordset
     Dim objJSON As Dictionary
     Dim strResponse As String
     Dim strDatabaseID As String
     Dim strBody As String
     Dim strPageID As String
     Set db = CurrentDb
     Set rst = db.OpenRecordset("SELECT * FROM qryArtikelMitStatus WHERE NotionID IS NULL", dbOpenDynaset)
     strDatabaseID = DLookup("DatabaseID", "tblDatabases", "DatabaseTitle = ''Artikeldatenbank''")
     Do While Not rst.EOF
         strBody = "{" & vbCrLf
         strBody = strBody & "  ""object"": ""page""," & vbCrLf
         strBody = strBody & "  ""parent"": {" & vbCrLf
         strBody = strBody & "    ""type"": ""database_id""," & vbCrLf
         strBody = strBody & "    ""database_id"": """ & strDatabaseID & """" & vbCrLf
         strBody = strBody & "  }," & vbCrLf
         strBody = strBody & "  ""properties"": {" & vbCrLf
         strBody = strBody & "    ""Artikelname"": {" & vbCrLf
         strBody = strBody & "      ""title"": [" & vbCrLf
         strBody = strBody & "        {" & vbCrLf
         strBody = strBody & "          ""type"": ""text""," & vbCrLf
         strBody = strBody & "          ""text"": { ""content"": """ & rst!Artikelname & """ }" & vbCrLf
         strBody = strBody & "        }" & vbCrLf
         strBody = strBody & "      ]" & vbCrLf
         strBody = strBody & "    }," & vbCrLf
         strBody = strBody & "    ""Status"": {" & vbCrLf
         strBody = strBody & "      ""id"": ""adPI""," & vbCrLf
         strBody = strBody & "      ""type"": ""select""," & vbCrLf
         strBody = strBody & "      ""select"": {" & vbCrLf
         strBody = strBody & "        ""name"": """ & rst!status & """" & vbCrLf
         strBody = strBody & "        }" & vbCrLf
         ...

Listing 1: Artikel nach Notion übertragen, Teil 1

[

Nach dem Initialisieren der Variablen db mit einem Verweis auf das aktuelle Database-Objekt referenzieren wir mit der Variablen rst alle Datensätze der Abfrage qryArtikelMitStatus, bei denen das Feld NotionID noch den Wert Null enthält. Das zeigt uns, dass die entsprechenden Datensätze noch nicht nach Notion exportiert wurden.

Nachdem wir die ID der Notion-Datenbank, der wir die Artikeldatensätze hinzufügen wollen, aus der Tabelle tblDatabases ermittelt haben, kann es losgehen – wie wir diese ermitteln, lesen Sie im Beitrag Mit Access auf Notion zugreifen (www.access-im-unternehmen.de/1401). Also beginnen wir mit dem Durchlaufen der Datensätze des Recordsets.

Innerhalb der dazu definierten Do While-Schleife stellen wir ein JSON-Dokument zusammen, das alle Informationen über das anzulegende Page-Element enthält und das wir anschließend als Parameter der GetJSON-Funktion an die Notion-API übergeben (siehe Listing 2). Die GetJSON-Funktion beschreiben wir im Beitrag JSON-Daten auslesen (www.access-im-unternehmen.de/1403).

...
         If IsNull(rst!Veroeffentlichungsdatum) Then
             strBody = strBody & "      }" & vbCrLf
         Else
             strBody = strBody & "      }," & vbCrLf
             strBody = strBody & "    ""Veröffentlichungsdatum"": {" & vbCrLf
             strBody = strBody & "      ""id"": ""Eqsc""," & vbCrLf
             strBody = strBody & "      ""type"": ""date""," & vbCrLf
             strBody = strBody & "      ""date"": {" & vbCrLf
             strBody = strBody & "        ""start"": """ & Format(rst!Veroeffentlichungsdatum, "yyyy-mm-dd") & """," _
                 & vbCrLf
             strBody = strBody & "        ""end"": null," & vbCrLf
             strBody = strBody & "        ""time_zone"": null" & vbCrLf
             strBody = strBody & "      }" & vbCrLf
             strBody = strBody & "    }" & vbCrLf
         End If
         strBody = strBody & "  }" & vbCrLf
         strBody = strBody & "}" & vbCrLf
         Inzwischenablage strBody
         If GetJSON(cStrCreatePage, "POST", strResponse, strBody) = True Then
             Set objJSON = ParseJson(strResponse)
             strPageID = objJSON.Item("id")
             rst.Edit
             rst!NotionID = strPageID
             rst.Update
         Else
             Debug.Print strResponse
         End If
         rst.MoveNext
     Loop
End Sub

Listing 2: Artikel nach Notion übertragen, Teil 2

Sie verwendet diesmal die in der Konstanten cStrCreatePage enthaltene URL für den Aufruf:

Const cStrCreatePage As String = "https://api.notion.com/v1/pages"

Der beispielhafte Code für einen JSON-Datensatz, den wir hier zusammenstellen, ist in Listing 3 zu finden.

{
   "object": "page",
   "parent": {
     "type": "database_id",
     "database_id": "d303bedf-ca40-42ad-8474-86f41e1b5bc6"
   },
   "properties": {
     "Artikelname": {
       "title": [
         {
           "type": "text",
           "text": { "content": "Prüfen, ob Datenbank geöffnet ist" }
         }
       ]
     },
     "Status": {
       "id": "adPI",
       "type": "select",
       "select": {
         "name": "Veröffentlicht"
         }
       },
     "Veröffentlichungsdatum": {
       "id": "Eqsc",
       "type": "date",
       "date": {
         "start": "2022-09-01",
         "end": null,
         "time_zone": null
       }
     }
   }
}

Listing 3: JSON-Code, den wir zum Anlegen eines Datensatzes an Notion schicken

Nachdem wir diesen zusammengestellt und per GetJSON-Aufruf an Notion gesendet haben, ermitteln wir noch die ID der neuen Page.

Dazu lesen wir das in der Variablen strResponse gespeicherte Ergebnis der Anfrage per API in die Dictionary-Variable objJSON ein. Dazu nutzen wir die Funktion ParseJson, die wir ebenfalls im oben genannten Beitrag beschreiben.

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar