【Rails】Google API を使ったスプレッドシートへのデータ書き込み方法を分かりやすく解説してみた
はじめに
Rails アプリケーションでは、データを CSV ファイルとして出力する機能が、一般的によく実装されます。
特に、レポート機能を備えたアプリケーションでは、CSV 形式でのデータ出力は欠かせません。
しかし、ダウンロードした CSV ファイルをそのまま使用するユーザーは少ないかもしれません。
実際には、以下のような手順で作業を進めることが多いでしょう。
- アプリケーションから CSV ファイルをダウンロード
- ダウンロードした CSV ファイルを開く
- 必要なデータを CSV ファイルからコピーする
- 関数を組み込んだスプレッドシートにデータを貼り付ける
- データをもとにグラフを作成したり、集計を行う
この作業自体はそれほど時間がかかるものではありませんが、毎日繰り返すとなると手間になります。
しかし、アプリケーションにスプレッドシートへ直接データを書き込む機能を追加すれば、ステップ 1 ~ 4 を省略でき、すぐにステップ 5 の作業に取り掛かれます。
そこで本記事では、Rails アプリケーションから Google API を使ってスプレッドシートへデータを書き込む方法を分かりやすく解説します。
実装自体はそれほど難しくありませんが、手順を整理しておくことで、スムーズに進められるはずです。
同様の機能を実装したい方にとって、少しでも参考になれば幸いです。
ぜひ最後までご覧ください。
注意点
環境
本記事で使用する環境は以下のとおりです。
Google API について
まず、Google API について簡単に解説します。
Google API は、Google が提供するさまざまなサービスをプログラムから利用できる API です。
例えば、「Maps JavaScript API」「Cloud Vision API」「Gmail API」など、さまざまな API が提供されています。
Google API には、「Java」「Python」「PHP」など、さまざまなプログラミング言語向けのクライアントライブラリが提供されています。
Ruby 向けのクライアントライブラリも提供されており、google-api-client という gem を使うことで、簡単に Google API を利用できます。
前提
本記事で使用する Rails アプリケーションは、以下の構成を前提とします。
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
class User < ApplicationRecord
devise :database_authenticatable, authentication_keys: [:login_id]
has_many :posts, dependent: :destroy
end
class Post < ApplicationRecord
belongs_to :user
end
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
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"
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
class AddSpreadsheetIdToUsers < ActiveRecord::Migration[7.0]
def change
add_column :users, :spreadsheet_id, :string
end
end
docker compose exec app rails db:migrate
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 ファイルがダウンロードされたら、認証情報の取得は完了です。
{
"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 の導入手順については本記事では割愛します。
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 のインストール
+ gem 'google-api-client'
docker compose exec app bundle install
7. SpreadsheetService の作成
では、実際に Google API を使ったスプレッドシートの作成とデータの書き込みを行う処理を実装していきます。
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 の修正
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. ルーティングの修正
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. 投稿一覧画面の修正
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 を活用することで、業務の効率化やデータ管理の自動化が可能になります。
本記事が少しでも参考になれば幸いです。
ぜひ、スプレッドシートを活用してみてください!
最後までご覧いただき、ありがとうございました!
Discussion