Workflow-Aktionen mit benutzerdefiniertem Code
Verwenden Sie in Workflows die Aktion Benutzerdefinierte Code, um JavaScript-Code oder Python-Code (in der Beta-Phase) zu schreiben und auszuführen. Mit Aktionen mit benutzerdefiniertem Code können Sie die Workflow-Funktionalität innerhalb und außerhalb von HubSpot erweitern. Um mehr über die APIs von HubSpot zu erfahren, können Sie sich entweder die Entwicklerdokumentation für die neuesten Versionen oder die frühere Entwicklerdokumentation für unsere älteren APIs ansehen. Beispiele für gängige benutzerdefinierte Code-Aktionen finden Sie in den Anwendungsfällen für programmierbare Automatisierung von HubSpot.
Aktionen mit benutzerdefiniertem Code unterstützen JavaScript über das Node 16.x-Runtime-Framework. Wenn Sie Python für Ihre benutzerdefinierte Code-Aktion verwenden, verwendet die benutzerdefinierte Code-Aktion das Runtime-Framework Python 3.9. Wenn eine Aktion ausgeführt wird, wird die Laufzeit-Verarbeitung über eine serverlose Funktion von HubSpot und AWS Lambda verwaltet.
Wenn Sie allgemeine Probleme bei der Implementierung Ihrer benutzerdefinierten Code-Aktion haben, wenden Sie sich bitte an den HubSpot-Support. Wenn Sie jedoch Probleme mit Ihrem geschriebenen benutzerdefinierten Code haben, wird empfohlen, im HubSpot-Entwicklerforum nach Tipps und Ratschläge zu suchen und Fragen zu stellen oder um Hilfe bei der Fehlerbehebung für Ihren Code zu bitten.
Unterstützte Node.js-Bibliotheken
Wenn Sie Node.js verwenden, stehen die folgenden Bibliotheken für die Verwendung innerhalb der Code-Aktion zur Verfügung. Die Bibliotheken können am Anfang Ihres Codes mit der normalen require()
-Funktion geladen werden.
- @hubspot/api-client ^10
- async ^3.2.0
- aws-sdk ^2.744.0
- axios ^1.2.0
- lodash ^4.17.20
- mongoose ^6.8.0
- mysql ^2.18.1
- redis" ^4.5.1
- request" ^2.88.2
- bluebird ^3.7.2
- random-number-csprng ^1.0.2
- googleapis ^67.0.0
Unterstützte Python-Bibliotheken
Wenn Sie Python verwenden, können Sie die folgenden Bibliotheken mit einer import-Anweisung oben im Code laden. Die import-Anweisung sollte als from [libraryname] import [item]
formatiert sein, z. B. from redis.client import redis
.
- requests 2.28.2
- @hubspot/api-client ^8
- google-api-python-client 2.74.0
- mysql-connector-python 8.0.32
- redis 4.4.2
- nltk 3.8.1
Wenn Sie etwas aus der Standardbibliothek verwenden, können Sie import
verwenden, z. B. import os
.
Get started
Verwenden Sie die Codebeispiele unten, um mit benutzerdefinierten Code-Workflow-Aktionen loszulegen.
Code samples
So fügen Sie eine benutzerdefinierte Code-Aktion zu Ihrem Workflow hinzu:
- Gehen Sie in Ihrem HubSpot-Account zu Automatisierung > Workflows.
- Klicken Sie auf den Namen eines Workflows oder erstellen Sie einen neuen Workflow.
- Klicken Sie auf das + Plus-Symbol, um eine Workflow-Aktion hinzuzufügen.
- Wahlen Sie im rechten Bereich Benutzerdefinierter Code aus.
- Richten Sie im rechten Bereich Ihre Eigenschaft ein:
- Standardmäßig verwenden benutzerdefinierte Code-Aktionen Node.js 16.x. Wenn Sie sich in der Python-Beta befinden und Ihre Aktion mit Python entwickeln möchten, klicken Sie auf das Dropdown-Menü Sprache und wählen Sie Python aus.
- Um ein neues Geheimnis hinzuzufügen, z. B. ein Zugriffstoken von einer privaten App, klicken Sie auf Geheimnis hinzufügen. Die App muss die jeweiligen Bereiche aller Daten enthalten, die Sie aus HubSpot abrufen möchten, z. B.
contacts
oderforms
. Erfahren Sie mehr über private HubSpot-Apps. - Geben Sie im Dialogfeld den Geheimnisnamen und den Geheimniswert ein.
- Klicken Sie auf Speichern. Sie können nun dieses Geheimnis in zukünftigen Aktionen mit benutzerdefiniertem Code auswählen.
- Um vorhandene Geheimnisse zu bearbeiten oder zu löschen, klicken Sie auf Geheimnisse verwalten.
- Um Eigenschaften in Ihren benutzerdefinierten Code aufzunehmen, klicken Sie auf das Dropdown-Menü Eigenschaften auswählen und wählen Sie dann eine Eigenschaft aus. Sie können vorhandene Eigenschaften oder zuvor formatierte Eigenschaftenwerte im Workflow verwenden. Nachdem Sie Ihre Eigenschaft ausgewählt haben, geben Sie einen Namen für die Eigenschaft ein, der in Ihrem Code verwendet werden soll. Erfahren Sie, wie Sie in Ihrem benutzerdefinierten Code auf eine Eigenschaft verweisen.
- Klicken Sie auf Eigenschaft hinzufügen, um eine weitere Eigenschaft hinzuzufügen. Jede Eigenschaft kann nur einmal hinzugefügt werden und muss über eine eindeutige Variablen-ID verfügen. Sie können bis zu 50 Eigenschaften mit Ihrem benutzerdefinierten Code verwenden.
- Um eine Eigenschaft zu löschen, kicken Sie auf das Symbol für Löschen.
- Geben Sie im Code-Feld Ihren JavaScript- oder Python-Code ein.
- So definieren Sie die Datenausgaben, die später als Eingaben im Workflow verwendet werden können, z. B. mit einer Eigenschaftswert kopieren-Aktion:
- Klicken Sie unter Datenausgaben auf das Dropdown-Menü Dateityp und wählen Sie einen Datentyp aus.
- Geben Sie im Feld Name einen Namen für die Datenausgabe ein.
- Um mehrere Ausgaben hinzuzufügen, klicken Sie auf Ausgabe hinzufügen.
- Klicken Sie auf Speichern.
Bitte beachten: Das Code-Feld zeigt keine lint-Fehler an, wenn Python verwendet wird.
Wenn Sie benutzerdefinierte Code-Aktionen erstellen, beachten Sie Folgendes:
- Die
def main(event):
-Funktion wird aufgerufen, wenn die Code-Snippet-Aktion ausgeführt wird.
- Das event-Argument ist ein Objekt, das Details für die Workflow-Ausführung enthält.
- Die
callback()
-Funktion wird verwendet, um Daten zurück an den Workflow zu übergeben. Sie sollte in derexports.main
-Funktion aufgerufen werden. Dies kann nur mit Node.js verwendet werden.
Das event
-Objekt enthält die folgenden Daten:
Die Aktion testen
Wenn Sie eine benutzerdefinierte Code-Aktion zu einem Workflow hinzufügen, können Sie die Aktion testen, um sicherzustellen, dass Ihr Code wie erwartet ausgeführt wird, bevor Sie den Workflow aktivieren.
Wenn Sie eine benutzerdefinierte Code-Aktion testen, wählen Sie zunächst einen Datensatz aus, mit dem der Code getestet werden soll, und führen Sie dann den Code aus. Bei diesem Test wird nur der Code in Ihrer benutzerdefinierten Aktion ausgeführt, nicht in einer der anderen Aktionen im Workflow. Wenn der Code ausgeführt wurde, können Sie die Code-Ausgaben und das Protokoll Ihres Tests anzeigen.
Bitte beachten: Wenn Sie Ihren benutzerdefinierten Code testen, wird der Code ausgeführt und alle Änderungen gelten für den ausgewählten Testdatensatz. Es wird empfohlen, einen eigenen Testdatensatz zu erstellen, wenn Sie eine Aktualisierung Ihrer Live-Datensätze vermeiden möchten.
So testen Sie eine benutzerdefinierte Code-Aktion:
- Klicken Sie in der Workflow-Chronik auf die benutzerdefinierte Code-Aktion.
- Klicken Sie am unteren Rand der rechten Seitenleiste auf Testaktion, um den Testabschnitt zu erweitern.
- Wählen Sie einen Datensatz zum Testen Ihres Codes aus, indem Sie auf das Dropdown-Menü Objekt klicken und dann einen Datensatz auswählen.
- Wenn Sie Werte von zuvor formatierten Eigenschaften im Workflow verwenden, geben Sie einen Testwert für die formatierten Daten ein.
- Um den Code auszuführen, klicken Sie auf Testen.
- Bestätigen Sie im Dialogfeld, dass Sie Ihren Code mit dem ausgewählten Datensatz testen möchten, indem Sie auf Testen klicken.
- Sobald Ihr Code ausgeführt wurde, zeigt die Seitenleiste die Ergebnisse Ihres Tests an:
- Status: Der Erfolgs- oder Fehlerstatus Ihrer benutzerdefinierten Code-Aktion.
- Datenausgaben: Die Werte, die sich für Ihre definierten Datenausgaben ergeben haben. Eine Warnung wird neben allen Ausgaben angezeigt, die der Code generiert hat und die weder im Abschnitt Datenausgaben noch im Code-Editor definiert wurden. Sie müssen diese Ausgaben hinzufügen, um sie später im Workflow verwenden zu können.
- Protokolle: Informationen zum Test selbst, z. B. wie viel Speicher die Aktion benötigt hat, um ausgeführt zu werden, und die Gesamtlaufzeit.
- Klicken Sie zum Aktualisieren der benutzerdefinierten Code-Aktion auf Aktion erstellen, um den Editor für Aktionen zu erweitern. Aktualisieren und testen Sie Ihren Code nach Bedarf.
- Wenn Sie mit dem Testen der Aktion fertig sind, klicken Sie auf Speichern,um die Änderungen zu übernehmen.
Es kommt vor, dass Ihr Code auf etwas verweisen soll, das nicht für alle geteilt werden sollte. Meistens ist dies ein Mittel zur Authentifizierung, wie das Zugriffstoken von einer privaten App. Sie können die Geheimnisse, auf die Ihre Funktion Zugriff hat, direkt in der Definition einer Workflow-Aktion verwalten. Bei der Verwendung mehrerer Geheimnisse innerhalb eines benutzerdefinierten Codes darf die Gesamtlänge aller Geheimniswerte 1000 Zeichen nicht überschreiten.
Nach dem Hinzufügen sind die Geheimnisse als Umgebungsvariablen verfügbar, auf die Sie im benutzerdefinierten Code zugreifen können, wie unten gezeigt:
Manchmal müssen Sie möglicherweise Objekteigenschaften in Ihrer benutzerdefinierten Code-Aktion abrufen. Anstatt die APIs von HubSpot zu verwenden, können Sie diese Eigenschaften direkt in der Definition einer Workflow-Aktion hinzufügen. Fügen Sie Eigenschaften hinzu und legen Sie Eigenschaftsnamen fest, um Eigenschaften in Ihrem Code zu referenzieren. Sie können bis zu 50 Eigenschaften in jeder benutzerdefinierten Code-Aktion hinzufügen.
Nach dem Hinzufügen kann die Eigenschaft im benutzerdefinierten Code referenziert werden.
Protokollierung
Ein wichtiges Tool für Entwickler ist die Möglichkeit, Ausgaben von ihrem Code zu drucken. Es hilft Ihnen, Probleme zu debuggen und Ihren Endbenutzern besseren Support zu bieten. Wenn Sie die Ausgabe der Protokolle anzeigen möchten, gehen Sie zur Registerkarte „Verlauf“ des Workflows.
How to Define Outputs
Definieren Sie in der Funktion die Ausgabefelder, die Sie später im Workflow verwenden möchten. Wählen Sie dann in der rechten Seitenleiste den Datenausgabetyp aus (z. B. Zahl, Zeichenfolge, boolescher Wert, Datum/Uhrzeit, Enumeration, Datum/Telefonnummer) und geben Sie das Feld ein, das Sie ausgeben möchten.
Die Ausgabefelder sollten je nach verwendeter Sprache Teil eines entsprechend formatierten JSON-Objekts sein:
Sie können dann die Ausgabe Ihrer Code-Aktion verwenden, wie in der Eingabe für die Aktion Eigenschaftswert kopieren. Dadurch entfällt die Notwendigkeit, einen weiteren API-Aufruf vorzunehmen, um den Wert als Eigenschaft in Ihrem Objekt zu speichern.
Beachten Sie beim Definieren Ihrer Ausgabe Folgendes:
- Wenn Ihr Datenausgabetyp im Zeichenfolgenformat ist, beträgt die Obergrenze für Ausgabewerte im Zeichenfolgenformat 65.000 Zeichen. Ein Überschreiten dieses Limits führt zu einem
OUTPUT_VALUES_TOO_LARGE
-Fehler. - Wenn Sie die Aktion Eigenschaftswert kopieren verwenden, beachten Sie bitte auch die kompatiblen Quell- und Zieleigenschaften.
- Beim Kopieren in Datumseigenschaften:
- Wenn Sie eine Ausgabe in eine Datums-/Uhrzeiteigenschaft kopieren, muss die Ausgabe im UNIX-Millisekundenformat sein.
- Wenn Sie eine Ausgabe in eine Datumseigenschaft anstelle einer Datums-/Uhrzeiteigenschaft kopieren, muss die Ausgabe im UNIX-Millisekundenformat erfolgen und die Uhrzeit beim Datum muss auf Mitternacht UTC eingestellt sein.
currentDate.setUTCHours(0,0,0,0)
Limitations
Die Ausführung von benutzerdefinierten Code-Aktionen muss innerhalb von 20 Sekunden abgeschlossen sein, und sie dürfen nur bis zu 128 MB Speicherplatz verbrauchen. Ein Überschreiten einer dieser Beschränkungen führt zu einem Fehler.
Retries
Möglicherweise müssen Sie Objekteigenschaften mithilfe der HubSpot-API abrufen oder andere HubSpot-API-Endpunkte in Ihrer benutzerdefinierten Code-Aktion aufrufen. Wie jeder andere API-Aufruf müssen Sie die API-Ratenbeschränkungen von HubSpot einhalten.
- Wenn Sie Node.js verwenden und auf einen ratenbeschränkenden Fehler stoßen, HubSpot Ihren Anruf jedoch erneut versuchen soll, müssen Sie den Fehler im
catch
-Block Ihrer benutzerdefinierten Code-Aktion auslösen.
- Wenn Sie Python verwenden und auf einen ratenbeschränkenden Fehler stoßen, HubSpot Ihren Anruf jedoch erneut versuchen soll, müssen Sie den Fehler im
excep
-Block Ihrer benutzerdefinierten Code-Aktion auslösen.
Bitte beachten: Wenn der Aufruf aufgrund eines Ratenbeschränkungsfehlers oder eines 429- oder 5xx-Fehlers von axios oder @hubspot/api-client fehlschlägt, versucht HubSpot eine Minute nach dem Fehler bis zu drei Tage lang erneut, Ihre Aktion auszuführen. Nachfolgende fehlgeschlagene Webhooks werden in größeren Intervallen mit einer maximalen Lücke von acht Stunden versucht, erneut auszuführen.
Caveats
Wenn Sie Node.js für Ihren benutzerdefinierten Code verwenden, beachten Sie die folgenden Vorbehalte:
- Generieren von Zufallszahlen: Es ist üblich, Math.random zu verwenden, um Zufallszahlen zu generieren, aber Benutzer stellen möglicherweise fest, dass die gleichen Zahlen können über verschiedene Ausführungen generiert werden. Dies liegt daran, dass Math.random von der aktuellen Zeit gesetzt wird. Da HubSpot viele Objekte gleichzeitig in einen Workflow einschreiben und den Status bei jeder Ausführung löschen kann, setzen unterschiedlichen Ausführungen Math.random am Ende auf die gleiche Weise. Stattdessen können Sie die random-number-csprng 1.0.2-Bibliothek verwenden, die ein kryptographisch sicheres Generieren von Pseudo-Zufallszahlen gewährleistet.
- Wiederverwendung von Variablen: Um Speicher zu sparen, können alle Variablen, die außerhalb der
exports.main
-Funktion deklariert wurden, für zukünftige Ausführungen der benutzerdefinierten Code-Aktion wiederverwendet werden. Dies ist nützlich, wenn Sie eine Verbindung zu externen Diensten wie einer Datenbank herstellen, aber jede Logik oder Information, die für die einzelnen Ausführungen der benutzerdefinierten Code-Aktion eindeutig sein muss, sollte sich innerhalb derexports.main
-Funktion befinden.
Wenn Sie Python für Ihren benutzerdefinierten Code verwenden, beachten Sie die folgenden Vorbehalte:
- Wiederverwendung von Variablen: Ähnlich wie oben, können alle Variablen, die außerhalb der
def main
-Funktion deklariert wurden, für zukünftige Ausführungen der benutzerdefinierten Code-Aktion wiederverwendet werden.- Wenn Sie eine Variable außerhalb der
def main
-Funktion deklariert haben, jedoch nicht vorhaben, sie zu ändern, können Sie die Variable direkt referenzieren. - Wenn Sie eine Variable ändern möchten, können Sie die Variable innerhalb der
def main
-Funktion mit einem globalen Schlüsselwort deklarieren, bevor Sie sie referenzieren.
- Wenn Sie eine Variable außerhalb der
Vielen Dank, dass Sie Ihr Feedback mit uns geteilt haben.