drive_reveal()
adds extra information about your Drive files that is not
readily available in the default dribble
produced by googledrive. Why is
this info not always included in the default dribble
?
You don't always care about it. There is a lot of esoteric information in the
drive_resource
that has little value for most users.It might be "expensive" to get this information and put it into a usable form. For example, revealing a file's
"path"
,"permissions"
, or"published"
status all require additional API calls.
drive_reveal()
can also hoist any property out of the drive_resource
list-column, when the property's name is passed as the what
argument. The
resulting new column is simplified if it is easy to do so, e.g., if the
individual elements are all string or logical. If what
extracts a
date-time, we return POSIXct
. Otherwise, you'll get a
list-column. If this makes you sad, consider using tidyr::hoist()
instead.
It is more powerful due to a richer "plucking specification" and its ptype
and transform
arguments. Another useful function is
tidyr::unnest_wider()
.
Usage
drive_reveal(file, what = c("path", "permissions", "published", "parent"))
Arguments
- file
Something that identifies the file(s) of interest on your Google Drive. Can be a character vector of names/paths, a character vector of file ids or URLs marked with
as_id()
, or adribble
.- what
Character, describing the type of info you want to add. These values get special handling (more details below):
path
permissions
published
parent
You can also request any property in the
drive_resource
column by name. The request can be incamelCase
orsnake_case
, but the new column name will always besnake_case
. Some examples ofwhat
:mime_type
(ormimeType
)trashed
starred
description
version
web_view_link
(orwebViewLink
)modified_time
(ormodifiedTime
)created_time
(orcreatedTime
)owned_by_me
(orownedByMe
)size
quota_bytes_used
(orquotaBytesUsed
)
Value
An object of class dribble
, a tibble with one row per file.
The additional info requested via what
appears in one (or more) extra columns.
File path
When what = "path"
the dribble
gains a character column holding each
file's path. This can be very slow, so use with caution.
The example path ~/a/b/
illustrates two conventions used in googledrive:
The leading
~/
means that the foldera
is located in the current user's "My Drive" root folder.The trailing
/
means thatb
, located ina
, is a folder or a folder shortcut.
Permissions
When what = "permissions"
the dribble
gains a logical column shared
that indicates whether a file is shared and a new list-column
permissions_resource
containing lists of
Permissions resources.
Publishing
When what = "published"
the dribble
gains a logical column
published
that indicates whether a file is published and a new list-column
revision_resource
containing lists of
Revisions resources.
Parent
When what = "parent"
the dribble
gains a character column id_parent
that is the file id of this item's parent folder. This information is
available in the drive_resource
, but can't just be hoisted out:
Google Drive used to allow files to have multiple parents, but this is no longer supported and googledrive now assumes this is impossible. However, we have seen (very old) files that still have >1 parent folder. If we see this we message about it and drop all but the first parent.
The
parents
property indrive_resource
has an "extra" layer of nesting and needs to be flattened.
If you really want the raw parents
property, call drive_reveal(what = "parents")
.
See also
To learn more about the properties present in the metadata of a
Drive file (which is what's in the drive_resource
list-column of a
dribble
), see the API docs:
Examples
# Get a few of your files
files <- drive_find(n_max = 10, trashed = NA)
# the "special" cases that require additional API calls and can be slow
drive_reveal(files, "path")
#> # A dribble: 10 × 4
#> name path id drive_resource
#> <chr> <chr> <drv_id> <list>
#> 1 name-squatter-rename ~/name-squatter-rename 1AKZ-gI… <named list>
#> 2 name-squatter-mv ~/name-squatter-mv 1XhjY-o… <named list>
#> 3 name-squatter-upload ~/name-squatter-upload 1jqPKMX… <named list>
#> 4 name-squatter-rename ~/name-squatter-rename 11P8Lgm… <named list>
#> 5 name-squatter-mv ~/name-squatter-mv 1nsc4Iw… <named list>
#> 6 name-squatter-upload ~/name-squatter-upload 1HIDfXi… <named list>
#> 7 name-squatter-rename ~/name-squatter-rename 1QhQA9Z… <named list>
#> 8 name-squatter-mv ~/name-squatter-mv 11yrtJ5… <named list>
#> 9 name-squatter-upload ~/name-squatter-upload 1QDyWHG… <named list>
#> 10 name-squatter-rename ~/name-squatter-rename 1TfHbhi… <named list>
drive_reveal(files, "permissions")
#> # A dribble: 10 × 5
#> name shared id drive_resource permissions_resource
#> <chr> <lgl> <drv_id> <list> <list>
#> 1 name-squatter-r… FALSE 1AKZ-gI… <named list> <named list [2]>
#> 2 name-squatter-mv FALSE 1XhjY-o… <named list> <named list [2]>
#> 3 name-squatter-u… FALSE 1jqPKMX… <named list> <named list [2]>
#> 4 name-squatter-r… FALSE 11P8Lgm… <named list> <named list [2]>
#> 5 name-squatter-mv FALSE 1nsc4Iw… <named list> <named list [2]>
#> 6 name-squatter-u… FALSE 1HIDfXi… <named list> <named list [2]>
#> 7 name-squatter-r… FALSE 1QhQA9Z… <named list> <named list [2]>
#> 8 name-squatter-mv FALSE 11yrtJ5… <named list> <named list [2]>
#> 9 name-squatter-u… FALSE 1QDyWHG… <named list> <named list [2]>
#> 10 name-squatter-r… FALSE 1TfHbhi… <named list> <named list [2]>
drive_reveal(files, "published")
#> # A dribble: 10 × 5
#> name published id drive_resource revision_resource
#> <chr> <lgl> <drv_id> <list> <list>
#> 1 name-squatter-r… FALSE 1AKZ-gI… <named list> <named list [9]>
#> 2 name-squatter-mv FALSE 1XhjY-o… <named list> <named list [9]>
#> 3 name-squatter-u… FALSE 1jqPKMX… <named list> <named list [9]>
#> 4 name-squatter-r… FALSE 11P8Lgm… <named list> <named list [9]>
#> 5 name-squatter-mv FALSE 1nsc4Iw… <named list> <named list [9]>
#> 6 name-squatter-u… FALSE 1HIDfXi… <named list> <named list [9]>
#> 7 name-squatter-r… FALSE 1QhQA9Z… <named list> <named list [9]>
#> 8 name-squatter-mv FALSE 11yrtJ5… <named list> <named list [9]>
#> 9 name-squatter-u… FALSE 1QDyWHG… <named list> <named list [9]>
#> 10 name-squatter-r… FALSE 1TfHbhi… <named list> <named list [9]>
# a "special" case of digging info out of `drive_resource`, then processing
# a bit
drive_reveal(files, "parent")
#> # A dribble: 10 × 4
#> name id_parent id drive_resource
#> <chr> <drv_id> <drv_id> <list>
#> 1 name-squatter-rename 0AO_RMaBzcP63Uk9PVA 1AKZ-gI… <named list [41]>
#> 2 name-squatter-mv 0AO_RMaBzcP63Uk9PVA 1XhjY-o… <named list [41]>
#> 3 name-squatter-upload 0AO_RMaBzcP63Uk9PVA 1jqPKMX… <named list [41]>
#> 4 name-squatter-rename 0AO_RMaBzcP63Uk9PVA 11P8Lgm… <named list [41]>
#> 5 name-squatter-mv 0AO_RMaBzcP63Uk9PVA 1nsc4Iw… <named list [41]>
#> 6 name-squatter-upload 0AO_RMaBzcP63Uk9PVA 1HIDfXi… <named list [41]>
#> 7 name-squatter-rename 0AO_RMaBzcP63Uk9PVA 1QhQA9Z… <named list [41]>
#> 8 name-squatter-mv 0AO_RMaBzcP63Uk9PVA 11yrtJ5… <named list [41]>
#> 9 name-squatter-upload 0AO_RMaBzcP63Uk9PVA 1QDyWHG… <named list [41]>
#> 10 name-squatter-rename 0AO_RMaBzcP63Uk9PVA 1TfHbhi… <named list [41]>
# the "simple" cases of digging info out of `drive_resource`
drive_reveal(files, "trashed")
#> # A dribble: 10 × 4
#> name trashed id drive_resource
#> <chr> <lgl> <drv_id> <list>
#> 1 name-squatter-rename TRUE 1AKZ-gI… <named list [41]>
#> 2 name-squatter-mv TRUE 1XhjY-o… <named list [41]>
#> 3 name-squatter-upload TRUE 1jqPKMX… <named list [41]>
#> 4 name-squatter-rename TRUE 11P8Lgm… <named list [41]>
#> 5 name-squatter-mv TRUE 1nsc4Iw… <named list [41]>
#> 6 name-squatter-upload TRUE 1HIDfXi… <named list [41]>
#> 7 name-squatter-rename TRUE 1QhQA9Z… <named list [41]>
#> 8 name-squatter-mv TRUE 11yrtJ5… <named list [41]>
#> 9 name-squatter-upload TRUE 1QDyWHG… <named list [41]>
#> 10 name-squatter-rename TRUE 1TfHbhi… <named list [41]>
drive_reveal(files, "mime_type")
#> # A dribble: 10 × 4
#> name mime_type id drive_resource
#> <chr> <chr> <drv_id> <list>
#> 1 name-squatter-rename application/octet-stre… 1AKZ-gI… <named list>
#> 2 name-squatter-mv application/octet-stre… 1XhjY-o… <named list>
#> 3 name-squatter-upload application/octet-stre… 1jqPKMX… <named list>
#> 4 name-squatter-rename application/octet-stre… 11P8Lgm… <named list>
#> 5 name-squatter-mv application/octet-stre… 1nsc4Iw… <named list>
#> 6 name-squatter-upload application/octet-stre… 1HIDfXi… <named list>
#> 7 name-squatter-rename application/octet-stre… 1QhQA9Z… <named list>
#> 8 name-squatter-mv application/octet-stre… 11yrtJ5… <named list>
#> 9 name-squatter-upload application/octet-stre… 1QDyWHG… <named list>
#> 10 name-squatter-rename application/octet-stre… 1TfHbhi… <named list>
drive_reveal(files, "starred")
#> # A dribble: 10 × 4
#> name starred id drive_resource
#> <chr> <lgl> <drv_id> <list>
#> 1 name-squatter-rename FALSE 1AKZ-gI… <named list [41]>
#> 2 name-squatter-mv FALSE 1XhjY-o… <named list [41]>
#> 3 name-squatter-upload FALSE 1jqPKMX… <named list [41]>
#> 4 name-squatter-rename FALSE 11P8Lgm… <named list [41]>
#> 5 name-squatter-mv FALSE 1nsc4Iw… <named list [41]>
#> 6 name-squatter-upload FALSE 1HIDfXi… <named list [41]>
#> 7 name-squatter-rename FALSE 1QhQA9Z… <named list [41]>
#> 8 name-squatter-mv FALSE 11yrtJ5… <named list [41]>
#> 9 name-squatter-upload FALSE 1QDyWHG… <named list [41]>
#> 10 name-squatter-rename FALSE 1TfHbhi… <named list [41]>
drive_reveal(files, "description")
#> # A dribble: 10 × 4
#> name description id drive_resource
#> <chr> <list> <drv_id> <list>
#> 1 name-squatter-rename <NULL> 1AKZ-gI… <named list [41]>
#> 2 name-squatter-mv <NULL> 1XhjY-o… <named list [41]>
#> 3 name-squatter-upload <NULL> 1jqPKMX… <named list [41]>
#> 4 name-squatter-rename <NULL> 11P8Lgm… <named list [41]>
#> 5 name-squatter-mv <NULL> 1nsc4Iw… <named list [41]>
#> 6 name-squatter-upload <NULL> 1HIDfXi… <named list [41]>
#> 7 name-squatter-rename <NULL> 1QhQA9Z… <named list [41]>
#> 8 name-squatter-mv <NULL> 11yrtJ5… <named list [41]>
#> 9 name-squatter-upload <NULL> 1QDyWHG… <named list [41]>
#> 10 name-squatter-rename <NULL> 1TfHbhi… <named list [41]>
drive_reveal(files, "version")
#> # A dribble: 10 × 4
#> name version id drive_resource
#> <chr> <chr> <drv_id> <list>
#> 1 name-squatter-rename 3 1AKZ-gI… <named list [41]>
#> 2 name-squatter-mv 3 1XhjY-o… <named list [41]>
#> 3 name-squatter-upload 3 1jqPKMX… <named list [41]>
#> 4 name-squatter-rename 3 11P8Lgm… <named list [41]>
#> 5 name-squatter-mv 3 1nsc4Iw… <named list [41]>
#> 6 name-squatter-upload 3 1HIDfXi… <named list [41]>
#> 7 name-squatter-rename 3 1QhQA9Z… <named list [41]>
#> 8 name-squatter-mv 3 11yrtJ5… <named list [41]>
#> 9 name-squatter-upload 3 1QDyWHG… <named list [41]>
#> 10 name-squatter-rename 3 1TfHbhi… <named list [41]>
drive_reveal(files, "web_view_link")
#> # A dribble: 10 × 4
#> name web_view_link id drive_resource
#> <chr> <chr> <drv_id> <list>
#> 1 name-squatter-rename https://drive.google.c… 1AKZ-gI… <named list>
#> 2 name-squatter-mv https://drive.google.c… 1XhjY-o… <named list>
#> 3 name-squatter-upload https://drive.google.c… 1jqPKMX… <named list>
#> 4 name-squatter-rename https://drive.google.c… 11P8Lgm… <named list>
#> 5 name-squatter-mv https://drive.google.c… 1nsc4Iw… <named list>
#> 6 name-squatter-upload https://drive.google.c… 1HIDfXi… <named list>
#> 7 name-squatter-rename https://drive.google.c… 1QhQA9Z… <named list>
#> 8 name-squatter-mv https://drive.google.c… 11yrtJ5… <named list>
#> 9 name-squatter-upload https://drive.google.c… 1QDyWHG… <named list>
#> 10 name-squatter-rename https://drive.google.c… 1TfHbhi… <named list>
drive_reveal(files, "modified_time")
#> # A dribble: 10 × 4
#> name modified_time id drive_resource
#> <chr> <dttm> <drv_id> <list>
#> 1 name-squatter-rename 2025-09-10 14:44:46 1AKZ-gI… <named list [41]>
#> 2 name-squatter-mv 2025-09-10 14:44:24 1XhjY-o… <named list [41]>
#> 3 name-squatter-upload 2025-09-10 13:47:59 1jqPKMX… <named list [41]>
#> 4 name-squatter-rename 2025-09-10 13:46:54 11P8Lgm… <named list [41]>
#> 5 name-squatter-mv 2025-09-10 13:46:25 1nsc4Iw… <named list [41]>
#> 6 name-squatter-upload 2025-09-10 03:46:55 1HIDfXi… <named list [41]>
#> 7 name-squatter-rename 2025-09-10 03:45:57 1QhQA9Z… <named list [41]>
#> 8 name-squatter-mv 2025-09-10 03:45:31 11yrtJ5… <named list [41]>
#> 9 name-squatter-upload 2025-09-10 03:23:10 1QDyWHG… <named list [41]>
#> 10 name-squatter-rename 2025-09-10 03:22:32 1TfHbhi… <named list [41]>
drive_reveal(files, "created_time")
#> # A dribble: 10 × 4
#> name created_time id drive_resource
#> <chr> <dttm> <drv_id> <list>
#> 1 name-squatter-rename 2025-09-10 14:44:46 1AKZ-gI… <named list [41]>
#> 2 name-squatter-mv 2025-09-10 14:44:24 1XhjY-o… <named list [41]>
#> 3 name-squatter-upload 2025-09-10 13:47:59 1jqPKMX… <named list [41]>
#> 4 name-squatter-rename 2025-09-10 13:46:54 11P8Lgm… <named list [41]>
#> 5 name-squatter-mv 2025-09-10 13:46:25 1nsc4Iw… <named list [41]>
#> 6 name-squatter-upload 2025-09-10 03:46:55 1HIDfXi… <named list [41]>
#> 7 name-squatter-rename 2025-09-10 03:45:57 1QhQA9Z… <named list [41]>
#> 8 name-squatter-mv 2025-09-10 03:45:31 11yrtJ5… <named list [41]>
#> 9 name-squatter-upload 2025-09-10 03:23:10 1QDyWHG… <named list [41]>
#> 10 name-squatter-rename 2025-09-10 03:22:32 1TfHbhi… <named list [41]>
drive_reveal(files, "owned_by_me")
#> # A dribble: 10 × 4
#> name owned_by_me id drive_resource
#> <chr> <lgl> <drv_id> <list>
#> 1 name-squatter-rename TRUE 1AKZ-gI… <named list [41]>
#> 2 name-squatter-mv TRUE 1XhjY-o… <named list [41]>
#> 3 name-squatter-upload TRUE 1jqPKMX… <named list [41]>
#> 4 name-squatter-rename TRUE 11P8Lgm… <named list [41]>
#> 5 name-squatter-mv TRUE 1nsc4Iw… <named list [41]>
#> 6 name-squatter-upload TRUE 1HIDfXi… <named list [41]>
#> 7 name-squatter-rename TRUE 1QhQA9Z… <named list [41]>
#> 8 name-squatter-mv TRUE 11yrtJ5… <named list [41]>
#> 9 name-squatter-upload TRUE 1QDyWHG… <named list [41]>
#> 10 name-squatter-rename TRUE 1TfHbhi… <named list [41]>
drive_reveal(files, "size")
#> # A dribble: 10 × 4
#> name size id drive_resource
#> <chr> <chr> <drv_id> <list>
#> 1 name-squatter-rename 0 1AKZ-gI… <named list [41]>
#> 2 name-squatter-mv 0 1XhjY-o… <named list [41]>
#> 3 name-squatter-upload 0 1jqPKMX… <named list [41]>
#> 4 name-squatter-rename 0 11P8Lgm… <named list [41]>
#> 5 name-squatter-mv 0 1nsc4Iw… <named list [41]>
#> 6 name-squatter-upload 0 1HIDfXi… <named list [41]>
#> 7 name-squatter-rename 0 1QhQA9Z… <named list [41]>
#> 8 name-squatter-mv 0 11yrtJ5… <named list [41]>
#> 9 name-squatter-upload 0 1QDyWHG… <named list [41]>
#> 10 name-squatter-rename 0 1TfHbhi… <named list [41]>
drive_reveal(files, "quota_bytes_used")
#> # A dribble: 10 × 4
#> name quota_bytes_used id drive_resource
#> <chr> <chr> <drv_id> <list>
#> 1 name-squatter-rename 0 1AKZ-gI… <named list [41]>
#> 2 name-squatter-mv 0 1XhjY-o… <named list [41]>
#> 3 name-squatter-upload 0 1jqPKMX… <named list [41]>
#> 4 name-squatter-rename 0 11P8Lgm… <named list [41]>
#> 5 name-squatter-mv 0 1nsc4Iw… <named list [41]>
#> 6 name-squatter-upload 0 1HIDfXi… <named list [41]>
#> 7 name-squatter-rename 0 1QhQA9Z… <named list [41]>
#> 8 name-squatter-mv 0 11yrtJ5… <named list [41]>
#> 9 name-squatter-upload 0 1QDyWHG… <named list [41]>
#> 10 name-squatter-rename 0 1TfHbhi… <named list [41]>
# 'root' is a special file id that represents your My Drive root folder
drive_get(id = "root") |>
drive_reveal("path")
#> # A dribble: 1 × 4
#> name path id drive_resource
#> <chr> <chr> <drv_id> <list>
#> 1 My Drive ~/ 0AO_RMaBzcP63Uk9PVA <named list [33]>