もう「ローカルに保存」から卒業だ　RからなんでもGSuiteに入れて最強テレワーク人材になる

# ローカル保存？なにそれ美味しいの？
「.csvでくれ」
「.xlsやる」
「メールで送った」

最近この辺のワードほぼ聞かなくなりました。
だってGSuiteに入ってたら、ファイルのURLだけ事前に共有したら
あとは各々勝手に自動化出来るんだもん。

と、名前は知ってるけど案外みんな使ってないらしい？
R用GSuite周りの便利パッケージのご紹介で一記事書いてみました。
どちらもRユーザの女神、 <a href="https://twitter.com/jennybryan">jenny bc</a>女史がメンテナです。
https://googledrive.tidyverse.org/
https://googlesheets4.tidyverse.org/

## まずはいつもの下準備
```R
pacman::p_load(googledrive, googlesheets4, tidyverse)
```

## データを読み込もう
@Naru-T さんの記事が参考になります。
https://qiita.com/naru-T/items/868548a91064bf7ae7c1 

```R
drive_find(n_max = 10)
```
こちらを実行すると、別ウィンドウでGoogleの認証画面が開きます。
「とりあえず試す」だけならこれだけで殆どの用が足ります。

スクリプト内で認証させたい時は 
```drive_auth(path = token_json_path)```
などとして手動で制御しましょう。

## 「従来のファイルシステム」とはちょっと違うのに慣れよう
従来のツリー型ファイルシステムとはちょっと違う部分が色々あります。
<b>「同じ名前のファイルが複数存在出来る」</b>などがその例です。

これはS3やcloudstoreに慣れてる方なら違和感ないと思うのですが、
<b>従来のファイル名の代わりに、ファイルID</b>で管理されているのでそんな事が可能です。
（見えているのは正確にはファイル名、じゃなく「タイトル」というメタデータです）
そしてファイルやフォルダのURLが、そのままIDとして使える仕組みになっています。
ブラウザで見てるURLをそのままシェアすれば、認証済みの他の人からすぐ見えるわけです。

これは慣れると非常に便利でして、「IDで指定」していれば、
書き出し対象のファイル名を誰かが変更しているような時でもデータの上書きが出来ます。

# 共有ドライブ(旧チームドライブ・TD)を使う
GSuiteに慣れている方ならTDの超絶便利さはご存知かと思います。
TDを使うには事前にそれを認証する必要があります。

```R
  oreno_td <<- team_drive_get("Oreno-TD-Name")
  somedir_on_td <<- drive_get(as_id("1RV-f8Q*******************_x1n3"), team_drive = oreno_td) 
```
このように team_drive_get()関数で名前を指定すると共有ドライブの dribble が取得できます。
それを team_drive 引数に渡してあげると、共有ドライブ内のフォルダなどにアクセスが出来ます。


# drive_upload() と仲良くなろう
僕の用事の殆どは、「.csvファイルをgsheetとしてアップする」です。
このようにします。

```R
filename = "~/data/today.csv"

  dribble_thisfile <- drive_upload(
    media = filename,
    path = somedir_on_td,
    name = basename(filename),
    type = "spreadsheet"
  )
```

dribble というのはGSuiteのファイルに必要なメタデータを便利な形にまとめた tibble です。
中身はこのように帰ってきます：

```
> dribble_thisfile
# A tibble: 1 x 4
  name               id                                  drive_resource   url                                                             
  <chr>              <chr>                               <list>           <chr>                                                           
1 today.csv          1cBF0TpIx*********************xt2c… <named list [32… https://docs.google.com/spreadsheets/d/1cBF0TpIx…

> dribble_thisfile$url
https://docs.google.com/spreadsheets/d/1cBF0TpIx_P*****************dH2Eo/edit?usp=drivesdk   
```
このURLをslackに投げるだけで、誰かにデータを渡せて便利です！



あれ、中身薄いな (;´д`)
Advent カレンダーって初めて書くんですがこんなんで良いんだろうか


# 自作のちょっと便利な関数のご紹介
「お、このデータちょっとええやんけ。他チームのおまい、これ見てどう思う？」

があった時に、以前だと

```
・tibble を %>% write_tsv("ファイル名手打ち.csv") する
・サーバから落とす
・ローカル保存フォルダ開く
・メーラー開く
・ファイルはっつける
・宛名書く
・本文書く
・送信押す
・数秒待つ
・「おーいメール見てや〜」
```

と、ぼちぼち面倒な手順を踏んでいました。

これを

```
・upload_obj(tibble)する
・「おーいslack見てや〜」
```
の2ステップで出来るようにしたいと思います。


### upload_obj()
gsheets専用パッケージ```googlesheets4```パッケージを使う方法は、処理がとても遅いです。
「認証付けて読み込み」「既存のgsheetの一部を編集」以外の用事では、
```googledrive```のタイプ指定を使ったほうが早くて快適です。

```R
upload_obj <- function(obj, filename = NULL, timestamp = TRUE, gid = NULL){
  temp_dir <- "~/.r_temp/"
  
  # もしfilenameがNULLだったらオブジェクト名をファイル名に
  if (is.null(filename)) {
    filename <- paste0(temp_dir, deparse(substitute(obj)), ".tsv")
  }
  
  if(is.null(gid)) {
    #デフォルトはこれ
    export_dir <- default_somedir_on_td
  } else {
    # もし gid が 指定されてたら dribbleに変換
    # "https://drive.google.com/drive/u/0/folders/1Dp_***********Rtkg"のような、URLそのままでOK
    export_dir <- drive_get(as_id(gid))
  }
  
  # timestamp = TRUEならファイル名に日時を足して上書き (デフォルトTRUE)
  export_filename <- paste0(temp_dir, filename)
  # タイムスタンプを足す
  if(timestamp == TRUE) {
    export_filename <- paste0( 
      tools::file_path_sans_ext(filename), "_", 
      format(Sys.time(), "%Y%m%d-%H%M"), ".", tools::file_ext(filename)) 
  }
  
  # 一旦ローカルに書き出し
  write_tsv(obj, export_filename)
  
  # 書き出したファイルをアップロード
  dribble_thisfile <- drive_upload(
    media = export_filename,
    path = export_dir,
    name = basename(export_filename),
    type = "spreadsheet"
  )
  
  # 結果を表示して終了 覚えづらいので $url を付け直す
  dribble_thisfile$url <- dribble_thisfile$drive_resource[[1]]$webViewLink
  
  upload_results_msg <- 
    paste("mailab_obj_upload:", basename(filename), "as", 
          dribble_thisfile$drive_resource[[1]]$name, "sent to", 
          dribble_thisfile$drive_resource[[1]]$webViewLink, " ")
  print(upload_results_msg)
  
  return(dribble_thisfile)
}
```
以上、なんか晒すのも恥ずかしいのですが
毎日みんなに便利と言ってもらえるので調子に乗って晒してみました。
```deparse(substitute(obj))```でオブジェクト名が取得できるのは案外知られてないらしいのでちょっとドヤ顔です。


# 使い方
```R
upload_obj(omoroi_data) %>% msg_slack
```
の一行だけで、チームのみんなにざっくりシェア出来るようになりました！
(msg_slack()も内製の関数です。別記事にて)

どこに居ても、どの端末からでも一つの場所にボンボン放り込めて便利です。
タイムスタンプも付けてくれるので勢いに任せてデータ掘ってる時など重宝しています。

指定した場所に上げたい時は、書き込み権限がある場所である事を確認して、
ブラウザで見えているURLをそのまま渡す事も出来ます。

```
upload_obj(omoroi_data, gid = "https://drive.google.com/drive/u/0/folders/1Dp_***********Rtkg") 
```


### 最後まで読んでいただいてありがとうございました！
適当に書くことにしてしまったのですが、
他の錚々たる皆様のような華のあるデータ分析記事じゃなくて (;´д`)ｺﾞﾒﾝﾅｻｲ
来年も地味ーにファイル送信とかスクレーピングとかをラクにするネタを細々と上げていきます。

あれ、```googlesheets4```の事書いてないな...