📑

【Rails】Google API を使ったスプレッドシートへのデータ書き込み方法を分かりやすく解説してみた

2025/03/10に公開

はじめに

Rails アプリケーションでは、データを CSV ファイルとして出力する機能が、一般的によく実装されます。
特に、レポート機能を備えたアプリケーションでは、CSV 形式でのデータ出力は欠かせません。

しかし、ダウンロードした CSV ファイルをそのまま使用するユーザーは少ないかもしれません。
実際には、以下のような手順で作業を進めることが多いでしょう。

  1. アプリケーションから CSV ファイルをダウンロード
  2. ダウンロードした CSV ファイルを開く
  3. 必要なデータを CSV ファイルからコピーする
  4. 関数を組み込んだスプレッドシートにデータを貼り付ける
  5. データをもとにグラフを作成したり、集計を行う

この作業自体はそれほど時間がかかるものではありませんが、毎日繰り返すとなると手間になります。
しかし、アプリケーションにスプレッドシートへ直接データを書き込む機能を追加すれば、ステップ 1 ~ 4 を省略でき、すぐにステップ 5 の作業に取り掛かれます。

そこで本記事では、Rails アプリケーションから Google API を使ってスプレッドシートへデータを書き込む方法を分かりやすく解説します。

実装自体はそれほど難しくありませんが、手順を整理しておくことで、スムーズに進められるはずです。

同様の機能を実装したい方にとって、少しでも参考になれば幸いです。

ぜひ最後までご覧ください。

注意点

環境

本記事で使用する環境は以下のとおりです。

Google API について

まず、Google API について簡単に解説します。
Google API は、Google が提供するさまざまなサービスをプログラムから利用できる API です。
例えば、「Maps JavaScript API」「Cloud Vision API」「Gmail API」など、さまざまな API が提供されています。

https://console.cloud.google.com/apis/library

Google API には、「Java」「Python」「PHP」など、さまざまなプログラミング言語向けのクライアントライブラリが提供されています。

https://developers.google.com/api-client-library

Ruby 向けのクライアントライブラリも提供されており、google-api-client という gem を使うことで、簡単に Google API を利用できます。

前提

本記事で使用する Rails アプリケーションは、以下の構成を前提とします。

db/schema.rb
ActiveRecord::Schema[7.0].define(version: 2024_12_21_083443) do
  create_table "posts", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
    t.bigint "user_id", null: false
    t.string "title", null: false
    t.text "content", null: false
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["user_id"], name: "index_posts_on_user_id"
  end

  create_table "users", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
    t.string "name", null: false
    t.string "email", null: false
    t.integer "age", null: false
    t.string "login_id", null: false
    t.string "encrypted_password", null: false
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["email"], name: "index_users_on_email", unique: true
    t.index ["login_id"], name: "index_users_on_login_id", unique: true
  end

  add_foreign_key "posts", "users"
end
app/models/user.rb
class User < ApplicationRecord
  devise :database_authenticatable, authentication_keys: [:login_id]

  has_many :posts, dependent: :destroy
end
app/models/post.rb
class Post < ApplicationRecord
  belongs_to :user
end
app/controllers/posts_controller.rb
class PostsController < ApplicationController
  before_action :set_post, only: %i[show edit update destroy]

  def index
    @posts = current_user.posts.order(id: :desc)
  end

  def show; end

  def new
    @post = current_user.posts.new
  end

  def edit; end

  def create
    @post = current_user.posts.new(post_params)

    if @post.save
      redirect_to root_path, notice: 'Post was successfully created.'
    else
      render :new
    end
  end

  def update
    if @post.update(post_params)
      redirect_to root_path, notice: 'Post was successfully updated.'
    else
      render :edit
    end
  end

  def destroy
    @post.destroy
    redirect_to root_path, notice: 'Post was successfully destroyed.'
  end

  private

  def post_params
    params.require(:post).permit(:title, :content)
  end

  def set_post
    @post = current_user.posts.find(params[:id])
  end
end
app/views/posts/index.html.slim
div.p-5
  h1.mb-3 投稿一覧
  p style="color: green" = notice
  = link_to "新規追加", new_post_path, class: 'btn btn-outline-info btn-sm m-3'
  .d-flex.flex-wrap.align-items-center
    - @posts.each do |post|
      .card.border.m-3 style="width: 400px;"
        .card-header.h5 = post.title
        .card-body
          .float-right
            button.copy-button.btn.btn-outline-secondary.btn-sm data-target="post_#{post.id}"
              i.far.fa-copy.mr-1
              span.copy-text コピー
          div id="post_#{post.id}"
            .mb-3 = post.content
          = link_to "詳細", post, class: 'btn btn-outline-secondary btn-sm mr-1'
          = link_to "編集", edit_post_path(post), class: 'btn btn btn-outline-info btn-sm mr-1'
          = link_to "削除", post, method: :delete, data: { turbo: "true", turbo_method: :delete, turbo_confirm: '削除しますか?' }, class: "btn btn-outline-danger btn-sm"
db/seeds.rb
10.times do |user_index|
  login_id = "login_id#{user_index + 1}"
  user = User.find_or_create_by(login_id: login_id) do |u|
    u.name = Faker::Name.name
    u.email = Faker::Internet.email
    u.age = rand(0..200)
    u.password = 'password'
    u.password_confirmation = 'password'
  end

  10.times do |post_index|
    Post.create!(
      user_id: user.id,
      title: "ユーザー#{user_index + 1}の投稿#{post_index + 1}のタイトル",
      content: "ユーザー#{user_index + 1}の投稿#{post_index + 1}の内容"
    )
  end
end


投稿一覧画面

この Rails アプリケーションは、User と Post が 1 対多の関係にあり、基本的な CRUD 機能を備えた一般的な構成のアプリケーションです。
また、ログイン機能は devise を使用して実装しており、投稿一覧画面には、ログインユーザーの投稿のみが表示されます。

実装

今回は、投稿一覧に表示されている、ログインユーザーの投稿をスプレッドシートに書き込む機能を実装します。

1. User テーブルにカラムを追加

ユーザーごとに異なるスプレッドシートにデータを書き込むため、User テーブルにスプレッドシート ID を保存するカラムを追加します。
このカラムを利用して、各ユーザーのスプレッドシートを管理します。

ターミナル
docker compose exec app rails g migration AddSpreadsheetIdToUsers spreadsheet_id:string
db/migrate/20250308134258_add_spreadsheet_id_to_users.rb
class AddSpreadsheetIdToUsers < ActiveRecord::Migration[7.0]
  def change
    add_column :users, :spreadsheet_id, :string
  end
end
ターミナル
docker compose exec app rails db:migrate
db/schema.rb
ActiveRecord::Schema[7.0].define(version: 2025_03_08_134258) do
  create_table "posts", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
    t.bigint "user_id", null: false
    t.string "title", null: false
    t.text "content", null: false
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["user_id"], name: "index_posts_on_user_id"
  end

  create_table "users", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
    t.string "name", null: false
    t.string "email", null: false
    t.integer "age", null: false
    t.string "login_id", null: false
    t.string "encrypted_password", null: false
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
+   t.string "spreadsheet_id"
    t.index ["email"], name: "index_users_on_email", unique: true
    t.index ["login_id"], name: "index_users_on_login_id", unique: true
  end

  add_foreign_key "posts", "users"
end

2. Google API 用の認証情報を取得

今回の実装では、Google Cloud から以下の 3 つの認証情報を取得します。

  • project_id
  • private_key
  • client_email

プロジェクトの作成

まず、Google Cloud にログインし、プロジェクトを作成します。


「プロジェクトの選択」をクリック


「新しいプロジェクト」をクリック


「プロジェクト名」を入力し、「作成」をクリック

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


「プロジェクトの選択」をクリック


先ほど作成したプロジェクトをクリック


サイドバーから「API とサービス」 > 「認証情報」をクリック


「サービス アカウントを管理」をクリック


「サービス アカウントを作成」をクリック


「サービス アカウント ID」を入力し、「作成して続行」をクリック


「ロールを選択」 > 「基本」 > 「編集者」をクリック


「完了」をクリック

鍵の作成


「鍵を管理」をクリック


「新しい鍵を作成」をクリック


「JSON」を選択し、「作成」をクリック

JSON ファイルがダウンロードされたら、認証情報の取得は完了です。

test-app-453114-d0a87e196a1c.json
{
  "type": "service_account",
  "project_id": "test-app-453114",
  "private_key_id": "d0a87e196a1c1b65760673a361d81bc10c9239e4",
  "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC3XyVLGqGBsKZu\n1z2Kq/UYmH/iOPnYrkhjKOSaD0evnI9XDQNTOKuTGoGN2NwdQNYQXbQfGXYv9doJ\nkf4uQSrhjVsB/zA/KlsUQCczxaiG4f1zooSeqw+35lUayiAHDUI7GoJLjceMuKtS\nvytFuQct3BVuXFzOBnqidXmkSQw1u1WNRRpn6qAmF91vnv2+pMUPavm2sYA+At1o\nBMxAO0EFryGzUkYzgvP4KP5MUvxgqj45UuSPTikSbP/NhNcJoLpnBXMkD5tLmX7L\nvxogF2Sgnat4DA664Dnc2uLdYc6+O6GCht71SeLzTiyv9uz0L7u2rnQMbvPfiEDh\noOSrt+STAgMBAAECggEAIIcqvOdk9fYJmAjrfFFjoXDP4qfbvjGwWpKy9pc2TrMV\nhEolKFqZqPcfOzPYXAIX1wBgRtID8p8IhgEVV0wtGKS0G6cSfmn7jRySN69c5Uxq\nYtxV7TWIDMW5nA513vpdoNFjgpaMauyJS5zoxq37VYnAbXrJ5awljfML2HYyycb7\nBjIsyHiBVFvp3u+mr/PHscnH784Wr6ksxvOqTur1JRc8nd5EJe1U7SuN+/7H+o6f\nLf4yl09kvEqDCk+raXEtg/qRDpz3A9L5Ba1YLH8vKy64oJqjYNThxXrPvw2dYDB1\ncgbBbbJLjMs4yT4R+1+HGid+lNgrRK3lxDpxH0zd6QKBgQD/+Gwdm6LMr8I9ln+q\nwEbJh7P944VQ17oS1ucGqTgy33/lCfrwxKLMM+CizzNJq3rCcILO9Gw4MRWpaCso\n3DkgghOg13RcurNRgUsieJM0PC36aV8Ohx6n4ixsT8jX3uoyod/EuBqgndvbBUgA\nR0h1fuKfSg8f5ES4RLugWSUCiwKBgQC3ZJL8Dpx0lvPb7GxC5PHySn+H7cXbFp31\nB90JY60YvW9xwDCnfQvY7A1cY/hybu06voKJgpJ9YNtVGb/GFte4Qdj4cianWwEL\nnjuvpo/EqODs72D0A7OYji8ziVnBgoQfGO7QPW7TuPk3FrVT2p4tdnyS693WlVDj\n6xjU0O2PGQKBgBwYDv287ERc8gvCbea2zc4mt8mg5Cv4UXLp5Vdk0Uc8IpRn4QP2\nAQw6kWgtJ6rpSEL5CFJgn1QXhxId3cbRTO/VdwQLQbk/wJisgSuaYkW0aTN3xzgX\n+nRgrZGBvEB9NeUywRWdQ0bnrI7AaKOnLzu+Hm9vOHO+oRA8cv9paVd7AoGBAKt+\nlGi6rRnl01K0KqT/fTUq70lIUz5GTx3E5bETEdpRw3Zm19i3+a03SGM+ZSV1j8fg\nQSef/6bZPSG+e3QdBksa4G+sJ3NWiYq4xG3EXyrzFarbSxnEoFynkYIrDdEEYNLH\nuQLof8vjbMFULeqlREeVRncJtCAm70bDISxZ19x5AoGBAO2p1ZaOkHPQk9w+rdhZ\n/ONtWCISxicywra6nykGCIUs20wepDch9ZiyF+fNb3+RPZJ7iqVjNX2rZnL6k9Kp\nREbqCbWzcLkf+jiYsR9Qv3Wx1LsqK48RJ3R/5w6K48wGHMxDSUiewU6zPAVYRg9x\njta9DNOLFBGehtzEYaYYvbOx\n-----END PRIVATE KEY-----\n",
  "client_email": "test-app@test-app-453114.iam.gserviceaccount.com",
  "client_id": "103380005679277192011",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/test-app%40test-app-453114.iam.gserviceaccount.com",
  "universe_domain": "googleapis.com"
}

3. Google API の有効化

今回の実装では、以下の 2 つの API を有効化します。


「API とサービス」 > 「ライブラリ」をクリック


検索窓に「drive」と入力し、「Google Drive API」をクリック


「有効にする」をクリック


検索窓に「sheet」と入力し、「Google Sheets API」をクリック


「有効にする」をクリック

4. Google Drive でフォルダを作成

スプレッドシートを保存するために、新しいフォルダを作成します。

マイドライブ にアクセスします。


「新規」をクリック


「新しいフォルダ」をクリック


フォルダ名を入力し、「作成」をクリック


作成したフォルダを右クリックし、「共有」をクリック


先ほどの JSON ファイルの client_email を入力し、「編集者」を選択し、「送信」をクリック


作成したフォルダを開き、URL に含まれるフォルダ ID を取得

5. 環境変数の設定

今回の実装では、環境変数の管理に dotenv を使用します。

dotenv は、.env ファイルに環境変数を記述し、アプリケーション内で使用できるようにする gem です。

dotenv の導入手順については本記事では割愛します。

.env
GOOGLE_DRIVE_FOLDER_ID="1V5pZzCw1kESCy4Ia402qy3VvhEu9hVJO"
GOOGLE_PROJECT_ID="test-app-453114"
GOOGLE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC3XyVLGqGBsKZu\n1z2Kq/UYmH/iOPnYrkhjKOSaD0evnI9XDQNTOKuTGoGN2NwdQNYQXbQfGXYv9doJ\nkf4uQSrhjVsB/zA/KlsUQCczxaiG4f1zooSeqw+35lUayiAHDUI7GoJLjceMuKtS\nvytFuQct3BVuXFzOBnqidXmkSQw1u1WNRRpn6qAmF91vnv2+pMUPavm2sYA+At1o\nBMxAO0EFryGzUkYzgvP4KP5MUvxgqj45UuSPTikSbP/NhNcJoLpnBXMkD5tLmX7L\nvxogF2Sgnat4DA664Dnc2uLdYc6+O6GCht71SeLzTiyv9uz0L7u2rnQMbvPfiEDh\noOSrt+STAgMBAAECggEAIIcqvOdk9fYJmAjrfFFjoXDP4qfbvjGwWpKy9pc2TrMV\nhEolKFqZqPcfOzPYXAIX1wBgRtID8p8IhgEVV0wtGKS0G6cSfmn7jRySN69c5Uxq\nYtxV7TWIDMW5nA513vpdoNFjgpaMauyJS5zoxq37VYnAbXrJ5awljfML2HYyycb7\nBjIsyHiBVFvp3u+mr/PHscnH784Wr6ksxvOqTur1JRc8nd5EJe1U7SuN+/7H+o6f\nLf4yl09kvEqDCk+raXEtg/qRDpz3A9L5Ba1YLH8vKy64oJqjYNThxXrPvw2dYDB1\ncgbBbbJLjMs4yT4R+1+HGid+lNgrRK3lxDpxH0zd6QKBgQD/+Gwdm6LMr8I9ln+q\nwEbJh7P944VQ17oS1ucGqTgy33/lCfrwxKLMM+CizzNJq3rCcILO9Gw4MRWpaCso\n3DkgghOg13RcurNRgUsieJM0PC36aV8Ohx6n4ixsT8jX3uoyod/EuBqgndvbBUgA\nR0h1fuKfSg8f5ES4RLugWSUCiwKBgQC3ZJL8Dpx0lvPb7GxC5PHySn+H7cXbFp31\nB90JY60YvW9xwDCnfQvY7A1cY/hybu06voKJgpJ9YNtVGb/GFte4Qdj4cianWwEL\nnjuvpo/EqODs72D0A7OYji8ziVnBgoQfGO7QPW7TuPk3FrVT2p4tdnyS693WlVDj\n6xjU0O2PGQKBgBwYDv287ERc8gvCbea2zc4mt8mg5Cv4UXLp5Vdk0Uc8IpRn4QP2\nAQw6kWgtJ6rpSEL5CFJgn1QXhxId3cbRTO/VdwQLQbk/wJisgSuaYkW0aTN3xzgX\n+nRgrZGBvEB9NeUywRWdQ0bnrI7AaKOnLzu+Hm9vOHO+oRA8cv9paVd7AoGBAKt+\nlGi6rRnl01K0KqT/fTUq70lIUz5GTx3E5bETEdpRw3Zm19i3+a03SGM+ZSV1j8fg\nQSef/6bZPSG+e3QdBksa4G+sJ3NWiYq4xG3EXyrzFarbSxnEoFynkYIrDdEEYNLH\nuQLof8vjbMFULeqlREeVRncJtCAm70bDISxZ19x5AoGBAO2p1ZaOkHPQk9w+rdhZ\n/ONtWCISxicywra6nykGCIUs20wepDch9ZiyF+fNb3+RPZJ7iqVjNX2rZnL6k9Kp\nREbqCbWzcLkf+jiYsR9Qv3Wx1LsqK48RJ3R/5w6K48wGHMxDSUiewU6zPAVYRg9x\njta9DNOLFBGehtzEYaYYvbOx\n-----END PRIVATE KEY-----\n"
GOOGLE_CLIENT_EMAIL="test-app@test-app-453114.iam.gserviceaccount.com"

6. gem のインストール

Gemfile
+ gem 'google-api-client'
ターミナル
docker compose exec app bundle install

7. SpreadsheetService の作成

では、実際に Google API を使ったスプレッドシートの作成とデータの書き込みを行う処理を実装していきます。

app/services/spreadsheet_service.rb
require 'google/apis/drive_v3'
require 'google/apis/sheets_v4'
require 'googleauth'

class SpreadsheetService
  SCOPE = [
    Google::Apis::DriveV3::AUTH_DRIVE,
    Google::Apis::SheetsV4::AUTH_SPREADSHEETS
  ].freeze

  def initialize
    @sheets_service = Google::Apis::SheetsV4::SheetsService.new
    @drive_service = Google::Apis::DriveV3::DriveService.new

    @sheets_service.client_options.application_name = 'test-app'
    @drive_service.client_options.application_name = 'test-app'

    credentials = authorize
    @sheets_service.authorization = credentials
    @drive_service.authorization = credentials
  end

  def create_spreadsheet(user)
    google_drive_folder_id = ENV.fetch('GOOGLE_DRIVE_FOLDER_ID', nil)
    spreadsheet_name = "Post - #{user.name}"
    request = Google::Apis::DriveV3::File.new(
      name: spreadsheet_name,
      parents: [google_drive_folder_id],
      mime_type: 'application/vnd.google-apps.spreadsheet'
    )
    spreadsheet = @drive_service.create_file(request)
    user.update!(spreadsheet_id: spreadsheet.id)
  end

  def export_posts(user)
    spreadsheet_id = user.spreadsheet_id
    sheet_name = 'Sheet1'
    range = "#{sheet_name}!A1:E"
    @sheets_service.clear_values(spreadsheet_id, range)
    values = [['ID', 'Title', 'Content', 'Created At', 'Updated At']]
    user.posts.order(id: :desc).each do |post|
      values << [post.id, post.title, post.content, post.created_at.strftime('%Y-%m-%d %H:%M:%S'),
                 post.updated_at.strftime('%Y-%m-%d %H:%M:%S')]
    end
    value_range_object = Google::Apis::SheetsV4::ValueRange.new(values: values)
    @sheets_service.update_spreadsheet_value(
      spreadsheet_id,
      range,
      value_range_object,
      value_input_option: 'RAW'
    )
  end

  private

  def authorize
    Google::Auth::ServiceAccountCredentials.make_creds(
      json_key_io: StringIO.new(service_account_json),
      scope: SCOPE
    )
  end

  def service_account_json
    {
      type: 'service_account',
      project_id: ENV.fetch('GOOGLE_PROJECT_ID', nil),
      private_key_id: '',
      private_key: ENV.fetch('GOOGLE_PRIVATE_KEY', nil).gsub('\\n', "\n"),
      client_email: ENV.fetch('GOOGLE_CLIENT_EMAIL', nil),
      client_id: '',
      auth_uri: 'https://accounts.google.com/o/oauth2/auth',
      token_uri: 'https://oauth2.googleapis.com/token',
      auth_provider_x509_cert_url: 'https://www.googleapis.com/oauth2/v1/certs',
      client_x509_cert_url: ''
    }.to_json
  end
end

8. PostsController の修正

app/controllers/posts_controller.rb
class PostsController < ApplicationController
  before_action :set_post, only: %i[show edit update destroy]

  def index
    @posts = current_user.posts.order(id: :desc)
  end

  def show; end

  def new
    @post = current_user.posts.new
  end

  def edit; end

  def create
    @post = current_user.posts.new(post_params)

    if @post.save
      redirect_to root_path, notice: 'Post was successfully created.'
    else
      render :new
    end
  end

  def update
    if @post.update(post_params)
      redirect_to root_path, notice: 'Post was successfully updated.'
    else
      render :edit
    end
  end

  def destroy
    @post.destroy
    redirect_to root_path, notice: 'Post was successfully destroyed.'
  end

+ def export_to_spreadsheet
+   spreadsheet_service = SpreadsheetService.new
+   spreadsheet_service.create_spreadsheet(current_user) if current_user.spreadsheet_id.blank?
+   spreadsheet_service.export_posts(current_user)
+   redirect_to root_path, notice: 'Post was successfully exported to Spreadsheet.'
+ end

  private

  def post_params
    params.require(:post).permit(:title, :content)
  end

  def set_post
    @post = current_user.posts.find(params[:id])
  end
end

9. ルーティングの修正

config/routes.rb
Rails.application.routes.draw do
  root to: 'posts#index'

  devise_for :users, controllers: {
    sessions: 'sessions'
  }, path: '', path_names: { sign_in: 'sign_in', sign_out: 'sign_out' }

+ resources :posts, only: %i[show new create edit update destroy] do
+   collection do
+     get :export_to_spreadsheet
+   end
+ end
end

10. 投稿一覧画面の修正

app/views/posts/index.html.slim
div.p-5
  h1.mb-3 投稿一覧
  p style="color: green" = notice
  = link_to "新規追加", new_post_path, class: 'btn btn-outline-info btn-sm m-3'
+ = link_to "スプレッドシートに出力", export_to_spreadsheet_posts_path, class: 'btn btn-outline-primary btn-sm'
  .d-flex.flex-wrap.align-items-center
    - @posts.each do |post|
      .card.border.m-3 style="width: 400px;"
        .card-header.h5 = post.title
        .card-body
          .float-right
            button.copy-button.btn.btn-outline-secondary.btn-sm data-target="post_#{post.id}"
              i.far.fa-copy.mr-1
              span.copy-text コピー
          div id="post_#{post.id}"
            .mb-3 = post.content
          = link_to "詳細", post, class: 'btn btn-outline-secondary btn-sm mr-1'
          = link_to "編集", edit_post_path(post), class: 'btn btn btn-outline-info btn-sm mr-1'
          = link_to "削除", post, method: :delete, data: { turbo: "true", turbo_method: :delete, turbo_confirm: '削除しますか?' }, class: "btn btn-outline-danger btn-sm"

以上で実装は完了です。

処理の流れ

実装した機能の処理の流れは以下のとおりです。

動作確認

実装が完了したので、実際に動作確認を行ってみます。

1. ユーザーデータの確認

まず、ユーザーデータを確認します。

ターミナル
docker compose exec app rails c
Loading development environment (Rails 7.0.8.6)
irb(main):001> user = User.find(1)
  User Load (0.3ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1 /*application:TestApp*/
=> #<User id: 1, name: "Bruce Windler", email: "gerri@kuhn.test", age: 140, login_id: "login_id1", created_at: "2025-0...
irb(main):002> user
=> #<User id: 1, name: "Bruce Windler", email: "gerri@kuhn.test", age: 140, login_id: "login_id1", created_at: "2025-03-09 10:28:37.892400000 +0900", updated_at: "2025-03-09 10:28:37.892400000 +0900", spreadsheet_id: nil>

名前が Bruce Windler で、スプレッドシート ID が nil であることが確認できます。

2. Google Drive の確認

次に、Google Drive にアクセスし、フォルダ内を確認します。

フォルダ内には何もないことが確認できます。

3. スプレッドシートに出力

投稿一覧画面にアクセスし、「スプレッドシートに出力」ボタンをクリックします。

「Post was successfully exported to Spreadsheet.」と表示されたので、スプレッドシートにデータが書き込まれたみたいです。

4. スプレッドシートの確認

先ほどまでフォルダ内は空でしたが、現在は、「Post - Bruce Windler」というスプレッドシートが作成されていることが確認できます。

スプレッドシートを開いてみると、データが書き込まれていることが確認できます。

5. スプレッドシート ID の確認

作成したスプレッドシートの ID を確認します。

スプレッドシートの URL から、このスプレッドシートの ID が「1V0y760KHWYvvaVRqadXDzWchSnJ0Kdb65W6HuQXjkwE」であることが確認できます。

では、ユーザーデータを確認してみましょう。

ターミナル
docker compose exec app rails c
Loading development environment (Rails 7.0.8.6)
irb(main):001> user = User.find(1)
  User Load (0.6ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1 /*application:TestApp*/
=> #<User id: 1, name: "Bruce Windler", email: "gerri@kuhn.test", age: 140, login_id: "login_id1", created_at: "2025-0...
irb(main):002> user
=> #<User id: 1, name: "Bruce Windler", email: "gerri@kuhn.test", age: 140, login_id: "login_id1", created_at: "2025-03-09 10:28:37.892400000 +0900", updated_at: "2025-03-09 10:34:35.618204000 +0900", spreadsheet_id: "1V0y760KHWYvvaVRqadXDzWchSnJ0Kdb65W6HuQXjkwE">

ユーザーのスプレッドシート ID が「1V0y760KHWYvvaVRqadXDzWchSnJ0Kdb65W6HuQXjkwE」に更新されていることが確認できます。

動作確認は以上です。

おわりに

いかがでしたでしょうか?

今回は、Rails アプリケーションから Google API を使ってスプレッドシートへデータを書き込む方法について解説しました。

この機能をさらに便利にするためには、以下のような改善案があります。

  • バックグラウンド処理
    • データの書き込みを非同期処理化することで、ユーザーが待つことなくアプリを利用できるようにする。
  • 定期実行
    • 毎日決まった時間に自動でデータを書き込むように設定する。
  • スプレッドシートの整理
    • 同じシートに上書きするのではなく、日別・月別で新しいシートを作成する。

Google API を活用することで、業務の効率化やデータ管理の自動化が可能になります。

本記事が少しでも参考になれば幸いです。

ぜひ、スプレッドシートを活用してみてください!

最後までご覧いただき、ありがとうございました!

GitHubで編集を提案
株式会社L&E Group

Discussion