Mit Access auf Notion zugreifen

Notion ist die Produktivitätsapp der Stunde, wenn es um Verwaltung von Listen, Projekten, Teams und vieles mehr geht. Eigentlich sind die Möglichkeiten nur durch die Phantasie begrenzt. Logisch, dass wir uns ansehen wollen, ob man die Daten, die man in Notion angelegt hat, auch von Access aus einlesen kann oder ob man sogar Daten von Access aus nach Notion verschieben kann.

In einem weiteren Beitrag namens Produktivität mit Notion steigern (www.access-im-unternehmen.de/1402) zeigen wir die Grundlagen der App Notion. Im vorliegenden Beitrag schauen wir uns an, wie wir die dort angelegten Daten von einer Access-Anwendung aus auslesen und sogar schreiben können. Damit erleichtern wir uns einige Arbeiten, zum Beispiel das Anlegen größerer Mengen von Terminen, das Eintragen von Daten aus den Tabellen einer Datenbank et cetera.

Wir gehen davon aus, dass Sie einen Notion-Account angelegt haben. Mit diesem ist auch die Möglichkeit verbunden, sogenannte Integrations anzulegen. Dazu wechseln wir zur folgenden Webseite:

https://developers.notion.com

Dort finden wir oben links einen Link mit dem Text View my integrations (siehe Bild 1).

Von der Startseite des Entwicklerbereichs geht es gleich weiter zu den Integrationen.

Bild 1: Von der Startseite des Entwicklerbereichs geht es gleich weiter zu den Integrationen.

Klicken wir diesen an, landen wir direkt auf der Seite My integrations, wo wir mit einem Klick auf die Schaltfläche Create new integration eine neue Integration anlegen können (siehe Bild 2).

Anlegen einer neuen Integration

Bild 2: Anlegen einer neuen Integration

Neue Notion-Integration anlegen

Auf der folgenden Seite fragt Notion einige Informationen über die anzulegende Integration ab. Dazu gehören der Name, ein Logo, ein assoziierter Workspace und die Rechte, die der Integration erteilt werden sollen.

Wir legen die Daten wie in Bild 3 fest. Wenn Sie gerade einen neuen Notion-Account angelegt haben, ist die Zusammenstellung der Daten recht einfach – das Feld Associated Workspace bietet dann nur einen einzigen Eintrag an.

Festlegen der Eigenschaften der Integration

Bild 3: Festlegen der Eigenschaften der Integration

Nach dem Klick auf die Schaltfläche Submit erscheint eine weitere Seite, auf der wir eine wichtige Information vorfinden: den Internal Integration Token. Das ist unsere Eintrittskarte für den VBA-gesteuerten Zugriff auf unsere Notion-Daten (siehe Bild 4). Diesen Token können wir direkt einmal in die Zwischenablage kopieren, wir werden diesen gleich benötigen. Auf dieser Seite behalten wir die Option Internal integration bei, da wir davon ausgehen, dass wir erst einmal nur eine Integration für den Eigengebrauch anlegen wollen. Außerdem fasst die Seite nochmals die zuvor festgelegten Einstellungen zusammen.

Wichtige Information nach dem Anlegen der Integration

Bild 4: Wichtige Information nach dem Anlegen der Integration

Damit sind die Arbeiten auf der Seite von Notion bereits abgeschlossen – wir benötigen hier nur den Token, um diesen als Schlüssel für den Zugriff auf die Daten in unserem Notion-Workspace zu verwenden.

Zur Sicherheit schauen wir noch unter My integrations nach und finden dort die neu angelegte Integration vor (siehe Bild 5).

Die neu angelegte Integration

Bild 5: Die neu angelegte Integration

Elemente für die Integration mit VBA freigeben

Bevor wir per VBA auf Datenbanken, Seiten et cetera in Notion zugreifen können, müssen wir diese freigeben beziehungsweise mit unserer Integration teilen. Das gelingt jedoch mit wenigen Schritten.

In meinem Notion-Workspace habe ich eine Datenbank namens Artikelübersicht erstellt, mit der ich meine Artikel verwalten möchte – siehe Produktivität mit Notion steigern (www.access-im-unternehmen.de/1402). Wenn ich diese über den Eintrag in der Seitenleiste aktiviere (entweder in der App oder im Browser), erscheint die entsprechende Datenbank im Hauptbereich.

Nun klicken wir rechts oben auf die drei Punkte, was ein Kontextmenü öffnet. Hier finden wir unten den Eintrag Connections|Add connections.

Klicken wir diesen an, sollten wir bereits den Namen unserer Integration in der Liste vorfinden (siehe Bild 6).

Anlegen einer Verbindung zu einer Notion-Datenbank

Bild 6: Anlegen einer Verbindung zu einer Notion-Datenbank

Danach erscheint eine Meldung, die wir mit Confirm bestätigen (siehe Bild 7).

Bestätigen der Freigabe für die Integration

Bild 7: Bestätigen der Freigabe für die Integration

Ab dann finden wir im soeben geöffneten Kontextmenü unter Connections einen neuen Eintrag mit dem Namen unserer Integration. Diese Verbindung können Sie über den einzigen Befehl des Untermenüs dieses Eintrags wieder trennen.

Jede Datenbank einzelnen freigeben

Falls Sie im Laufe der Zeit weitere Datenbanken zu Notion hinzufügen, tauchen diese nicht automatisch auf, wenn Sie, wie nachfolgend beschrieben, die Datenbanken ihres Workspaces auslesen.

Sie müssen jede Datenbank, auf die Ihre Integration zugreifen können soll, einzeln wie oben beschreiben freigeben.

API-Befehle herausfinden

Die Notion-API enthält eine ganze Reihe Befehle, mit denen die meisten der Aktionen durchgeführt werden können, die Sie sonst über die Benutzeroberfläche erledigen würden.

Eine Übersicht der API finden Sie unter dem folgenden Link:

https://developers.notion.com/reference/intro

Hier gibt es beispielsweise die folgenden API-Befehle:

  • search: Mit diesem Befehl, angehängt an die URL https://api.notion.com/v1/, lesen Sie, wenn ohne Parameter verwendet, alle database– oder page-Elemente ein, die für die Integration freigegeben wurden. Das enthält also auch die page-Elemente, die innerhalb eines database-Elements angelegt wurden. Übergeben wir zusätzlich weitere Elemente wie beispielsweise das query-Element per Header, können wir auch database– oder page-Elemente nach dem Titel ermitteln – ein Beispiel finden Sie weiter unten.
  • databases: Hängen wir den Befehl databases an die URL https://api.notion.com/v1/ an, müssen wir noch die ID der Datenbank folgen lassen. Diese ID erhalten wir beispielsweise über den obigen search-Befehl. Außerdem folgt noch /query, sodass die URL beispielsweise https://api.notion.com/v1/databases/d303bedf-ca40-42ad-8474-86f41e1b5bc6/query lautet. Auch hier kann man per Header noch Filterausdrücke übergeben, mit denen nur den Kriterien entsprechende page-Elemente ermittelt werden.
  • pages: Ebenso wie auf database-Elemente können wir auch auf page-Elemente zugreifen. Dazu müssen wir zuvor die ID der jeweiligen Seite ermittelt haben, was wir beispielsweise mit dem obigen databases-Befehl erreichen.

Funktion zum Ausführen einer Anfrage an die Notion-API

Wir definieren als Nächstes eine allgemeine Funktion für das Absenden einer HTTP-Anfrage an die Notion-API (siehe Listing 1). Diese erwartet die folgenden Parameter:

Public Function HTTPRequest(strURL As String, strAuthorization As String, Optional strMethod As String = "POST", _
         Optional strContentType As String = "application/json", Optional strVersion As String = "2022-06-28", _
         Optional strData As String, Optional strResponse As String) As Integer
     Dim objHTTP As ServerXMLHTTP60
     Set objHTTP = New MSXML2.ServerXMLHTTP60
     With objHTTP
         .Open strMethod, strURL, False
         .setRequestHeader "Accept", strContentType
         .setRequestHeader "Content-Type", strContentType
         .setRequestHeader "Authorization", strAuthorization
         .setRequestHeader "Notion-Version", strVersion
         .send strData
         strResponse = .responseText
         HTTPRequest = .status
     End With
End Function

Listing 1: Prozedur zum Ausführen von HTTP-Anfragen

  • strURL: Aufzurufender API-Endpoint, beispielsweise https://api.notion.com/v1/search
  • strMethod: Optionaler Parameter für die Methode des Aufrufs, also POST (Standard), GET, PUT oder DELETE.
  • strAuthorization: Parameter zum Übergeben des Ausdrucks aus Bearer und Token
  • strContentType: Optionaler Parameter zur Übergabe des Inhaltstyps, standardmäßig application/json.
  • strVersion: Optionaler Parameter zur Übergabe der zu verwendenden API-Version, standardmäßig 2022-06-28.
  • strData: Optionaler Parameter zur Übergabe zusätzlicher Daten, in diesem Fall im JSON-Format
  • strResponse: Optionaler Parameter zum Zurückgeben des Ergebnisses des API-Aufrufs

Bevor wir in die Beschreibung der Funktion einsteigen, fügen wir noch einen Verweis auf die Bibliothek Microsoft XML, v6.0 zum Projekt hinzu. Das erledigen wir im Verweise-Dialog des VBA-Editors, den wir mit dem Menübefehl Extras|Verweise öffnen (siehe Bild 8).

Notwendiger Verweis auf die Bibliothek Microsoft XML, v6.0

Bild 8: Notwendiger Verweis auf die Bibliothek Microsoft XML, v6.0

Die Prozedur erstellt ein neues Objekt des Typs ServerXMLHTTP60 und ruft dessen Open-Methode auf, um die Methode (POST) und die URL der API zu übergeben.

Der dritte Parameter gibt mit dem Wert False an, dass der Aufruf nicht asynchron gestartet werden soll.

Danach weist die Funktion einige Header hinzu. Accept und Content-Type erhalten den Wert aus strContentType, also standardmäßig application/json. Den Header Authorization füllen wir mit dem Wert des Parameters strAuthorization. Schließlich weisen wir Notion-Version den Wert aus strVersion, typischerweise 2022-06-28, zu.

Mit der send-Methode schicken wir noch den Inhalt von strData. strData nutzen wir, wenn wir zusätzliche Daten zu den mit der URL gesendeten Daten übergeben müssen.

Wenn wir nur Informationen zu verschiedenen Elementen von Notion abrufen wollen wie zu einem database– oder page-Objekt, brauchen wir nur eine ID per Parameter zu übergeben. Wenn wir jedoch neue database– oder page-Objekte hinzufügen wollen, dann müssen wir die Eigenschaften dieser Objekte übergeben.

Diese stellen wir wiederum in einem JSON-Dokument zusammen und übergeben dieses mit dem Parameter strData. Die send-Methode startet auch den eigentlichen Aufruf der API-Funktion von Notion. Das Ergebnis finden wir anschließend in verschiedenen Eigenschaften. status liefert einen Zahlenwert wie beispielsweise 200 für einen erfolgreichen Aufruf.

Diesen Wert gibt die Funktion als Ergebnis zurück. Das eigentliche Ergebnis, also beispielsweise Informationen über die Notion-Datenbanken, liefert die Eigenschaft responseText, deren Wert wir mit dem Parameter strResponse an die aufrufende Instanz zurückschicken.

Konstanten definieren

Im Kopf des Moduls mdlNotion speichern wir einige Werte in Konstanten. Diese sehen wie folgt aus:

Const cStrURLSearch As String =  "https://api.notion.com/v1/search"
Const cStrNotionKey As String =  "secret_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Const cStrContentType As String = "application/json"
Const cStrVersion As String = "2022-06-28"

Alle Datenbanken abfragen

Unser erster Aufruf der Funktion HTTPRequest soll alle Datenbanken abfragen, die wir in unserem Notion-Workspace angelegt haben. Bevor wir die notwendige Funktion zum Einlesen der Datenbanken per JSON beschreiben, schauen wir uns die Prozedur an, mit der wir einen Test der Funktion starten.

Diese ruft die Funktion GetJSON auf und übergibt dieser den zu verwendenden Link (aus cStrURLSearch), die Art des Zugriffs (hier POST) sowie eine leere String-Variable, die mit dem JSON-Dokument gefüllt werden soll. Wenn die Funktion den Wert True zurückliefert, enthält die Variable strResponse das JSON-Dokument mit den gewünschten Daten. Falls nicht, enthält es die entsprechende Fehlermeldung:

Public Sub Test_SEARCH()
     Dim strResponse As String
     If GetJSON(cStrURLSearch, "POST", strResponse) = True Then
         Debug.Print strResponse
         ShowJSONDOM strResponse, True
     Else
         Debug.Print strResponse
     End If
End Sub

Die hier aufgerufene Prozedur GetJSON finden Sie in Listing 2. Sie nimmt die zu verwendende URL entgegen sowie die zu füllende Variable strResponse. Als Methode verwenden wir POST, den Wert für den Authentifizierungs-Header stellen wir mit der Zeichenkette Bearer plus einem Leerzeichen plus dem in der Konstanten cStrNotionKey gespeicherten Token zusammen.

Public Function GetJSON(strUrlSearch As String, strMethod As String, strResponse As String) As Boolean
     Dim strData As String
     Dim strAuthorization As String
     Dim intStatus As Integer
     strAuthorization = "Bearer " & cStrNotionKey
     intStatus = HTTPRequest(strUrlSearch, strAuthorization, strMethod, cStrContentType, cStrVersion, strData, strResponse)
     Select Case intStatus
         Case 200
             GetJSON = True
         Case Else
             GetJSON = False
     End Select
End Function

Listing 2: Funktion zum Einlesen eines JSON-Dokuments

Dann rufen wir die bereits oben beschriebene Funktion HTTPRequest auf und übergeben dieser die benötigten Daten per Parameter.

Den Rückgabewert speichern wir in der Variablen intStatus. Ist dieser Wert 200, war die Abfrage erfolgreich und wir können den Wert von strResponse im Direktbereich ausgeben.

Auswertung des JSON-Dokument mit den Datenbanken

Die Struktur eines JSON-Dokuments ist auf den ersten Blick normalerweise nicht gut zu erkennen, zumindest nicht, wenn diese keine Zeilenumbrüche und Einrückungen enthält. Und selbst dann ist es noch schwierig, auf diese Elemente zuzugreifen.

Zu diesem Zweck haben wir die im Beitrag JSON-Daten auslesen (www.access-im-unternehmen.de/1403) beschriebene Funktion ShowJSONDOM programmiert.

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