【问题标题】:How to download all sheets in a google sheet in R如何在R中下载谷歌表格中的所有表格
【发布时间】:2020-08-08 21:02:00
【问题描述】:

我希望将所有工作表下载到 R 中的单个 Google 工作表中。 我目前正在使用[maxconway][1]gsheet 包,它允许我使用其URL 下载工作表,但它仅适用于单个工作表,由gid 区分。 我要下载的一组谷歌表格有 100 多张表格,这使得用gsheet 逐个下载它们非常不方便 - 有没有人知道任何 R 包可以自动执行此操作或以任何方式循环遍历所有一张谷歌表格中的表格?
这是我目前拥有的代码,它仅将 100 多张纸中的第一张下载为 tibble:

all_rolls <- gsheet2tbl('https://docs.google.com/spreadsheets/d/1OEg29XbL_YpO0m5JrLQpOPYTnxVsIg8iP67EYUrtRJg/edit#gid=26346344')

> head(all_rolls)
# A tibble: 6 x 14
  Episode Time   Character `Type of Roll` `Total Value` `Natural Value` `Crit?` `Damage Dealt` `# Kills`
    <int> <drtn> <chr>     <chr>          <chr>         <chr>           <chr>   <chr>              <int>
1       1 37'53" Vex'ahlia Intelligence   20            18              <NA>    <NA>                  NA
2       1 41'48" Grog      Persuasion     19            18              <NA>    <NA>                  NA
3       1 43'25" Keyleth   Persuasion     2             2               <NA>    <NA>                  NA
4       1 46'35" Tiberius  Persuasion     12            3               <NA>    <NA>                  NA
5       1 46'35" Tiberius  Persuasion     27            18              <NA>    <NA>                  NA
6       1 46'35" Percy     Assist         21            15              <NA>    <NA>                  NA
# … with 5 more variables: Notes <chr>, `Non-Roll Kills` <chr>, X12 <chr>, X13 <chr>, X14 <chr>

注意:我尝试删除 #gid 字段,但它只是下载了第一张表。

【问题讨论】:

    标签: r google-sheets download


    【解决方案1】:

    更新 2021-01-31:更新代码以使用替换 sheets_find()sheets_sheets() 的新函数,从 googlesheets4 版本 0.2.0 开始。

    googlesheets4 软件包包含一个功能,用于列出与帐户的 Google Drive 关联的所有工作表:sheets_find()。从工作表列表中,可以使用工作表 ID 将工作表读入 R。

    library(googlesheets4)
    sheets_auth()
    theSheets <- gs4_find()
    theSheets
    

    我在 Google 上的测试帐户有一张 Google 表格,即 Pokémon Stats 的电子表格。

    > theSheets
    # A tibble: 1 x 3
      name         id                                           drive_resource   
    * <chr>        <chr>                                        <list>           
    1 PokemonStats 13rGxY7ScDUl7bFJ9NipO7QUafEACYTH4MagFjcj4pVw <named list [34]>
    

    我们可以使用 ID 字段来下载表格。

    pokemonData <- sheets_read(theSheets$id[1])
    head(pokemonData)
    
    
    > head(pokemonData)
    # A tibble: 6 x 13
      Number Name  Type1 Type2 Total    HP Attack Defense SpecialAtk SpecialDef Speed
       <dbl> <chr> <chr> <chr> <dbl> <dbl>  <dbl>   <dbl>      <dbl>      <dbl> <dbl>
    1      1 Bulb… Grass Pois…   318    45     49      49         65         65    45
    2      2 Ivys… Grass Pois…   405    60     62      63         80         80    60
    3      3 Venu… Grass Pois…   525    80     82      83        100        100    80
    4      3 Venu… Grass Pois…   625    80    100     123        122        120    80
    5      4 Char… Fire  NA      309    39     52      43         60         50    65
    6      5 Char… Fire  NA      405    58     64      58         80         65    80
    # … with 2 more variables: Generation <dbl>, Legendary <lgl>
    > 
    

    可以使用矢量theSheets$idlapply() 从 Google Drive 中读取一组工作表,如下所示:

    sheetList <- lapply(theSheets$id,sheet_read)
    

    要读取 Google 表格电子表格中的多个工作表,我们将 sheet= 参数添加到 sheet_read()。在这里,我们从 Pokémon Stats 电子表格的第二个工作表中读取了 Pokémon Types。

    pokemonTypes <- sheets_read(theSheets$id[1],sheet = 2)
    head(pokemonTypes)
    

    ...和输出:

    > head(pokemonTypes)
    # A tibble: 6 x 1
      Type    
      <chr>   
    1 Fire    
    2 Grass   
    3 Poison  
    4 Water   
    5 Bug     
    6 Fighting
    > 
    

    读取电子表格中的所有工作表

    我们可以自动化从单个电子表格中读取多个标签的过程。 sheets_sheets() 函数可用于此目的。

    # technique where we read multiple worksheets by worksheet name
    # using functions from googlesheets4 version 0.2.0. 
    theSheets <-gs4_find()
    # get metadata from first sheet
    sheetMetadata <- gs4_get(theSheets$id[1])
    # get worksheet tab names
    sheetNames <- sheet_names(theSheets$id[1])
    sheetNames
    

    此时我们可以看到 Pokémon Stats 电子表格中有两个工作表选项卡。我们使用向量sheetNameslapply() 来读取主电子表格中的所有工作表。

    theWorksheets <- lapply(sheetNames, function(x){             
         sheets_read(theSheets$id[1],sheet = x) 
    })
    # use the `names()` function to name the data frames stored in the list
    names(theWorksheets) <- sheetNames
    lapply(theWorksheets,head)
    

    ...和输出:

    > lapply(theWorksheets,head)
    $Pokemon
    # A tibble: 6 x 13
      Number Name  Type1 Type2 Total    HP Attack Defense SpecialAtk SpecialDef Speed
       <dbl> <chr> <chr> <chr> <dbl> <dbl>  <dbl>   <dbl>      <dbl>      <dbl> <dbl>
    1      1 Bulb… Grass Pois…   318    45     49      49         65         65    45
    2      2 Ivys… Grass Pois…   405    60     62      63         80         80    60
    3      3 Venu… Grass Pois…   525    80     82      83        100        100    80
    4      3 Venu… Grass Pois…   625    80    100     123        122        120    80
    5      4 Char… Fire  NA      309    39     52      43         60         50    65
    6      5 Char… Fire  NA      405    58     64      58         80         65    80
    # … with 2 more variables: Generation <dbl>, Legendary <lgl>
    
    $Metadata
    # A tibble: 6 x 1
      Type    
      <chr>   
    1 Fire    
    2 Grass   
    3 Poison  
    4 Water   
    5 Bug     
    6 Fighting
    
    > 
    

    此时可以使用提取运算符的$ 形式访问各个工作表,例如theWorksheets$PokemontheWorksheets$Metadata

    【讨论】:

    • 谢谢!但是,我希望使用它来阅读不在我帐户上的仅限公众查看的 Google 表格。对于上下文,我正在制作一个可以自动从该网站下载和清理数据的包:critrolestats.com/stats-vm。大部分数据都是公开的谷歌表格形式,但我不希望用户必须进行身份验证或将这些表格放在他们的驱动器中才能使用它。我尝试使用包中的gs4_deauth() 函数,但这只是吐出Error: could not find function "gs4_auth"。你会碰巧知道一个解决方法吗?
    • 没关系 - 我的笔记本电脑上的 R 似乎已经过时,导致错误。再次感谢您的帮助!
    • 由于 sheet_sheets() 已被弃用,我无法完成这项工作,有什么解决方法吗?
    • @MarcioRodrigues - 已弃用的代码(目前)仍然有效,但会生成警告消息。此外,警告消息提供了替换 sheets_sheets()sheets_get() 的函数的名称。我将更新我的答案以包含新功能,sheet_names()gs4_get()
    • 我使用函数 gs4_deauth() 解决了它,它起作用了。参考:googlesheets4.tidyverse.org/articles/articles/auth.html谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    • 2018-07-17
    相关资源
    最近更新 更多