Rを使ってGoogleスプレッドシートにAPI v4でアクセスするgooglesheets4

かつてRを使ってGoogle Sheetsにアクセスするためにgooglesheetsというパッケージが存在しました。

GitHub – jennybc/googlesheets: Google Spreadsheets R API
Rで解析:Googleスプレッドシートの操作ができる!「googlesheets」パッケージの紹介

しかしこのパッケージが使っているGoogle SheetsのAPI v3は2020年3月にサービスが終了する予定です。
以降はAPI v4を利用する必要があります。

Migrate your apps to use the latest Sheets API version—turning down v3 API by 2020
Introduction to the Google Sheets API

ただ素晴らしいことにgooglesheetsの作者jennyさまがAPI v4に対応したパッケージを提供してくださっています。
googlesheets4です。

GitHub – tidyverse/googlesheets4: Google Spreadsheets R API (reboot of the googlesheets package)

導入

#R
install.packages("googlesheets4")
library(googlesheets4)
packageVersion("googlesheets4")
##[1] ‘0.1.0’

私の環境では問題なく導入できました。

認証

いくつもの認証方法がありますが、いちばん単純な方法は関数sheets_auth()を実行することです。

内部的にはjennyさまが作成されたgargleというライブラリを用いてgoogleへのアクセストークンを取得するという仕組みになっています。
GitHub – r-lib/gargle: Infrastructure for calling Google APIs from R, including auth

sheets_auth()
##Is it OK to cache OAuth access credentials in the folder '/home/tomoya/.R/gargle/gargle-oauth' between R sessions?
##
##1: Yes
##2: No
##
##Selection: 1
##Waiting for authentication in browser...
##Press Esc/Ctrl + C to abort

デフォルトブラウザが起動してもしGoogleへのログイン履歴が残っているならば、そのアカウントでのGoogle Sheetsへのアクセス権限の設定が要求されます。

ログインしたいメールアドレスを選択して、いい感じに権限設定してあげれば認証は完了です。

このようにGUIで操作せずに完全にプログラム的に処理したい場合はsheets_authで直接引数を設定してあげる方法もあります。

関数

googlesheetsでは多くの関数がgs_*という命名規則で与えられていました。
一方googlesheets4ではsheets_*が基本になっています。

表データを取得する

ただ目的が分析だけならば、おそらく主要関数sheets_readだけ覚えれば十分でしょう。
偉大なるjennyさまは他のtidyverseの関数群と統一性を持たせるためにエイリアス関数read_sheetも用意してくれています。すばらしすぎる。
当然sheets_read, read_sheetはともに他のtidyverseのread_*関数群と同様に戻り値はtibbleです。

read_sheetではシートの指定は複数の方法で柔軟に実施することができます。
個人的に推奨したいのはシートのIDを使って指定する方法です。
シートIDはURLを見て「 “…/d/” と “/edit#…” で囲まれた部分」で特定できます。
たとえばURLが

https://docs.google.com/spreadsheets/d/1ESTf_tH08qzWwFYRC1NVWJjswtLdZn9EGw5e3Z5wMzA/edit#gid=1210215306

ならばシートIDは1ESTf_tH08qzWwFYRC1NVWJjswtLdZn9EGw5e3Z5wMzAですね。
この場合read_sheetは次のように使います。

read_sheet(
  ss = "1ESTf_tH08qzWwFYRC1NVWJjswtLdZn9EGw5e3Z5wMzA",
  range = "arts!A5:F10"
)

なお、readxl::read_excelなどと同様にオプションでsheet, col_type, col_names, skipなどを指定できます。最高。

セル単位で値を取得する

表データとしてではなく、セル単位でデータを扱いたいこともあるでしょう。
その場合は関数sheets_cellsを使います。
セルの値だけではなく数式も同時に取得することができます。

(a <- sheets_cells("1ESTf_tH08qzWwFYRC1NVWJjswtLdZn9EGw5e3Z5wMzA", range = "arts!A5:F10"))
##Reading from 'deaths'
##Range "'arts'!A5:F10"
### A tibble: 36 x 4
##     row   col loc   cell      
##   <int> <dbl> <chr> <list>    
## 1     5     1 A5    <CELL_TEX>
## 2     5     2 B5    <CELL_TEX>
## 3     5     3 C5    <CELL_TEX>
## 4     5     4 D5    <CELL_TEX>
## 5     5     5 E5    <CELL_TEX>
## 6     5     6 F5    <CELL_TEX>
## 7     6     1 A6    <CELL_TEX>
## 8     6     2 B6    <CELL_TEX>
## 9     6     3 C6    <CELL_NUM>
##10     6     4 D6    <CELL_LOG>
### … with 26 more rows
a[a$loc == "C6",]$cell
##[[1]]
##$userEnteredValue
##$userEnteredValue$formulaValue
##[1] "=DATEDIF(E6,F6,\"y\")"
##
##$effectiveValue
##$effectiveValue$numberValue
##[1] 69
##
##$formattedValue
##[1] "69"
##
##attr(,"class")
##[1] "CELL_NUMERIC" "SHEETS_CELL" 

書き込み

ドキュメントによると現状書き込み機能はstill under heavy developmentであり、安定性を期待するべきではありません。
使いたい人は都度ドキュメントを参照しながら使うよう心がけましょう。

そもそもcranバージョンである0.1.0にはここの書き込み関数群は提供されていません。
使いたい場合はdevtools::install_github("tidyverse/googlesheets4")でdevバージョンをインストールしてください。

ここには現時点で主要な関数群を並べるだけにします。

sheets_create
新規のシートを作成する
sheets_write
既存のシートに値を書き込む。readと同様にwrite_sheetというエイリアス環境も提供している
sheets_append
既存のシートの最終行に値を追加する

Write Sheets • googlesheets4

参考