Hi Ian,
you can do it directly in Excel via the PowerQuery extension. There you define the JSON query and anything around you can do in Excel VBA.
Here is a snippet of what I developed:
Blockquote let
//Parameter lesen
apiKey = Excel.CurrentWorkbook(){[Name=“ApiKey”]}[Content]{0}[Column1],
wsId = Excel.CurrentWorkbook(){[Name=“WorkspaceID”]}[Content]{0}[Column1],
startDate = Excel.CurrentWorkbook(){[Name="Start"]}[Content]{0}[Column1],
endDate = Excel.CurrentWorkbook(){[Name="End"]}[Content]{0}[Column1],
prjId = Excel.CurrentWorkbook(){[Name="ProjektID"]}[Content]{0}[Column1],
//URL konstruieren
url="https://reports.api.clockify.me/v1/workspaces/" & wsId & "/reports/detailed/",
//Abfrage aufbauen
content =
"{""dateRangeStart"": """ & startDate & """,""dateRangeEnd"": """ & endDate & """
,""detailedFilter"": {""page"": ""1"",""pageSize"": ""1000"",""sortColumn"": ""DATE""}
,""sortOrder"": ""ASCENDING"",""exportType"": ""JSON""
,""projects"": {""ids"":[""" & prjId & """]}
,""amountShown"": ""EARNED"",""rounding"": ""true""
}",
Source = Json.Document(
Web.Contents(url, [Headers= [ #"X-Api-Key"=apiKey
,ContentType="application/json"
,#"Content-Type"="application/json"
]
,Content=Text.ToBinary(content)
]
)
),
timeentries = Source[timeentries],
#"Converted to Table" = Table.FromList(timeentries, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
#"Expanded Column1" = Table.ExpandRecordColumn(#"Converted to Table", "Column1", {"description", "timeInterval", "amount", "rate", "projectName", "taskName", "clientName", "userName"}, {"description", "timeInterval", "amount", "rate", "projectName", "taskName", "clientName", "userName"}),
#"Erweiterte timeInterval" = Table.ExpandRecordColumn(#"Expanded Column1", "timeInterval", {"start", "duration"}, {"Datum", "duration"}),
#"Renamed Columns" = Table.RenameColumns(#"Erweiterte timeInterval",{{"duration", "Time (sec)"}}),
#"Inserted Division" = Table.AddColumn(#"Renamed Columns", "Division", each [#"Time (sec)"] / 3600, type number),
#"Inserted Rounding" = Table.AddColumn(#"Inserted Division", "Round", each Number.Round([Division], 2), type number),
#"Renamed Columns1" = Table.RenameColumns(#"Inserted Rounding",{{"Round", "Zeit (dec)"}}),
#"Removed Columns" = Table.RemoveColumns(#"Renamed Columns1",{"Division"}),
#"Inserted Division1" = Table.AddColumn(#"Removed Columns", "Division", each [rate] / 100, type number),
#"Renamed Columns2" = Table.RenameColumns(#"Inserted Division1",{{"Division", "Rate"}}),
#"Inserted Multiplication" = Table.AddColumn(#"Renamed Columns2", "Multiplication", each [Rate] * [#"Zeit (dec)"], type number),
#"Renamed Columns3" = Table.RenameColumns(#"Inserted Multiplication",{{"Multiplication", "Betrag"}}),
#"Removed Columns1" = Table.RemoveColumns(#"Renamed Columns3",{"Time (sec)", "amount", "rate"}),
#"Renamed Columns4" = Table.RenameColumns(#"Removed Columns1",{{"clientName", "Client"}, {"userName", "Person"}, {"projectName", "Projekt"}, {"description", "Beschreibung"}, {"taskName", "Leistungsphase"}}),
#"Reordered Columns" = Table.ReorderColumns(#"Renamed Columns4",{"Datum", "Person", "Client", "Projekt", "Beschreibung", "Zeit (dec)", "Rate", "Betrag"}),
#"Grouped Rows" = Table.Group(#"Reordered Columns", {"Datum", "Person", "Client", "Projekt", "Leistungsphase", "Beschreibung"}, {{"Zeit (dec)", each List.Sum([#"Zeit (dec)"]), type number}, {"Betrag", each List.Sum([Betrag]), type number}}),
#"Sorted Rows" = Table.Sort(#"Grouped Rows",{{"Datum", Order.Ascending},{"Client", Order.Ascending}, {"Projekt", Order.Ascending}, {"Beschreibung", Order.Ascending}}),
#"Changed Type" = Table.TransformColumnTypes(#"Sorted Rows",{{"Betrag", Currency.Type}}),
#"Analysiertes Datum" = Table.TransformColumns(#"Changed Type",{{"Datum", each Date.From(DateTimeZone.From(_)), type date}})
in
#“Analysiertes Datum”
Sorry for the names and comment being in german… ![:wink: :wink:](https://forum.clockify.me/images/emoji/apple/wink.png?v=12)
Hope this gets you started - cheers,
Holger