Monday.com GraphQL API Response mappen

Hallo Zusammen,

ich habe mir einen Flow gebaut, der mir aus einem Synesty Datastore Daten über einen SpreadsheetUrlDownload Step, an die Monday.com GraphQL API überträgt. Da es ungefähr 6.000 Datensätze sind, habe ich das Ganze so aufgebaut, dass ich die Batch Size im Step entsprechend hochsetzen kann.

Mein Request Body sieht wie folgt aus:

{"query": "mutation { <#list rows as row> item${row?index}: create_item (board_id: ${meta.board_id!}, group_id: \"${meta.group_id!}\", item_name: \"${row['sku']!}\", column_values: \"{\\\"text_mks7cqvp\\\":\\\"${row['name_erp']!}\\\" ) { id } </#list> }"}

Daraus entsteht dann folgender Call

{"query": "mutation { item0: create_item (board_id: 1234567890, group_id: \"topics\", item_name: \"00002522\", column_values: \"{\\\"text_mks7cqvp\\\":\\\"Chéreau Carre Katharos 0,75l, 2022\\\") { id } item1: create_item (board_id: 1234567890, group_id: \"topics\", item_name: \"00002624\", column_values: \"{\\\"text_mks7cqvp\\\":\\\"Chéreau Carre Colere 0,75l, 2024\\\") { id } item2: create_item (board_id: 1234567890, group_id: \"topics\", item_name: \"00002623\", column_values: \"{\\\"text_mks7cqvp\\\":\\\"Chéreau Carre Colere 0,75l, 2023\\\") { id }}"}

Als Reponse bekomme ich folgendes zurück:

{"data":{"item0":{"id":"10578450997"},"item1":{"id":"10578432599"},"item2":{"id":"10578444102"}},"extensions":{"request_id":"f308b7f3-f790-9329-a49b-a819a5e5bdce"}}	

Ich möchte jetzt gerne die id, die zu jedem item (item0, item1, item2) zurückgekommen ist, in mein Datastore, dass als Identfier die “sku” hat, zurückschreiben.

Wenn ich den requestBody so umbaue, dass der Call nicht als Batch sondern als einzelner API Call versendet wird, bekomme ich mit Hilfe der Einstellung ‘outputSourceColumns’ die SKU sauber durchgeleift und kann diese dann per Datastore Writer weiterreichen. Nur beim Batch Versand weiß ich nicht so wirklich, wie ich das Ganze sauber zurückschreiben kann.

Hat jemand eine Idee?

Viele Grüße
Ramin

Hallo Ramin,

auf die einzelnen Zeilen kannst du wie folgt zugreifen.

<#assign json = parseJSON(result["response"]!)>
${json["data"]["item0"]["id"]}
${json["data"]["item1"]["id"]}
${json["data"]["item2"]["id"]}

result[„response“] enthält einfach das JSON, welches du als Response nennst.

Hauptproblem ist vermutlich, dass ganze dynamisch abzurufen. Das geht aber natürlich auch.

<#assign json_data = parseJSON(result["response"]!)["data"]>
<#list 0..1000000 as index><#if json_data["item" + index]??>ID von item ${index}:${json_data["item" + index]["id"]}<#else><#break></#if><#sep>
</#list>

Hier auch als funktionales Beispiel: Mapper - Transformy

Statt die einzelnen Items explizit zu addressieren, baut man einen hochzählenden Index und prüft für jeden Index, ob ein Objekt unter „itemX“ existiert. Wenn ja, ruft man es ab. Im Moment wird angenommen, dass es keine Lücken gibt und die die Schleife bricht ab, wenn ein Item nicht existiert.

Gruß
Gustav

Hallo Ramin,

vielleicht noch eine Alternative zu @gustavfriedeheim Variante, die ohne den index auskommt. Mit ?keys kannst du auch über die vorhanden „items“ laufen und diese jeweils in einer Zeile ausgeben.

<#assign row = target.addRow()>
<#list json["data"]?keys as key>
    <#assign row = target.addRow()>
    ${row.addCol("item", key!)}
    ${row.addCol("id", json["data"][key]["id"]!)}
</#list>

VG Torsten

Hallo Zusammen,

danke für die Antworten. Ich hab mich jetzt mal an das Beispiel von Thorsten orientiert, da es für mich als Nicht-Entwickler einfacher umzusetzen war :slight_smile:

In meinem Request hab ich jetzt bei ‘item$’ das ‘?index’ mit ‘${row[‚sku‘]!}’ getauscht, denn später bei dem Response-Beispiel von @synesty-Torsten, benötige ich ja meine SKU, um im Datastore Writer die Monday_id zuweisen zu können.

Der Request sieht dann wie folgt aus:

{"query": "mutation { <#list rows as row> item${row['sku']!}: create_item (board_id: ${meta.board_id!}, group_id: \"${meta.group_id!}\", item_name: \"${row['sku']!}\", column_values: \"{\\\"text_mks7cqvp\\\":\\\"${row['name_erp']!}\\\" ) { id } </#list> }"}

Danach kommt dann der JSON Reader der die Response ausliest, so wie von Torsten empfohlen.

Im Datastore Writer lese ich die Response aus und hab dann einfach mit Hilfe von Suchen & Ersetzen, den Text “item” rausgelöscht, so dass dann nur die SKU übrigt bleibt und das dann mit dem Mapping sauber funktioniert.

Eigentlich läuft es auch super, aber immer wieder kommt es zu folgendem Fehler.

Ich weiß es jetzt auch nicht ob es daran hängt, dass zu viele Daten reinlaufen (es sollen ca. 5000 Produkte per Batch Size 50 importiert werden) oder irgendwas an der Konfiguration.

Viele Grüße
Ramin

Hallo Ramin,

für mich sieht das so aus, als enthält das „data“-Element nicht nur die item-Elemente wie

"item0":{"id":"10578450997"}

Du iterierst im Moment über alle Elemente unter dem „data“-Element. Wenn dort neben den item-Elementen noch irgendwelche anders formatierte Elemente (oder item-Elemente ohne ID-Subelement) enthalten sind, werden die von dem Code auch wie ein item-Element behandelt und verursachen vermutlich deinen Fehler.

Wie genau man das löst, kommt drauf an, wie genau dein JSON von der ursprünglichen Struktur abweicht.

Wenn dort weitere Element neben den item-Element enthalten sind, die nicht verarbeiten werden sollen, kannst du den Abruf von Torsten mit einem Filter einfach auf die Keys einschränken, welche mit „item“ anfangen.

<#list json["data"]?keys?filter(x -> x?starts_with("item")) as key>

Gruß
Gustav