2 votes

Zapier pour créer plusieurs lignes dans Google Sheet à partir des données de Tsheets

Dans un Zapier, j'utilise un appel GET de l'API vers Tsheets pour obtenir une liste de feuilles de temps. Je voudrais diviser chaque feuille de temps en postes de ligne, comme les postes de ligne dans une facture Xero, car je voudrais enregistrer les données de chaque feuille de temps dans sa propre ligne dans une feuille Google. (Idéalement, je voudrais sauvegarder les données de ligne directement dans une base de données MySQL, mais je vois que Zapier ne prend actuellement en charge que les feuilles Google sauvegardant plusieurs lignes à la fois). Cependant, je n'ai aucun plaisir à le faire. Je soupçonne l'un des deux problèmes suivants :

  1. Zapier attend le mot lineitems dans la réponse ou
  2. Le format de la réponse n'est pas correct - il semble que j'aie deux catégories de "résultats".

Dans mon étape de configuration de la rangée de feuilles de calcul de Google Sheets, je n'obtiens pas une sélection d'éléments séparés par des virgules comme le montre l'exemple illustré ici : Ajoutez une application d'action qui prend en charge les postes, et chaque poste sera sauvegardé individuellement. L'image provient de cette page : https://zapier.com/blog/formatter-line-item-automation/ avec la légende "Ajouter une application d'action qui supporte les articles de ligne, et chaque article sera sauvegardé individuellement" Pour ce que je reçois voir la photo https://cdn.zapier.com/storage/photos/f055dcf11a4b11b86f912f9032780429.png Dans l'étape qui renvoie les données de l'API, la réponse textuelle est affichée dans le tableau suivant https://cdn.zapier.com/storage/photos/33129fb7425cfae44be4a81533d6e892.png et si je renvoie des données json, c'est comme ça : https://cdn.zapier.com/storage/photos/34da1b98f8941324c35befef8efe350d.png

Quelqu'un peut-il confirmer que mes soupçons sont corrects et si 1 ou 2 est le coupable probable ?

Est-il possible que ce lien Zapier - Catch Hook - JSON Array - Boucle sur chaque élément du tableau me conduira à la solution ? On dirait que oui, mais je ne vois pas exactement comment l'auteur l'a incorporé dans son Zap.

Edit : Mes données renvoyées par l'API ressemblent à ceci :

{
 "results": {
  "timesheets": {
   "11515534": {
    "id": 11515534,
    "user_id": 1260679,
    "jobcode_id": 11974818,
    "start": "2018-07-13T14:58:00+10:00",
    "end": "2018-07-13T14:58:00+10:00",
    "duration": 0,
    "date": "2018-07-13",
    "tz": 10,
    "tz_str": "Australia\/Brisbane",
    "type": "regular",
    "location": "(Brisbane, Queensland, AU?)",
    "on_the_clock": false,
    "locked": 0,
    "notes": "",
    "customfields": {
     "118516": "",
     "121680": "",
     "118530": "",
     "118518": "Field supplies, materials"
    },
    "last_modified": "2018-07-13T04:59:27+00:00",
    "attached_files": [

    ]
   },
   "11515652": {
    "id": 11515652,
    "user_id": 1260679,
    "jobcode_id": 11974830,
    "start": "2018-07-13T14:59:00+10:00",
    "end": "2018-07-13T14:59:00+10:00",
    "duration": 0,
    "date": "2018-07-13",
    "tz": 10,
    "tz_str": "Australia\/Brisbane",
    "type": "regular",
    "location": "(Brisbane, Queensland, AU?)",
    "on_the_clock": false,
    "locked": 0,
    "notes": "",
    "customfields": {
     "118516": "",
     "121680": "",
     "118530": ""
    },
    "last_modified": "2018-07-13T05:00:30+00:00",
    "attached_files": [

    ]
   },
   "39799840": {
    "id": 39799840,
    "user_id": 1260679,
    "jobcode_id": 19280104,
    "start": "2018-10-24T11:45:00+11:00",
    "end": "2018-10-24T12:00:00+11:00",
    "duration": 900,
    "date": "2018-10-24",
    "tz": 11,
    "tz_str": "Australia\/Brisbane",
    "type": "regular",
    "location": "(Sydney, New South Wales, AU?)",
    "on_the_clock": false,
    "locked": 0,
    "notes": "",
    "customfields": {
     "118516": "",
     "121680": "FP - Field plant Installation",
     "118530": "Site cleanup"
    },
    "last_modified": "2018-10-24T05:56:27+00:00",
    "attached_files": [

    ]
   },
   "39801850": {
    "id": 39801850,
    "user_id": 1260679,
    "jobcode_id": 19280204,
    "start": "2018-10-24T12:00:00+11:00",
    "end": "2018-10-24T13:45:00+11:00",
    "duration": 6300,
    "date": "2018-10-24",
    "tz": 11,
    "tz_str": "Australia\/Brisbane",
    "type": "regular",
    "location": "(Sydney, New South Wales, AU?)",
    "on_the_clock": false,
    "locked": 0,
    "notes": "",
    "customfields": {
     "118516": "",
     "121680": "OP - Plant, Vehicles",
     "118530": "Load\/Unload"
    },
    "last_modified": "2018-10-24T05:57:04+00:00",
    "attached_files": [

    ]
   },
   "40192757": {
    "id": 40192757,
    "user_id": 1260679,
    "jobcode_id": 19280110,
    "start": "2018-10-25T08:00:00+11:00",
    "end": "2018-10-25T10:00:00+11:00",
    "duration": 7200,
    "date": "2018-10-25",
    "tz": 11,
    "tz_str": "Australia\/Brisbane",
    "type": "regular",
    "location": "TSheets Android App",
    "on_the_clock": false,
    "locked": 0,
    "notes": "From my mobile",
    "customfields": {
     "118516": "",
     "121680": "FW - Plant Assembly",
     "118530": "Panels"
    },
    "last_modified": "2018-10-24T23:02:56+00:00",
    "attached_files": [

    ]
   },
   "40193033": {
    "id": 40193033,
    "user_id": 1260679,
    "jobcode_id": 19280108,
    "start": "2018-10-25T10:00:00+11:00",
    "end": "2018-10-25T10:00:00+11:00",
    "duration": 0,
    "date": "2018-10-25",
    "tz": 11,
    "tz_str": "Australia\/Brisbane",
    "type": "regular",
    "location": "TSheets Android App",
    "on_the_clock": false,
    "locked": 0,
    "notes": "",
    "customfields": {
     "118516": "",
     "121680": "FW - Plant Assembly",
     "118530": "Panels"
    },
    "last_modified": "2018-10-24T23:06:05+00:00",
    "attached_files": [

    ]
   }
  }
 },
 "more": false
}

Et voici mon code Python : https://imgur.com/a/8W1X1em

4voto

Michael Case Points 508

Bon, je crois que j'ai trouvé une solution pour toi. L'exemple que vous avez fourni Zapier - Catch Hook - JSON Array - Boucle sur chaque élément du tableau est définitivement sur la bonne voie, mais, comme il repose sur des webhooks, il ne fonctionnera probablement pas pour vous à moins que vous puissiez POST les données de votre application de facturation.

Note : Je code en Python et mes exemples seront donc en Python. Cela dit, ces exemples sont pratiquement indépendants du code et peuvent également être reproduits en Javascript.

J'ai configuré une Zap factice pour reproduire ce qui se passe actuellement avec votre zap.

# results = requests.get(url, headers=header)
# results = results.json()
# Dummy result data converted to JSON object after API GET request:
results =  { 
    "results" : {
        "timesheets" : {
            "timesheet_id_1" : {
                "data_1" : "data",
                "data_2" : "data",
                "data_3" : "data"
                },
            "timesheet_id_2" : {
                "data_1" : "data",
                "data_2" : "data",
                "data_3" : "data"
                },
            "timesheet_id_3" : {
                "data_1" : "data",
                "data_2" : "data",
                "data_3" : "data"
                }
            }
        }
    }

return results

Lire un peu plus loin aquí Pour que Zapier puisse mettre en correspondance les postes, il doit recevoir les données dans un tableau. La sortie ci-dessus est un objet dictionnaire, Zapier fait correspondre les valeurs de ce dictionnaire à des données qui peuvent être accédées plus tard, cependant il fait correspondre le dictionnaire entier, c'est pourquoi vous voyez la sortie sous forme de champs multiples et comme cela est reproduit dans ma page d'accueil. sortie . Ce que vous cherchez à faire est de mettre en correspondance un sous-ensemble du dictionnaire ET fournir chaque sous-ensemble comme des sorties séparées.

Ce que vous voulez faire, c'est boucler sur les champs internes de l'objet dictionnaire de résultats et exécuter des zaps sur les "timesheet_id_n" imbriqués. Pour ce faire, nous devons retourner une liste d'éléments de ligne, comme indiqué ci-dessus, les éléments de ligne doivent être placés dans un tableau. Mon code pour réaliser cela ressemble donc à ceci :

# results = requests.get(url, headers=header)
# results = results.json()
# Dummy result data converted to JSON object after API GET request:
results =  { 
    "results" : {
        "timesheets" : {
            "timesheet_id_1" : {
                "data_1" : "data",
                "data_2" : "data",
                "data_3" : "data"
                },
            "timesheet_id_2" : {
                "data_1" : "data",
                "data_2" : "data",
                "data_3" : "data"
                },
            "timesheet_id_3" : {
                "data_1" : "data",
                "data_2" : "data",
                "data_3" : "data"
                }
            }
        }
    }

# Container for my line items. Each element in this list will be executed on separately
return_results = []

results = results.get("results")
results = results.get("timesheets")
for item in results:
    return_results.append({"sheet_id" : item, "sheet_data" : results.get(item)})

return return_results

La sortie de return_results sera un tableau d'objets dictionnaires. Comme ces objets de dictionnaire sont dans un tableau, Zapier les traitera comme des articles de ligne, de plus, comme chaque article de ligne est un objet de dictionnaire, Zapier mappera automatiquement chaque valeur pour qu'elles puissent être utilisées indépendamment dans des étapes d'action ultérieures. Vous pouvez voir cette démonstration dans la sortie de mon zap de déclenchement dans les captures d'écran suivantes :

sortie 1
sortie 2
sortie 3

J'espère que cela vous a aidé !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X