💎

RailsアプリからGoogleスプレッドシート内のデータにアクセス

2024/11/09に公開

はじめに

RailsアプリケーションからGoogleのスプレッドシートへアクセスし、データの読み込みをするための手順、サンプルコードをまとめています。
手順の中でイメージしやすいようにスクショを貼っている場合もありますが、セキュリティ的に見せられない箇所は塗りつぶしています。

Summary

  • スプレッドシートへアクセスするためにGoogle Cloud Platform (以下GCP)のサービスアカウントを作成します。
  • Railsアプリケーションからスプレッドシートへアクセスする際は、google-apis-sheets_v4gemを使います。

手順

GCPのサービスアカウントとキーの作成

  • GCPへログインする。
  • GCPのプロダクト『IAMと管理』を開く。
  • 左メニューにある『サービスアカウント』を開く。
  • 『サービス アカウントを作成』のリンクを開く。
  • 任意のサービスアカウント名とサービスアカウントIDを入力して『完了』ボタンを押下する。
  • 作成したサービスアカウントの行の右端にある『操作』をクリックし、『鍵の管理』のリンクを開く。
    • ここでキーを発行する理由は、Railsアプリからスプレッドシートへアクセスする際にキーが必要になるためです。
  • 『鍵を追加』を押下し、『新しい鍵を作成』を押下する。押下時のポップアップでキーのタイプを選択できますが、キーのタイプは JSONで良いと思います。
  • 鍵が作成されるとキー情報が含まれたJSONファイルがダウンロードされる。

Sheet APIの有効化

  • GCPプロダクトの『APIとサービス』を開く。
  • 『APIとサービスを有効にする』のリンク先で Sheet APIを有効化する。
    • ※ ただし、すでに有効化されている場合はこの手順は不要。

Googleスプレッドシートへ権限追加

  • データ読み取りしたいスプレッドシートを開く。
  • 前述の手順『GCPのサービスアカウントとキーの作成』でダウンロードしたJSONファイル内のclient_emailのメールアドレスをコピーする。
  • スプレッドシートの『共有』で、コピーしたメールアドレスに権限を付与する。

Railsアプリケーションの作成

  • Railsのアプリケーション作成方法については、情報がたくさんあると思うのと、この記事のメインではないため割愛させていただきます。
  • 動作確認したバージョンとしては、Ruby3.1.6、Railsは7.0になります。

Gemの導入

  • Gemfileに以下を追加
gem 'google-apis-sheets_v4', '~> 0.1'

サンプルコード

  • 適当なサービスクラスを用意して、その中でスプレッドシートへのアクセスをするようにする。
require "google/apis/sheets_v4"

class SampleService
  def sheet_value
    sheet = Google::Apis::SheetsV4::SheetsService.new

    # スコープを定義することでスプレッドシートへアクセスできるようになる
    scopes =  ['https://www.googleapis.com/auth/spreadsheets']

    # 認証
    auth = ::Google::Auth::ServiceAccountCredentials
             .make_creds(scope: scopes)
    sheet.authorization = auth

    # シート名
    sheet_name = "sheet1"
    # セル位置
    cell_position = "A1"

    # スプレッドシートのデータ読み込み
    sheet.get_spreadsheet_values(ENV['SPREADSHEET_ID'], "#{sheet_name}!#{cell_position}").values
  end
end

動作検証

スプレッドシートのセルに値を入れる

  • 下記のように値を入れておく。また、シート名はsheet1とする。

環境変数の設定

  • 今回はサービスアカウントの private_key などを環境変数で定義する方法を採用しています。
  • https://github.com/googleapis/google-auth-library-ruby?tab=readme-ov-file#example-environment-variables にるあるように、前述でダウンロードしたJSONファイルに記載の値を下記のように環境変数としてプログラムを実行する環境でexportする。
    export GOOGLE_ACCOUNT_TYPE=service_account
    export GOOGLE_CLIENT_ID=000000000000000000000
    export GOOGLE_CLIENT_EMAIL=xxxx@xxxx.iam.gserviceaccount.com
    export GOOGLE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n"
    
  • また、上記に加えて対象のスプレッドシートIDも今回環境変数としてexportします。
    • ソースコードのENV['SPREADSHEET_ID']がスプレッドシートIDにあたります。
    export SPREADSHEET_ID="xxxxxxxxxxx"
    
    • スプレッドシートIDは下記スプレッドシートのURLのxxxxxxxの部分です。
      • https://docs.google.com/spreadsheets/d/xxxxxxx/edit?gid=0

Rails consoleで動作検証実施

  • 下記のようにRails consoleを立ち上げる。
rails c
  • 下記のように実行するとスプレッドシートの値が取得できていることが分かります。
irb(main):001> SampleService.new.sheet_value

=> [["100"]]

次回

今回は単純にセルのデータを読み込みするだけでしたが、次回は書き込みについてのサンプルコードもまとめられればと思います。

参考資料

Discussion