Sie wollen Ihre Airtable Bases zu SeaTable umziehen und scheuen den Aufwand? Keine Sorge! Auch Bases mit komplizierten Datenstrukturen und vielen tausend Datensätzen lassen sich mit geringem Aufwand in SeaTable übertragen.
Für den Transfer der Airtable Daten in SeaTable haben wir ein Migrationsskript entwickelt. Dieses überträgt alle Daten in einer Airtable Base – Tabellen, Spalten, Datensätze – in einem Rutsch in eine SeaTable Base. Nach der Migration können Sie in SeaTable mit den Daten weitermachen, die Sie in Airtable zuletzt verwendet haben. Nach Ausführung des Skripts sind nur einige Nacharbeiten notwendig.
Das Skript kann jeder – Techniker wie nicht-Techniker – verwenden. Aufgrund von Einschränkungen seitens der Airtable API ist das Vorgehen aber leider nicht hochautomatisiert möglich. Einige manuelle Angaben sind erforderlich, um das Skript betriebsbereit zu machen. In diesem Artikel erklären wir, wie Sie das machen.
Wie Sie eine Base von Airtable zu SeaTable migrieren
1. Base anlegen
Erstellen Sie in SeaTable eine neue Base. Der Name der SeaTable Base muss nicht dem Namen der zu importierenden Airtable Base entsprechen. Sie können den Namen frei wählen.
2. Skript einfügen
Öffnen Sie in der neuen Base die Skriptverwaltung durch einen Klick auf das Skript-Icon im Base-Header oben rechts. Wählen Sie dann Skript hinzufügen. Das Migrationsskript ist in der Programmiersprache Python geschrieben. Wählen Sie daher Python aus.
Markieren Sie nun den folgenden Codeblock, kopieren ihn in den Zwischenspeicher und fügen Sie ihn dann in das linke Fenster des Skripteditors ein:
## Parameterize the script # SeaTable - Destination server_url = 'https://cloud.seatable.io' api_token = '...' # Add the API token of the SeaTable base # See https://seatable.io/docs/en/seatable-api/erzeugen-eines-api-tokens/ # for more information on how to create a SeaTable API token # Airtable - Source airtable_personal_access_token = '...' # Add a Personal Access Token (PAT) # PATs are 82-character strings and begin with "pat" (e.g. 'pat544WlSOq6T4Fvv.5710af6611aedbf28493c38084163494e02b24f078cf2d62f07105982a82a64d') # See https://support.airtable.com/docs/creating-personal-access-tokens/ # for more information on how to create a PAT in Airtable airtable_base_id = '...' # Add the Base ID of the Airtable base # Base IDs are alphanumeric strings and begin with "app" (e.g. 'appRfA3qspH3EJUnV') # See https://support.airtable.com/docs/finding-airtable-ids/ # for more information on where to find the id of an Airtable base table_names = ['...', '...'] # Add the names of all tables in the Airtable base, i.e. ['table 1', 'table 2'] # The names must be enclosed in '' and comma-separated first_columns = [ ('...', '...'), ('...', '...'), ] # Specify the names of the first columns in every table of the Airtable base # Use the format ('table_name', 'first_column_name'), i.e. ('table 1', 'ID') # The table and column name must be enclosed in '' and comma-separated links = [ ] # Specify the links between the tables in the Airtable base # Use the format ('table_name', 'column_name', 'other_table_name'), i.e., ('table 1', 'link to table 2', 'table 2') # The table and column names must be enclosed in '' and comma-separated # If the Airtable base contains no link columns, just leave the brackets empty mode = 'import-header' # Specify the run-mode of the script, two options: 'import-header' and 'import-rows' # Run 'import-header' first to create the data structure in the SeaTable base # Run 'import-rows' to import all the rows ## No more edits required beyond this row import sys from seatable_api import Base, AirtableConvertor # from airtable_importer_settings import server_url, api_token, # airtable_api_key, airtable_base_id, table_names, first_columns, links def get_convertor(): base = Base(api_token, server_url) base.auth() convertor = AirtableConvertor( airtable_api_key=airtable_personal_access_token, airtable_base_id=airtable_base_id, base=base, table_names=table_names, first_columns=first_columns, links=links, ) return convertor def import_header(): convertor = get_convertor() convertor.convert_metadata() def import_rows(): convertor = get_convertor() convertor.convert_data() if mode == 'import-header': import_header() elif mode == 'import-rows': import_rows() else: print('The mode is not properly specified.') ## End script ##
Machen Sie sich keine Gedanken, wenn Sie den gerade kopierten Code nicht verstehen. Wir erläutern ihn. Ein wenig bei der Interpretation helfen sollten die Kommentare im Code. Kommentare sind alle Zeilen mit führendem Rautezeichen (‘#’). Diese Zeilen werden bei der Skriptausführung nicht beachtet, d.h. Sie können Kommentare verändern, löschen oder auch weitere hinzufügen, ohne die Funktionalität des Skripts zu beeinflussen.
Anders als die Kommentare sind die Einrückungen im Code bei der Ausführung des Skripts sehr wichtig. Verändern Sie diese bitte nicht.
3. SeaTable Server-URL und API-Token der Base angeben
Fügen Sie unter dem Kommentar SeaTable – Destination die SeaTable Server-URL ein und geben Sie den API-Token an. Wenn Sie SeaTable Cloud verwenden, dann ist die vorausgefüllte URL “https://cloud.seatable.io” richtig. Wenn Sie einen anderen SeaTable Server verwenden, dann tragen Sie dessen URL ein. (Die URL muss immer mit https:// bzw. http:// eingegeben werden.) URL und Token müssen von einfachen Anführungszeichen umschlossen sein.
Dies ist eine Beispielkonfiguration bei Verwendung von SeaTable Cloud:
4. Airtable Personal Access Token und Base ID eintragen
Ergänzen Sie unter dem Kommentar Airtable – Source den Airtable Personal Access Token (PAT) sowie die Airtable Base ID, beide Werte wieder jeweils in einfachen Anführungszeichen. Der PAT sollte über die Berechtigung data.records:read
verfügen.
So sollte es dann aussehen:
5. Tabellen- und Spaltennamen eintragen
Teilen Sie dem Skript nun mit, welche Tabellen Sie aus der Airtable Base importieren möchten. Tun Sie dies in der Zeile “table_names”. Ergänzen Sie in der eckigen Klammer die Namen der Tabellen – jeweils umschlossen von einem einfachen Anführungszeichen und getrennt durch Komma.
Für eine Base mit den zwei Tabellen “table 1” und “table 2” muss die Zeile dann beispielsweise so aussehen:
Wenn Ihre Airtable Base mehr als zwei Tabellen hat, verlängern Sie die Aufzählung in der Klammer einfach. Wenn Sie nicht alle Tabellen einer Base übertragen wollen, dann lassen Sie einfach die Namen derjenigen Tabellen weg, die Sie nicht kopiert werden sollen.
Aufgrund einer Einschränkung der Airtable API müssen Sie auch die Namen der ersten Spalten in den Tabellen angeben. Dies erfolgt in der Zeile “first_columns” bzw. den Folgezeilen.
Für die Airtable Base mit den zwei Tabellen “table 1” und “table 2” könnte es dann so aussehen:
6. Verknüpfungsspalten festlegen
Damit SeaTable die Daten richtig importieren kann, ist noch ein weiterer Schritt erforderlich: die Spezifikation der Verknüpfungsspalten in der Airtable Base.
Dafür ist die Variable “links” vorgesehen. Wenn beispielsweise die Spalte “link to table 2” in der Tabelle “table 1” eine Verknüpfung mit der Tabelle “table 2” abbildet, dann sollte das Skript wie folgt parametrisiert werden:
Jedes Linkspaltenpaar müssen Sie nur einmal angeben. Sie müssen die Verknüpfung nicht in beiden Richtungen spezifizieren.
Erhält die Airtable Base keine Verknüpfungsspalten, dann können Sie die eckige Klammer leer lassen:
7. Tabellen und Spalten importieren
Das Skript kann in zwei Modi ausgeführt werden: “import-header” und “import-rows”. Zunächst muss das Skript immer im Modus “import-header” ausgeführt werden. In diesem Modus werden die Tabellen und Spalten in der SeaTable Base angelegt und 10 Testzeilen importiert.
Der Ausführungsmodus wird in über die gleichnamigen Variable festgelegt:
Führen Sie das Skript jetzt mit einem Klick auf Skript ausführen aus. Während der Ausführung sehen Sie auf der rechten Seite im Editor die ausgeführten Schritte. Im Hintergrund sehen Sie auch, wie die Tabellen und Spalten angelegt werden.
8. Testzeilen überprüfen
Prüfen Sie nun, ob
- alle Tabellen und alle Spalten importiert wurden,
- in allen Tabellen die richtige erste Spalte angelegt wurde und
- die Verknüpfungsspalten korrekt sind.
Da die Spaltentypen von Airtable und SeaTable nicht vollständig kongruent sind, werden manchen Spaltentypen in der SeaTable Base von denen in der Airtable Base abweichen. Die folgende Tabelle stellt dar, wie die Spaltentypen in Airtable in SeaTable übertragen werden.
Airtable Spaltentyp | Import in SeaTable Spaltentyp |
---|---|
Attachment | Datei |
Autonumber | Zahl (Umwandlung in eine Autonummernspalte möglich) |
Barcode | Text oder Zahl |
Button | - (keine Migration möglich) |
Checkbox | Checkbox |
Count | Zahl |
Created time | Datum |
Currency | Zahl |
Date | Datum |
Duration | Zahl (Umwandlung in eine Spalte vom Typ Dauer möglich) |
Formula | Datum, Text oder Zahl |
Last modified by | Text |
Last modified time | Datum |
Link to another record | Verknüpfung zu anderen Einträgen |
Long text | Formatierter Text |
Lookup | Datum, Text oder Zahl |
Multiple select | Mehrfachauswahl (Keine Migration von nicht verwendeten Optionen) |
Number | Zahl |
Percent | Zahl |
Phone number | Text oder Zahl |
Rating | Zahl (Umwandlung in eine Spalte vom Typ Rating möglich) |
Rollup | Datum, Text oder Zahl |
Single line text | Text |
Single select | Text (Umwandlung in eine Einfachauswahlspalte möglich) |
User | Text |
URL | Text |
Wenn etwas nicht richtig ist, dann prüfen Sie die Eingaben in den Schritten 5. und 6. und führen Sie das Skript erneut im Modus “import-header” aus. Sie können das Skript beliebig häufig ausführen.
9. Alle Datensätze importieren
Wenn die Überprüfung in Schritt 8. zu Ihrer Zufriedenheit ist, dann können alle Datensätze übertragen werden.
Ändern Sie im Skript den Modus von “import-header” zu “import-rows”:
Führen Sie das Skript mit einem Klick auf Skript ausführen erneut aus. Wieder können Sie auf der rechten Seite die Ausführung des Skripts beobachten und im Hintergrund die Aktivitäten sehen.
Nun sollten Sie alle Datensätze aus der Airtable Base in der neuen SeaTable Base sehen. Gratulation, die Migration der Datensätze ist abgeschlossen!
Wenn Sie mit dem Endergebnis nicht zufrieden sind, dann löschen Sie alle Tabellen und starten erneut bei Schritt 7.
10. Migration abschließen
Das Migrationsskript hat alle Daten übertragen. Einige manuelle Nacharbeiten sind nun ggf. noch notwendig.
Das Migrationsskript übertragt Formelspalten nicht als Formelspalten, sondern legt Textspalten an und fügt in diesen die Formelergebnisse ein. D.h. Sie müssen nun noch Formelspalten manuell in der SeaTable Base ergänzen. Gleiches gilt für Spalten vom Typ Count, Lookup und Rollup. Button-Spalten werden gar nicht übertragen.
Da sich die Reihenfolgen der Spalten nicht über die Airtable API abrufen lässt, steht diese Information bei der Anlage der Spalten in SeaTable leider nicht zur Verfügung. Wenn Sie die ursprüngliche Reihenfolge wiederherstellen wollen, dann müssen Sie dies manuell erledigen.
Ansichten aus der Airtable Base werden nicht übertragen. Ansichten müssen Sie selbst anlegen. Das gleiche gilt für Automationen, Interfaces und Skripte.
FAQ-Bereich
Ändert das Skript Daten in meiner Airtable Base?
Nein. Das Skript liest ausschließlich Ihre Airtable Base aus. Die Daten in der Airtable Base werden nicht verändert.
Wie verhalte ich mich bei Fehlermeldungen?
Eine Fehlermeldung bei der ersten Ausführung ist gar nicht unwahrscheinlich. Gründe dafür gibt es genug, z.B. ein falscher Token, eine inkorrekte Reihenfolge bei der Spezifikation der Verlinkungen, Tippfehler, fehlende Kommas oder eine nicht korrekte Einrückung. Ein einzelner Fehler kann zu einem Abbruch der Skriptausführung führen.
Wenn Sie eine Fehlermeldung erhalten, dann ist dies grundsätzlich kein Problem. Daten können keine verloren gehen. Gehen Sie wie folgt vor, um die Ursache des Fehlers zu finden:
– Die Fehlermeldung gibt Ihnen in den meisten Fällen ein Hinweis, wo der Fehler zu finden ist. Folgen Sie diesem, korrigieren Sie die eingegebenen Parameter und führen Sie das Skript erneut aus. Ein Einrückungsfehler (englich “indentation”) beispielsweise verweist auf eine nicht der Python-Syntax entsprechende Einrückung hin.
– Ist die Fehlermeldung unverständlich, prüfen Sie alle Eingaben auf Korrektheit und versuchen Sie es nochmals.
– Wenn keiner der Tipps hilft, holen Sie sich Hilfe im SeaTable Forum.
Können Spalten in der Airtable Base übersehen werden?
Ja, das kann mit Spalten passieren, die nur wenige Einträge enthalten. Im Modus “import-header” überprüft das Skript die ersten 100 Zeilen der Airtable Base. Enthält eine Spalte in diesen Zeilen keinen Eintrag, dann gibt die Airtable API diese Spalte nicht zurück und die entsprechende Spalte wird in SeaTable nicht angelegt. Folglich wird Sie bei der Migration aller Datensätze auch nicht berücksichtigt.
Können Airtable Bases beliebiger Größe migriert werden?
Grundsätzlich ja. Die in diesem Artikel vorgestellten Vorgehensweise mit dem integrierten Python Editor unterliegt jedoch einer maximalen Laufzeitbeschränkung von 15 Minuten, d.h. Skripte, die länger als 15 Minuten laufen, werden abgebrochen. In der Praxis ist dies für die allermeisten Bases ausreichend. Bei Bases mit großen/vielen Dateianhängen kann dieses Limit jedoch eine Rolle spielen.
Kann man Tabellen in eine bestehende Base importieren?
Das Skript erfordert nicht, dass eine Base leer ist. Sie können das Skript also auch in einer Base mit bestehenden, gefüllten Tabellen ausführen. Das Einzige, was Sie vermeiden sollten, ist die Duplizierung von Tabellennamen.