Forum Discussion
Connecting to data source hosted on Dropbox
The documentation on their developer site is quite comperhansive https://www.dropbox.com/developers/documentation/http/documentation
As for some boilerplate code to get you going have a look at the snippet below for an example of geting folder listing.
let
data = [ path= "/code",
recursive=false,
include_media_info=false,
include_deleted=false,
include_has_explicit_shared_members=false],
header = [ #"Authorization"="Bearer ZZZZZZZZZZZ",
#"Content-Type"= "application/json"],
response = Web.Contents("https://api.dropboxapi.com/2/files/list_folder",[Content=Json.FromValue(data),Headers=header]),
out = Json.Document(response,1252)
in
outThe only setup that I had to do on the Dropbox site was to create an App in the developer space and then generate an access key, which by the way is ZZZZZZZZZZ in my snippet.
Thanks to you I am finally able to call data from Dropbox. I built upon your list_folder API call , added a download call after it:
- Actual data table would be:
let
header = [ #"Authorization"="Bearer "&token,
#"Content-Type"="application/json"],
data = [ path="",
recursive=true,
include_media_info=false,
include_deleted=false,
include_has_explicit_shared_members=false],
response = Web.Contents("https://api.dropboxapi.com/2/files/list_folder",[Content=Json.FromValue(data),Headers=header]),
out = Json.Document(response,1252),
entries = out[entries],
#"Converted to Table" = Table.FromList(entries, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
#"Expanded Column1" = Table.ExpandRecordColumn(#"Converted to Table", "Column1", {".tag", "name", "path_lower", "path_display", "id", "client_modified", "server_modified", "rev", "size", "content_hash"}, {".tag", "name", "path_lower", "path_display", "id", "client_modified", "server_modified", "rev", "size", "content_hash"}),
#"Filtered Rows" = Table.SelectRows(#"Expanded Column1", each ([#".tag"] = "file")),
#"Added Custom" = Table.AddColumn(#"Filtered Rows", "file", each fGetTable([path_display])),
#"Removed Columns" = Table.RemoveColumns(#"Added Custom",{".tag", "name", "path_lower", "path_display", "id", "client_modified", "server_modified", "rev", "size", "content_hash"}),
#"Expanded data" = Table.ExpandTableColumn(#"Removed Columns", "file", {"COLUMN1 HERE", "COLUMN2 HERE"}, {"COLUMN1 HERE", "COLUMN2 HERE"})
in
#"Expanded data"
- keep in mind you have to type your expanded columns manually, user interface expanding does not seem to work with this method...
- "token" (line 2) is a defined parameter with the actual generated access token for the Dropbox application, you could type it between quotes as text right there instead.
- fGetTable function, which is the actual download query (referenced in line 15) would be:
let GetFile=(file) =>
let
header = [ #"Authorization"="Bearer "&token,
#"Dropbox-API-Arg"="{"&""""&"path"&""""&":"&""""&file&""""&"}"],
out = Web.Contents("https://content.dropboxapi.com/2/files/download",[Headers=header]),
excel = Excel.Workbook(out, null, true),
table = excel{0}[Data],
#"Promoted Headers" = Table.PromoteHeaders(table, [PromoteAllScalars=true])
in
#"Promoted Headers"
in GetFile
The "Dropbox-API-Arg" was escaping-quotes hell...
Edit: double quotes is one escaped quote inside a string... didn't need so much escape and concatenate, just changed that line to:
#"Dropbox-API-Arg"="{""path"":"""&file&"""}"],