Zapier для создания нескольких строк в Google Sheet из данных Tsheets - PullRequest
0 голосов
/ 25 октября 2018

В Zapier Zap я использую вызов API GET для Tsheets, чтобы получить список расписаний.Я хотел бы разбить каждый табель на отдельные позиции, например, позиции в счете Xero, потому что я хотел бы сохранить данные позиций из каждого расписания в отдельной строке на листе Google.(В идеале я хотел бы сохранить данные строк непосредственно в базе данных MySQL, но я вижу, что в настоящее время Zapier поддерживает только листы Google, сохраняя несколько строк одновременно.) Однако я не испытываю радости.Я подозреваю одну из двух проблем:

  1. Zapier ожидает слово lineitems в ответе или
  2. Формат ответа неправильный - у меня, кажется, есть две категории "результатов"

На моем шаге по настройке строки таблицы Google Sheets я не получаю выбор элементов, разделенных запятыми, как показано в примере, показанном на рисунке ниже: Добавление приложения-действия, поддерживающего строкуэлементы, и каждый элемент будет сохранен индивидуально Изображение с этой страницы: https://zapier.com/blog/formatter-line-item-automation/ с надписью «Добавить приложение действия, которое поддерживает позиции, и каждый элемент будет сохранен индивидуально» За то, что я получаюсм. фото https://cdn.zapier.com/storage/photos/f055dcf11a4b11b86f912f9032780429.png На шаге, который возвращает данные из API, текстовый ответ отображается в https://cdn.zapier.com/storage/photos/33129fb7425cfae44be4a81533d6e892.png, и если я возвращаю данные json, он выглядит следующим образом: https://cdn.zapier.com/storage/photos/34da1b98f8941324c35befef8efe350d.png

Может ли кто-нибудь подтвердить, что мои подозрения верны, и является ли 1 или 2 вероятным виновником.

Возможно ли эта ссылка Zapier - Catch Hook - JSON Array - Цикл над каждым элементом в массиве приведет меня к решению?Похоже, что может, но я не вижу точно, как писатель включил это в свой Zap.

Редактировать: мои данные, возвращенные из API, выглядят так:

{
 "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
}

Иэто мой код Python: https://imgur.com/a/8W1X1em

1 Ответ

0 голосов
/ 26 октября 2018

Хорошо, так что я думаю, что я кое-что для вас решил.Пример, который вы предоставили Zapier - Catch Hook - JSON Array - Цикл по каждому элементу в массиве , безусловно, находится на правильном пути, но, поскольку он опирается на webhooks, он, вероятно, не будет работать для вас, если вы не сможетеОтправьте данные из вашего приложения для выставления счетов.

Примечание: Я пишу код на Python, поэтому мои примеры будут на Python, в которых сказано, что эти примеры в значительной степени независимы от кода и могут быть воспроизведены также в Javascript.

Я установил фиктивный Zap, чтобы копировать то, что в данный момент происходит с вашим 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

Чтение немного дальше здесь , чтобы Zapier отображал позиции, необходимые для получения данных в виде.массив.Приведенный выше вывод является объектом словаря, Zapier отображает значения в этом словаре на данные, к которым можно будет получить доступ позже, однако он отображает весь словарь, поэтому вы видите выходные данные в виде нескольких полей и, как реплицировано в моем выход .То, что вы хотите сделать, это сопоставить подмножество словаря И предоставить каждое подмножество в качестве отдельных выходов.

То, что вы хотите сделать, это циклически проходить по внутренним полямПолучите объект словаря и выполните zaps для вложенного "timesheet_id_n".Для этого нам нужно будет вернуть список позиций, как указано выше, позиции должны быть помещены в массив.И поэтому мой код для достижения этой цели выглядит следующим образом:

# 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

Результатом return_results будет массив словарных объектов.Поскольку эти объекты словаря находятся в массиве, Zapier будет обрабатывать их как элементы строки, кроме того, поскольку каждый элемент строки является объектом словаря, Zapier автоматически сопоставит каждое значение, чтобы их можно было независимо использовать в последующих действиях.Вы можете увидеть это на выходе моего триггера zap на следующих снимках экрана:

выход 1
выход 2
выход 3

Надеюсь, это помогло!

...