Code Journey

30代未経験からプログラミング挑戦中(追うものは追われる者に勝る)

Rubyのgem[google-drive-ruby]を利用してGoogleスプレットシートを操作する方法

はじめに

私は現在、フィヨルドブートキャンプで、未経験からプログラミング学習をしているものになります。

この記事は、自分自身が学習したことをまとめ、アウトプットすることを目的として書いていますので、間違いがある可能性がありますのでご注意ください。

なぜこの課題を選んだか

私は現在RubyとそのフレームワークであるRailsを学習しています。しかし与えられた課題に取り組むことがメインになっているので、自分で課題を持って何かコードを書いて学習してみようかな?と思い立ちました。

何をしようか考えた結果、表題にあるように、Rubyを使ってGoogleスプレッドシートにアクセスし、操作してみることにしました。

この課題を選んだ理由は、仕事でもGoogleスプレッドシートを使うことは多く、作業を自動化する際に、今後役立つのでは?、という不純な気持ちと身近な題材でプログラミング学習したことを実感したかったからです(笑)

実際にやってみたことをこの記事でアウトプットしたいと思います。

Google API Consoleで行う事前準備

Rubyのコードを書き始める前に、Googleスプレッドシートを操作するために必要な準備します。

まずはGoogle API Console(APIライブラリ)にアクセスして、自分のGoogleアカウントでログインします。

以下のようにまずは新規プロジェクトを作成します。

次は、「Google Drive API」と「Google Sheets API」を有効化します。

次は、「APIとサービス」> 「認証情報」へと進み、「認証情報を作成」>「OAuth クライアント ID」を選択。 必要事項を入力していくとクライアントIDとクライアントシークレットが発行されるので控えておきます。

google-drive-rubyをを使う

RubyGoogleスプレッドシートを操作するにはgoogle-drive-rubyを使います。

Google Drive/Docsのファイル/スプレッドシートを読み書きするためのRubyライブラリです。

google-drive-rubyのインストール

任意のディレクトリを作成してGemfileに以下を記述し$ bundle installします。

gem 'google_drive'

初回認証

初回実行時のみAPIの認証が必要になります。先ほど作成したクライアントIDとクライアントシークレットを使って以下のような任意の名前のjsonファイルを作成します。

config.json

{
  "client_id": "xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com",
  "client_secret": "xxxxxxxxxxxxxxxxxxxxxxxx"
}

事前に書き込みたいスプレッドシートを作成しておきます。そのスプレッドシートのURLのxxxxの部分をご自身のファイルのものに置き換えます。

https://docs.google.com/spreadsheets/d/xxxxxxxxxxxxxxxxxxxxxxxxxxx/

require "google_drive"

# jsonファイル名は先ほど作成したクライアントIDとクライアントシークレットが示されたファイル名を指定
session = GoogleDrive::Session.from_config("config.json")

# xxxxは置き換える
# worksheet[0]はまだないので[0](1シート目)を指定する
sheets = session.spreadsheet_by_key("xxxxxxxxxxxxxxxxxxxxxxxxxxx").worksheets[0]

# スプレッドシートへの書き込み
sheets[1,1] = "テストでA1に書き込みます"

# シートの保存
sheets.save

実行すると

❯ ruby test.rb 

1. Open this page:
https://accounts.google.com/o/oauth2/auth?access_type=xxxxxxxxxx

2. Enter the authorization code shown in the page:
  1. で出力されたURLをブラウザで開く、そこに表示された認証コードを2. Enter the authorization code shown in the page:のところに貼り付けるの認証が修了します!これでスプレッドシートを操作できる状態になりました!

この認証が完了すると先ほど作成したjsonファイルが自動で更新されます

{
  "client_id": "xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com",
  "client_secret": "xxxxxxxxxxxxxxx",
  "scope": [
    "https://www.googleapis.com/auth/drive",
    "https://spreadsheets.google.com/feeds/"
  ],
  "refresh_token": "xxxxxxxxxxxxxxx"
}

ファイルを実行してスプレッドシードに書き込んでみる

ファイルを実行してみる!

$ ruby test.rb

おお〜これでスプレッドシートに任意のセルに文字列を入力することができました。もちろんいろいろなことができます。

google-drive-rubyを使ってスプレッドシートを扱うあれこれ

Google Drive APIへのセッションを設定

session = GoogleDrive::Session.from_config("config.json") 

GoogleDrive::Session クラスを使用して、Google Drive APIへのセッションを設定しています。指定された "config.json" ファイルから認証情報を読み込み、それを使用してアプリケーションが Google Drive API にアクセスするためのセッションを確立します。

セッションが確立されると、アプリケーションはそのセッションを介して Google スプレッドシートなどの Google ドライブ リソースにアクセスし、読み書きすることができます。

処理対象のスプレッドシートを指定する

対象のスプレッドシートを指定します。操作したいスプレッドシードのURL(https://docs.google.com/spreadsheets/d/xxxxxx/edit#gid=0)のxxxxxxの部分は置き換えて操作してください。

sheets = session.spreadsheet_by_key("xxxxxxxxxxxxxxxxxxxxxxxxxxx").worksheets[0]

シート名で指定する

sheets = session.spreadsheet_by_key("xxxxxxxxxxxxxxxxxxxxxxxxxxx").worksheet_by_title("シート名")

URLでも指定可 なお、スプレッドシートはキーではなく、URL全体でも指定することが可能

sheets = session.spreadsheet_by_url("https://docs.google.com/spreadsheets/d/xxxxxxxxxxxxxxxxxxxxxxxxxxx/").worksheet_by_title("シート名")

スプレッドシートへの書き込み

sheets[1,1] = "こんにちは"

A1セルに書き込む場合はsheets[1,1]とします。[行番号, 列番号]で指定するため、B1セルの場合はsheets[1,2]でOKです。

直接指定もOK

sheets['C3'] = "こんばんは"

その際''または""が必要なので注意!

以下のように数値を書き込み、計算もできる

sheets["A1"] = 3
sheets["B1"] = 5
sheets["C1"] = "=A1+B1"

配列の数値を起点となるセルを指定して更新する

array1 = [1, 2, 3, 4, 5]
array2 = [10, 20, 30, 40, 50]
sheets.update_cells(5, 1, [array1, array2])

書き込み後シートを保存する

sheets.save

スプレッドシートの情報を取得

以下のようにセルを指定して取得する。

p sheets[1, 1]
p sheets["A2"]

このようなスプレッドシートからターミナルで実行すると以下のように取得できます。

$ ruby test.rb
"kinako@tama.com"
"tama@kinako.com"

しかし、シート側で数値が書き込まれていても文字列が返ってくるので要注意!

数値のまま取得したい場合

numeric_valueでは数値として取得することが可能

p sheets.numeric_value(2, 2)

結果

$ ruby test.rb
1.0

列・行の数を数える

# 空でないセルまでの行数
p sheets.num_rows

# 空でないセルまでの列数
p sheets.num_cols

各列ごとに2次元配列をつくる

# 最終行と最終列は、それぞれ空でないセルが基準になる
array = sheets.rows
$ ruby test.rb
[["1", "2", "3", "4", "5"], ["6", "7", "8", "9", "10"], ["11", "12", "13", "14", "15"]]

削除

sheets.delete_rows(3, 2)

スプレッドシート・ワークシートの作成

# 新規スプレッドシートの作成(マイドライイブに作成される)
session.create_spreadsheet("ファイル名")
 
# 作成済みのスプレッドシートをコピーして保存
sheets.copy("コピーしたファイルの名前")

# 既存のスプレッドシートにワークシートを追加
sheets.add_worksheet("シート名")

 
# 新規作成(コピー)したスプレッドシートのURL・タイトルの取得
new_sheets = session.create_spreadsheet("新規スプレッドシート名")
p "https://docs.google.com/spreadsheets/d/#{new_sheets.id}"

ディレクトリとファイルの操作

drive_dir = session.collection_by_url("https://drive.google.com/drive/folders/xxxxxxxxxx")
drive_dir.create_subcollection("ディレクトリ名")

さいごに

無事に最初に課題とていたGoogleスプレッドシートからデータのやりとりができました。

売り上げをまとめたり、顧客の名前やメールアドレスを取得して定型分に落とし込んで手間をかけずにDMを送るなどができそうだと感じました😃

与えられた課題だけでなく、たまにこうやって自分の身の回りのことが楽になることに繋がるようなちょっとしたことをテーマに課題としてプログラミング学習をしていきたいと思います✨

参考にさせていただいたサイト

google-drive-ruby RubyでGoogleスプレッドシートを読み込み・書き込みする | virtualiment RubyでGoogle スプレッドシートを操作する