初心者でも簡単にできる！！Googleスプレッドシートの情報をRubyを使って整理する！！！

現在私自身がRubyの復習をしている中で、GASと似たようなことをRubyでやろうとしたのが今回の記事になります。Rubyを習いたての方や、Google Apiを使用してみたいという方は是非とも最後までお読みください！！
なお、「ハッシュ」や「配列」、「引数」の知識があると、この内容を理解しやすいと思いますm(_ _)m

#やりたいこと
今回はGoogleスプレッドシートの情報から必要な情報だけ取り出して新しいワークシートを作成して保存するというのをやっていきます。

【↓実行前】
<img width="1382" alt="スクリーンショット 2019-06-18 17.35.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155553/c3c93eb6-b914-190d-2529-08063bb29ea0.png">

【↓実行後（「東京都」だけの情報を取り出した）結果】
<img width="1207" alt="スクリーンショット 2019-06-18 16.57.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155553/94b208a2-355e-041d-01b2-9d8a02627809.png">

私は練習のため、このようにラーメン店の情報を記入したスプレッドシートを作成しました。
自分の書いたコードでスプレッドシートを操作するにはGoogleが用意している「Google Sheets API」と連携させる必要があるのでまずはその設定をします。

##「Google Sheets API」との連携手順
こちらに関しましては、既に詳しく書かれている記事がありますのでこちらのリンク先を是非ともご参考にして頂ければと思います！
・![Google Drive APIの有効化とクライアントID、クライアントシークレットの取得方法](https://www.virment.com/google-drive-api-activate/)

##Gemをインストール
ターミナルにて下記を実行してGemをインストールします。

```
gem install google_drive
```

##config.jsonを作成
config.jsonというファイルを作成し、下記の通り記述する。

```json:config.json
"client_id": "ここにクライアントIDをコピペ.apps.googleusercontent.com",
"client_secret": "ここにクライアントシークレットをコピペ",
```
こちらのファイルは後に実行すると中身が書き換わりますが、正しい挙動ですのでご心配なく！！

##Rubyファイルを作成して、スプレッドシートの情報を取得する
次に、スプレッドシートの情報を読み込むためのコードを書いていきます。

```google-sheets-api.rb
session = GoogleDrive::Session.from_config("config.json")
sp = session.spreadsheet_by_url("スプレッドシートのURL")
ws = sp.worksheet_by_title("ワークシートの名前")
```

上記は、まずconfig.jsonを通じて、googleのAPIとの連携をします。
そして変数sp（スプレッドシートの略）に対してスプレッドシートの情報を入れています。
そして変数wsに対しては、ワークシートの名前を入れることでその書き込んだ名前のワークシートの情報を取得して入れることができます。

今回私は最初に載せました「原文シート」の情報をまずは取り出したいので

```
ws = sp.worksheet_by_title("原文シート")
```
と記述しています。

##メソッドを定義する
メソッド名をなんでも良いので決めて書きましょう！

```google-sheets-api.rb
def extract_by_prefecture(ws, sp)

end

extract_by_prefecture(ws, sp)
```

今回行おうとしているのが、与えられたラーメン屋さんの情報を指定した都道府県名で絞り出して、その情報を新しいワークシートを作成して載せるという作業なのでそのような名前をメソッド名としています。
1番下のメソッド呼び出しの際に、始めに得ているスプレッドシートとワークシートの情報を引数として与えることで、メソッドの中身でその情報を使えるようにします。

##ユーザーからの情報を取得する
今回ユーザーから欲しい情報は都道府県名ですので、下記のようにgets.chompを用いて情報を受け取れるようにコードを書いていきます。

```google-sheets-api.rb
def extract_by_prefecture(ws, sp)
  puts "新たなシートを作成したい都道府県名を入力してください（例、「東京」「沖縄」etc.）。"
  p_name = gets.chomp
end

extract_by_prefecture(ws, sp)
```

##与えられた都道府県に該当する情報だけを配列に入れていく
前の手順で取得した都道府県名だけの情報を得たいので、下記のように書いていきます。

```google-sheets-api.rb
def extract_by_prefecture(ws, sp)
  puts "新たなシートを作成したい都道府県名を入力してください（例、「東京」「沖縄」etc.）。"
  p_name = gets.chomp

  datas = []
  n = 2

  while true do
    place = ws[n, 2]
    if place == p_name
      data = {}
      data[:name] = ws[n, 1]
      data[:genre] = ws[n, 3]
      data[:taste] = ws[n, 4]
      data[:hard] = ws[n, 5]
      data[:recom] = ws[n, 6]
      datas << data
    elsif place.empty?
      break
    end
    n += 1
  end
end

extract_by_prefecture(ws, sp)
```

まず``datas = []``と書くことで、取得したい都道府県のラーメン屋さんの情報を入れていくための配列を用意しています。

次に``n = 2``と書かれているのですが、この話をする前にセルの仕組み（行とか列について）があまり分からないよという方は次の項目をご確認してからこちらに戻っていただき以下説明をご覧ください！！

今回都道府県名が書かれているのは二列目（B列）です。1行目は場所（都道府県）と書かれているため、実際に書かれているラーメン屋さんの情報は2行目以下にありますので、```n = 2```とすることで2行目以下にある情報を取得するための準備をしています。

while文を使って、一行ずつスプレッドシートの都道府県とユーザーが入力した都道府県名が一致するかどうかを繰り返し確認していきます

``place = ws[n, 2]``ではplaceという変数に対し、n行目の2列目（B列）の情報、すなわち都道府県が代入されるようにしています。

``if place == p_name``にて、もしスプレッドシートの都道府県に該当するplaceとユーザーが入力したｐ_nameの都道府県名が一致したらという条件文を書いています。

```google-sheets-api.rb
    data = {}
    data[:name] = ws[n, 1]
    data[:genre] = ws[n, 3]
    data[:taste] = ws[n, 4]
    data[:hard] = ws[n, 5]
    data[:recom] = ws[n, 6]
```

都道府県名が一致した場合にはそのラーメンの情報をハッシュとして保存するため、```data = {}```を最初に書いてます。data[:name]以下にてお店の名前や味の種類をkeyとして、値にはそれぞれのkeyに対応するスプレッドシートの情報が入るように指定しています。

そして最後に``datas << data``により、ハッシュの情報が最初に作った配列に格納されるようにします。

```google-sheets-api.rb
elsif place.empty?
  break
end
```
elsifaの条件にてempty？メソッドを使うことで、スプレッドシート上の都道府県の情報が入っているのかどうか確かめます。もしtrueならば、それはスプレッドシートの情報が尽きたことを表すので（＊本事例では、都道府県の情報を空にはできないことを前提にしています。）、break文で繰り返し処理が終了するようにしています。

以上で、入力された都道府県のラーメン屋さんの情報を配列に入れることができます。

##セルの仕組みについて
最初に載せた画像を例にします。
<img width="1382" alt="スクリーンショット 2019-06-18 17.35.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155553/0b947102-e5cb-51ee-df27-57763abed3b0.png">



縦は「列」で、横は「行」で表されます。wsとういう変数に上記画像のワークシートの情報が入っているとすれば、例えばws[1, 3]とは「味の種類」を、ws[5, 1]とは「ラーメン田中」のことを指します。

##新しいワークシートを自動で作成させる
先にコードを載せて解説します。

```google-sheets-api.rb

def extract_by_prefecture(ws, sp)
  puts "新たなシートを作成したい都道府県名を入力してください（例、「東京」「沖縄」etc.）。"
  p_name = gets.chomp

  datas = []
  n = 2

  while true do
    place = ws[n, 2]
    if place == p_name
      data = {}
      data[:name] = ws[n, 1]
      data[:genre] = ws[n, 3]
      data[:taste] = ws[n, 4]
      data[:hard] = ws[n, 5]
      data[:recom] = ws[n, 6]
      datas << data
    elsif place.empty?
      break
    end
    n += 1
  end

  extract_by_prefecture(ws, sp)
  sp.add_worksheet("#{p_name}")
  ws = sp.worksheet_by_title("#{p_name}")
  ws[1, 1] = "お店の名前"
  ws[1, 2] = "味の種類"
  ws[1, 3] = "味の濃さ"
  ws[1, 4] = "麺の硬さ"
  ws[1, 5] = "おすすめ度"
end

```

``add_worksheet("作成したいワークシートの名前")``を使用することで、新しいワークシートを作成することができます。今回はspという変数にスプレッドシートの情報が入っているので、``sp.add_worksheet("#{p_name}")``とすることで、spに中身であるスプレッドシート内に新規ワークシートが作成されます。なお、今回ワークシートの名前には都道府県名を入れたいため、ユーザーが入力した都道府県名が入るようにp_nameと書いています。なお文字列の中に変数を入れるため#{}で囲っています。

また、``ws = sp.worksheet_by_title("#{p_name}")``にてwsの中身を新しく作成したワークシートの情報に置き換えています。

``ws[1, 1] = "お店の名前"``以下では、ワークシートの一行目にラーメンの情報で「お店の名前」、「味の種類」といった見出しの部分を作るためのコードになっています。

##新しいワークシートに情報を書き込ませる

```google-sheets-api.rb

def extract_by_prefecture(ws, sp)
  puts "新たなシートを作成したい都道府県名を入力してください（例、「東京」「沖縄」etc.）。"
  p_name = gets.chomp

  datas = []
  n = 2

  while true do
    place = ws[n, 2]
    if place == p_name
      data = {}
      data[:name] = ws[n, 1]
      data[:genre] = ws[n, 3]
      data[:taste] = ws[n, 4]
      data[:hard] = ws[n, 5]
      data[:recom] = ws[n, 6]
      datas << data
    elsif place.empty?
      break
    end
    n += 1
  end

  extract_by_prefecture(ws, sp)
  sp.add_worksheet("#{p_name}")
  ws = sp.worksheet_by_title("#{p_name}")
  ws[1, 1] = "お店の名前"
  ws[1, 2] = "味の種類"
  ws[1, 3] = "味の濃さ"
  ws[1, 4] = "麺の硬さ"
  ws[1, 5] = "おすすめ度"

  m = 2
  datas.each do |data|
    ws[m, 1] = data[:name]
    ws[m, 2] = data[:genre]
    ws[m, 3] = data[:taste]
    ws[m, 4] = data[:hard]
    ws[m, 5] = data[:recom]

    m += 1
  end

  ws.save
end

```

変数のmにはワークシートの2行目以降の情報を入れていくため2を代入します。そして配列であるdatasをeach文を使ってラーメン屋さんの情報を1つずつハッシュからキーを指定して取り出し、スプレッドシートに書き込ませていきます。

最後に、新しく作成したワークシートを保存するため、``ws.save``と書いて終わりです。これを書かないとワークシートに書き込んだ情報が保存されないので忘れないようにしてください。

##以下、完成形と実行結果

```google-sheets-api.rb
session = GoogleDrive::Session.from_config("config.json")
sp = session.spreadsheet_by_url("スプレッドシートのURL")
ws = sp.worksheet_by_title("ワークシートの名前")

def extract_by_prefecture(ws, sp)
  puts "新たなシートを作成したい都道府県名を入力してください（例、「東京」「沖縄」etc.）。"
  p_name = gets.chomp

  datas = []
  n = 2

  while true do
    place = ws[n, 2]
    if place == p_name
      data = {}
      data[:name] = ws[n, 1]
      data[:genre] = ws[n, 3]
      data[:taste] = ws[n, 4]
      data[:hard] = ws[n, 5]
      data[:recom] = ws[n, 6]
      datas << data
    elsif place.empty?
      break
    end
    n += 1
  end

  extract_by_prefecture(ws, sp)
  sp.add_worksheet("#{p_name}")
  ws = sp.worksheet_by_title("#{p_name}")
  ws[1, 1] = "お店の名前"
  ws[1, 2] = "味の種類"
  ws[1, 3] = "味の濃さ"
  ws[1, 4] = "麺の硬さ"
  ws[1, 5] = "おすすめ度"

  m = 2
  datas.each do |data|
    ws[m, 1] = data[:name]
    ws[m, 2] = data[:genre]
    ws[m, 3] = data[:taste]
    ws[m, 4] = data[:hard]
    ws[m, 5] = data[:recom]

    m += 1
  end

  ws.save
end

extract_by_prefecture(ws, sp)
```
ターミナルにて以下のように実行すれば、入力した都道府県名で新たにワークシートが作成され、中身も情報が入っていることが確認できるかと思います。

```ターミナル
$ ruby google-sheets-api.rb
```

実行後、下記の画像のように新しいワークシートと中身（情報）があれば成功です！！
<img width="1207" alt="スクリーンショット 2019-06-18 16.57.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155553/f52c6af0-2c32-bf1c-8aa2-8ade02e1a2ad.png">


##おわりに
今回は僕が練習用に作った仮のスプレッドシートに合わせてコードを書きました。今回の記事の内容を応用していけば、取得した情報を人気順に並び替えるですとか、複数のスプレッドシートやワークシートに散らばった情報を1つに集約するといったこともできるようになります。是非ともご自身や会社での膨大な情報を整理する際に、こうしたやり方もご参考にして頂ければと思います。


参考リンク先
・![Google Drive APIの有効化とクライアントID、クライアントシークレットの取得方法](https://www.virment.com/google-drive-api-activate/)
・![RubyでGoogleスプレッドシートを読み込み・書き込みする](https://www.virment.com/ruby-google-drive-readwrite/)