Guten Tag an alle! Ich denke, dieser Artikel wird für alle interessant sein, die Notion verwenden, aber aus irgendeinem Grund nicht vollständig darauf zugreifen können.
Vorgeschichte
Ich entwickle
mein Projekt . Auf der Zielseite wird nach Eingabe der E-Mail ein Link zu einer auf Google Forms basierenden sozialen Umfrage ausgegeben. Die Antworten werden auf dem Typenschild in Google Drive aufgezeichnet.
Das Problem ist, dass alles, was ich
bei mir habe , in Notion bleibt. Es ist kitschiger bequemer. Wird durch Kopieren und Einfügen behandelt, während es nur wenige Bewertungen gab. Dann gab es mehr von ihnen - und es war notwendig, sich etwas auszudenken. Wen interessiert es, was passiert ist - willkommen bei Katze.
Das Problem
Google Forms zeichnet Antworten nur auf dem Typenschild auf - das heißt, es gibt hier kein anderes Rezept. Daher hatte ich einen Plan: Lassen Sie uns über IFTTT nach Updates der Tablets suchen, neue Daten an den Webhook senden, sie irgendwie verarbeiten und in Notion hochladen.
Für diejenigen, die mit IFTTT nicht vertraut sind: Dies ist ein Dienst, mit dem Sie Aktionsketten erstellen können. Sagen Sie: "Die Post kam in Telegrammen" - "Wir exportieren sie auf VKontakte".
Der Plan begann zu scheitern: Notion hat keine offizielle API. Aber jemand hat es umgekehrt und
eine inoffizielle API erstellt .
Der endgültige Plan war folgender:- Wir machen das Applet in IFTTT: „Dem Tablet wurde eine Zeile hinzugefügt - senden Sie sie an den Server
- Wir machen direkt den Server, der Daten empfängt und an Notion sendet
Das zweite Problem trat auf, als sich herausstellte, dass IFTTT die Integration mit Google Sheets unterbrochen hatte und das Applet daher nicht funktionierte.

Deshalb musste ich den Plan ändern: Wir pumpen das CSV'shku mit Google Sheets aus, analysieren es auf dem Server und werfen alles Neue in Notion. IFTTT wird als Auslöser für den gesamten Prozess verwendet.
Teil 1. CSV mit Google Sheets
Dieser Teil ist vielleicht der einfachste. Wir öffnen die Tabelle zum Anzeigen (damit Sie sich nicht mit Cookies beschäftigen müssen). Nehmen Sie als Nächstes den Link zum Kopieren von CSV und kopieren Sie ihn. Drücken Sie dazu einfach Strg auf der Tastatur und geben Sie Strg + Umschalt + J ein (dh öffnen Sie die Entwicklerkonsole), und wechseln Sie zur Registerkarte Netzwerk. Klicken Sie dann auf Datei - Download - CSV. Wir sehen die Anfrage und kopieren den Link.
Teil 2. Schreiben eines Servers
Da wir eine Python-Bibliothek haben, werden wir in Django schreiben.
Nun ein wenig über die Struktur speziell meines Tisches. Eine Tabelle in Notion enthält im Gegensatz zu einer Tabelle in Google Sheets eine Spalte "Referenz". Dies ist ein Link zu einer anderen Tabelle (in meinem Fall eine Beschreibung der Funktionen, die den Benutzern gefallen haben). Der Rest ist im Allgemeinen klar: nur Spalten mit nur Daten.
Wir gehen zu Notion, wir sind bereits mit Strg + Umschalt + J vertraut. Öffnen Sie die Konsole, gehen Sie zu Anwendung - Cookies, kopieren Sie token_v2 und nennen Sie es TOKEN. Dann gehen wir zu der Seite, die wir mit der Platte benötigen, und kopieren den Link dazu. Rufen Sie NOTION an. Wenn Sie auch über Relation verfügen, rufen Sie die Seite mit Relation auf, kopieren Sie den Link und rufen Sie beispielsweise NOTION_FUNCTIONS auf
Schreiben Sie als Nächstes den folgenden Code (Begriff vor dem Import):
def index(request): if request.method == "POST": client = NotionClient(token_v2=TOKEN) database = client.get_collection_view(NOTION) current_rows = database.default_query().execute() database_functions = client.get_collection_view(NOTION_FUNCTIONS) current_rows_functions = database_functions.default_query().execute()
Darin verbinden wir NotionClient, wir sagen „Datenbanken? Geben Sie zwei! “Und wir erhalten direkt die Daten von diesen beiden Platten (standardmäßig angefordert, aber es ist möglich zu sortieren, für weitere Details siehe die Dokumentation für die Bibliothek).
Dann müssen wir Folgendes tun: Fordern Sie eine CSV bei Google an und analysieren Sie sie. Wir werden es pandas'om tun.
result = requests.get(SHEET).content pandas_result = pd.read_csv(io.StringIO(result.decode('utf-8'))) timestamps = pandas_result[[" "]].values ages = pandas_result[[" "]].values sexes = pandas_result[[" "]].values cities = pandas_result[[" "]].values socials = pandas_result[[" ( )"]].values agreements = pandas_result[[" , - ."]].values control_usages = pandas_result[[" "]].values health_usages = pandas_result[[" "]].values prices = pandas_result[[" . :)"]].values mentions = pandas_result[[", , "]].values
Dann müssen wir alle Daten von dieser Platte durchgehen und prüfen, ob sie zu Notion hinzugefügt wurden oder noch nicht. Dazu haben wir Daten von den Platten angefordert.
def checkTimestamp(rows, timestamp): for i in range(0, len(rows)): row = rows[i] if row.name == timestamp: return True return False
Unabhängig davon ist es erwähnenswert, über "row.name" zu sprechen, da ein aufmerksamer Leser wahrscheinlich fragen wird: Was ist das?
Dies ist der Name der Spalte in Notion (in der die Aufnahmezeiten gespeichert sind). Ich habe es irgendwie nicht geschafft, russische Namen hinzuzufügen, also habe ich alle Namen in Englisch geändert und hinzugefügt.

Und jetzt der Code zum Überprüfen der Daten und Hinzufügen einer Zeile zum Notion-Label:
for i in range(0, len(timestamps)): if not checkTimestamp(current_rows, timestamps[i]): row = database.collection.add_row() health_usage = health_usages[i][0] control_usage = control_usages[i][0] ticks = health_usage + "," + control_usage row.title = timestamps[i][0] row.age = ages[i][0] row.sex = sexes[i][0] row.social_network = checkEmptiness(socials[i][0]) row.can_we_write_you = checkEmptiness(agreements[i][0]) row.city = checkEmptiness(cities[i][0]) row.controlling_examples = checkEmptiness(control_usages[i][0]) row.health_examples = checkEmptiness(health_usages[i][0]) row.cost = checkEmptiness(prices[i][0]) row.noticements = checkEmptiness(mentions[i][0]) row.castdev_relation = findIds(current_rows_functions, ticks)
checkEmptiness ist eine Funktion, die prüft, ob ein Nullelement an sie übergeben wurde. Der Begriff funktionierte irgendwie widerwillig, als ich ihm null Felder fütterte, also lohnt es sich zu schreiben.
Kommen wir nun zur Analyse der Beziehungen, da ich in der offiziellen Dokumentation nichts davon gesehen habe. Um eine Verknüpfung zu einer Zeile aus einer anderen Datenbank herzustellen, müssen Sie diese (dieser Zeile) übernehmen und übertragen. Wenn ein Array von Links zu Zeichenfolgen von einer anderen Platte impliziert ist, müssen Sie dementsprechend ein Array ihrer Bezeichner verwenden. Ich persönlich habe Beziehungen nach Funktionsnamen hinzugefügt.
def findIds(current_rows, titles): print("titles", titles) print("current rows", current_rows) array = [] for a in range(0, len(current_rows)): if current_rows[a].name in titles: array.append(current_rows[a].id) print("Ids", array) return array
Am Ende, nachdem wir die Zeilen erstellt haben, fügen wir die Antwort hinzu, damit sie am anderen Ende wissen, dass die Anfrage angekommen ist.
return HttpResponse("Hello, habr.")
Taschemta mit dem wichtigsten Server ist fertig, gehe zu IFTTT.
Teil 3. IFTTT
Wechseln Sie zur
Registerkarte Applet-Erstellung . Wir wählen den Auslöser (in unserem Fall Datum und Uhrzeit) und stellen „jede Stunde“ ein. Wir wählen den ausgelösten (dh "das") Webhook aus und geben unsere (bisher) lokale Adresse an, um ihn zu testen. Nun, das ist es. Test.
Teil 4. Heroku
Sie dachten, was wir mit diesem Auslöser vom IFTTT angestellt haben - das ist nicht zu bezahlen. Heroku bietet einen kostenlosen Preis für das Hosting unserer Produkte. Die Hauptsache ist, dass der Service mindestens 6 Stunden schläft. Und er wird definitiv schlafen, weil wir ihn anrufen, um jede Stunde und nicht jede Minute zu arbeiten.

Weiter machen wir folgendes. Gehe zu Heroku,
um ein neues Projekt zu
erstellen . Installieren Sie als Nächstes
den Client auf dem Betriebssystem. Und dann machen wir alles gemäß den Anweisungen, die nach dem Erstellen der Anwendung erschienen sind.
Nachdem Sie alles auf Heroku heruntergeladen haben, gehen Sie zu unserem Applet und bearbeiten Sie die URL zu einer neuen.
Jetzt sollte die Liste stündlich aktualisiert werden. Hypothetisch kann IFTTT einen Fehler geben, dass Sie eine lange Anfrage haben, aber dies ist nicht so wichtig.
Update
Es stellte sich als wichtig heraus. Wenn der IFTTT dauerhafte Fehler abfängt, werden Applets übersprungen.
Um dieses Problem zu lösen, starten Sie einfach einen neuen Thread für dieses ganze Zeug und geben Sie sofort die Antwort.
if request.method == "POST": thread = Thread(target=run_notion_import) thread.start() return HttpResponse("Hello, habr.")
Eine andere Idee, die ich vergessen habe, in dem Artikel zu äußern, ist die Überprüfung der Nichtigkeit mit der Standard-Pandas-Methode.
Das heißt, Ihr Scheck sieht ungefähr so aus:
if not pd.isna(health_usages[i][0]): row.health_examples = health_usages[i][0]