【R】googlesheets4
2020年5月12日
					1. はじめに
googlesheets4は、そのものずばりRでGooglesheetを使用するためのパッケージです。従来使われてきたgooglesheetsは2020年9月30日で廃版となるようです。googlesheets4はより使いやすくなっているようです。
2. インストール
CRANからインストールできます。
install.packages("googlesheets4")
3. 使ってみる
3.1 パッケージ読込
まずは、パッケージの読込
library(googlesheets4)
3.2 ファイル読込
read_sheetの引数に読み込みたいSheetのURLを入力します。最初の利用ではGoogleから認証が求められます。
ここでは、”gapminder”というSheetを例に説明します。
read_sheet("https://docs.google.com/spreadsheets/d/1U6Cf_qEOhiR9AZqTqS3mbMF3zt2db48ZP5v3rkrAEJY/edit#gid=780868077")
#> Reading from "gapminder"
#> Range "Africa"
#> # A tibble: 624 x 6
#>   country continent  year lifeExp      pop gdpPercap
#>   <chr>   <chr>     <dbl>   <dbl>    <dbl>     <dbl>
#> 1 Algeria Africa     1952    43.1  9279525     2449.
#> 2 Algeria Africa     1957    45.7 10270856     3014.
#> 3 Algeria Africa     1962    48.3 11000948     2551.
#> 4 Algeria Africa     1967    51.4 12760499     3247.
#> 5 Algeria Africa     1972    54.5 14760787     4183.
#> # … with 619 more rows
シートをIDや名前で操作したい場合がほとんどですが、この時は次のように取得できます。
gap_id <- gs4_example("gapminder")
class(gap_id)
#> [1] "sheets_id" "drive_id"
unclass(gap_id)
#>                                      gapminder 
#> "1U6Cf_qEOhiR9AZqTqS3mbMF3zt2db48ZP5v3rkrAEJY"
gap_id
#>   Spreadsheet name: gapminder
#>                 ID: 1U6Cf_qEOhiR9AZqTqS3mbMF3zt2db48ZP5v3rkrAEJY
#>             Locale: en_US
#>          Time zone: America/Los_Angeles
#>        # of sheets: 5
#> 
#> (Sheet name): (Nominal extent in rows x columns)
#>       Africa: 625 x 6
#>     Americas: 301 x 6
#>         Asia: 397 x 6
#>       Europe: 361 x 6
#>      Oceania: 25 x 6
#> 
#> (Named range): (A1 range)        
#>        canada: 'Americas'!A38:F49
次のように、シート名(Asia)とコラム(A:D)を指定して読み込むことも可能です。
gs4_example("gapminder") %>%
  read_sheet(range = "Asia!A:D")
#> Reading from "gapminder"
#> Range "'Asia'!A:D"
#> # A tibble: 396 x 4
#>   country     continent  year lifeExp
#>   <chr>       <chr>     <dbl>   <dbl>
#> 1 Afghanistan Asia       1952    28.8
#> 2 Afghanistan Asia       1957    30.3
#> 3 Afghanistan Asia       1962    32.0
#> 4 Afghanistan Asia       1967    34.0
#> 5 Afghanistan Asia       1972    36.1
3.2 書き込みと編集
ファイルの生成は、gs4_createです。ここでは、able-aardvardというファイル名で、irisとmtcarsのデータのhead部をそれぞれflowersとautosというシート名で作成して保存しています。
ss <- gs4_create( "able-aardvark", sheets = list(flowers = head(iris), autos = head(mtcars)) ) #> Creating new Sheet: "able-aardvark" ss #> Spreadsheet name: able-aardvark #> ID: 1OV9Mxf-NdTyB1ChmlVKEFy0e1AaPAJCahzcWBw1w3qQ #> Locale: en_US #> Time zone: Etc/GMT #> # of sheets: 2 #> #> (Sheet name): (Nominal extent in rows x columns) #> flowers: 7 x 5 #> autos: 7 x 11 read_sheet(ss) #> Reading from "able-aardvark" #> Range "flowers" #> # A tibble: 6 x 5 #> Sepal.Length Sepal.Width Petal.Length Petal.Width Species #> <dbl> <dbl> <dbl> <dbl> <chr> #> 1 5.1 3.5 1.4 0.2 setosa #> 2 4.9 3 1.4 0.2 setosa #> 3 4.7 3.2 1.3 0.2 setosa #> 4 4.6 3.1 1.5 0.2 setosa #> 5 5 3.6 1.4 0.2 setosa #> # … with 1 more row
ファイルを標準のブラウザで開きたいときは、次のようにgs4_broeseを利用します。
gs4_browse(ss)
続いて、次のようにデータを新たなワークシートに挿入してみます。
my_data <- data.frame(
  numbers = c(1, 5, 3, 2, 4, 6),
  letters = letters[1:6]
)
write_sheet(my_data, ss = ss)
#> Writing to "able-aardvark"
#> Writing to sheet "my_data"
ss
#>   Spreadsheet name: able-aardvark
#>                 ID: 1OV9Mxf-NdTyB1ChmlVKEFy0e1AaPAJCahzcWBw1w3qQ
#>             Locale: en_US
#>          Time zone: Etc/GMT
#>        # of sheets: 3
#> 
#> (Sheet name): (Nominal extent in rows x columns)
#>      flowers: 7 x 5
#>        autos: 7 x 11
#>      my_data: 7 x 2
さらにその下にデータを追加してみます。
my_summaries <- data.frame(
  x = gs4_formula('=SPARKLINE(A2:A7, {"color", "blue"})'),
  y = gs4_formula('=JOIN("-", B2:B7)')
)
ss %>%
  sheet_append(my_summaries, sheet = "my_data")
#> Writing to "able-aardvark"
#> Appending 1 row(s) to "my_data"
3.3 ファイル削除
このAPIにはファイルを削除する機能はありません。ファイルを削除するには、次のようにDriveAPIを利用します。
googledrive::drive_trash(ss)
#> Files trashed:
#>   * able-aardvark: 1OV9Mxf-NdTyB1ChmlVKEFy0e1AaPAJCahzcWBw1w3qQ
4. さいごに
個人的には、spreadsheetを使う機会はあまりないのですが、このようにプログラミングでsheetを操作できると作業が効率化しそうですね。