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