[Rails]GoogleSheetsをAPIで操作してみた[Ruby]


# はじめに

こんにちわ。
RPA、作業の自動化に関して、興味を持って色々勉強しているひとです。

「なんかこれ毎回同じことしてない...?」

と感じることが最近ままありまして、自動化やってみたい！と思ったので、すぐに実践。　　
とりあえずプログラムが書けるように、環境を構築しないと。

この記事は、備忘録として書いていきますが、見ていってくれる皆さんの何かお役に立てれば幸いです。


##### 参考, 引用記事: 
>
[TECHBLOG by GMO RubyでGoogle スプレッドシートを操作する
](https://techblog.gmo-ap.jp/2018/12/04/ruby_google_sheets_drive/)
[Google Sheets and Ruby](https://www.youtube.com/watch?v=VqoSUSy011I&t=10s)： [ by Twilio](https://www.youtube.com/channel/UCWh3G9LZmZ3q_xWOyPpn8ag) 　　//　Youtube です
>

<br>
##　今回の目的: GoogleSheetsをRubyで動かしてみる
<br>









---

## 目次


1. Google API Console で Google Drive API と Google Sheets APIを有効(ENABLE)にする
2. Creditials でサービスアカウントを作り、JSON形式のPrivate Keyを取得
3. gem "google_drive" を入れて、 bundle install
4. 実行ファイルと同じ場所に、client_secret.json(先ほど取得したJSONファイル)を入れる
5. Google Sheetsの共有で、Service AccountのEmailで認証
6. プログラムを組む
7. 実行

---



##　1.Google API Console で Google Drive API と Google Sheets APIを有効(ENABLE)にする

   [Google Apis Library](https://console.cloud.google.com/apis/library)で下にスクロールすると、
・Google Drive API
・Google Sheets API
があるので、それぞれ有効(Enable)にします。


![google_apis_pic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676891/a511aa92-2b08-322a-6c4e-df958495af75.png)



<br>


## 2.Credentials でサービスアカウントを作り、JSON形式のPrivate Keyを取得


上の画面のハンバーガーボタンから > APIとサービス > 認証情報　

##### 1.サービスアカウント

サービスアカウントがない人は、「認証情報を作成」 > 「サービスアカウント」
※Googleのサイト はデザインがよく変わるので、頑張って見つけましょう

![create_serviceAccount.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676891/99e41d2d-aec1-ff02-5544-8d99a5a360db.gif)

<br>
<br>
<br>
<br>
<br>

##### 2.サービスアカウントからプライベートキーを作る

![download_config_json.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676891/f6bc0a8b-d961-e198-0345-e964ded3a49f.gif)

<br>



## 3.gem "google_drive" を入れて、 bundle install

<br>

```Ruby:Gemfile
gem 'google_drive'
```

```
$ bundle install
```

<br>


## 4.実行ファイルと同じ場所に、credentials.json(先ほど取得したJSONファイル)を入れる

僕は、Railsアプリを構成しているので
>
・実行ファイル.rb ----------    /lib/spreadsheet.rb
・jsonファイル   ----------    /config/credentials.json
>

にそれぞれ置いています。 Rails使わない方は、[Twilio](https://www.youtube.com/channel/UCWh3G9LZmZ3q_xWOyPpn8ag)のビデオの通りに同じ階層に置きましょう。

あと、Git管理なら gitignoreを忘れないようにしましょう！


<br>
<br>


## 5.Google Sheetsの共有で、Service AccountのEmailで認証



1.[GoogleSheets](https://www.google.com/intl/ja_jp/sheets/about/)でスプレッドシートを選んで、空白のシート作る

<br>

2.シートの名前をつけて、サービスアカウントのメールアドレスで共有可能にする

##### 共有 > ユーザーやグループを追加 で、jsonファイルのメールアドレスをコピーして共有


```json:credentials.json
{
  "type": "service_account",
  "project_id": "sound-helper-*******",
  "private_key_id": "**************************",
  "private_key": "-----BEGIN PRIVATE KEY----- *******"
  "client_email": "test-pcr-ruby@**************.gserviceaccount.com",  < ココです！
  "client_id": "000000000000000000",
  "auth_uri": "******************************",
  "token_uri": "******************************",
  "auth_provider_x509_cert_url": "************************************",
  "client_x509_cert_url": "**************************************"
}

```

<br>
<br>



## 6.プログラムを組む


```Ruby:spreadsheet.rb
require 'bundler'
Bundler.require

# jsonファイルがある場所
session = GoogleDrive::Session.from_service_account_key("../config/credentials.json")

# titleはシート名
spreadsheet = session.spreadsheet_by_title("test_ruby")
worksheet = spreadsheet.worksheets.first

worksheet.rows.first(10).each { |row| puts row.first(10).reverse.join(" | ") }
```
これで動くか確認。

## 7.実行
<br>

```terminal:/lib
$ bundle exec ruby spreadsheet.rb
```
> Bundlerあたりについて　-- [Bundler入門 - setupとrequire を読みとく](https://qiita.com/kotaroito/items/52ab922f74bee83a9006)


<br>
[オープンデータ | 厚生労働省](https://www.mhlw.go.jp/stf/covid-19/open-data.html)　「新規陽性者数の推移（日別）」を借りました。

ファイル > インポート > アップロード

神奈川県の、直近30日の新規感染者の総数とか出してみます。

```Ruby:spreadsheet.rb
require 'bundler'
Bundler.require

# jsonファイルがある場所
session = GoogleDrive::Session.from_service_account_key("../config/credentials.json")

# titleはシート名
spreadsheet = session.spreadsheet_by_title("test_ruby")
worksheet = spreadsheet.worksheets.first

counter = 0
range = 47 * 30

worksheet.rows.last(range).each { |row| counter += row[2].to_i if row[1] == "Kanagawa" }

puts "神奈川県の直近30日の新規感染者数: #{counter}人"

worksheet["E2"] = "Newly Comfirmed Case"
worksheet["E3"] = "Last 30 days in Kanagawa:"
worksheet["F3"] = counter

worksheet.save  # sheetに反映させるならsave
```

<br>

##### Logに出力
![kanagawa_last_month.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676891/4b1d7468-f9a8-11a5-96e5-1cf620f7a515.png)

##### セルを直接指定すれば入力もやってくれます
![kanagawa_last_manth.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676891/0d437483-ee18-09cd-4b49-50a00025c698.png)


##　おわりに

##### お疲れ様でした。　
これで実行できるようになったのであとはアルゴリズムやら別のAPIやら勉強してRPAできるように精進します！！