PR
私が使っているPCガジェット類

作業環境で実際に使っている・気になっている周辺機器などをまとめました

※ 一部のリンクは広告(アフィリエイト)を含みます

スプレッドシートAPIの秘密鍵の作り方 サービスアカウントキー

スプレッドシートを自動で書き換えるツールを作ってもらったのに、動かすためにスプレッドシートの設定とAPIの秘密鍵を用意してくださいと言われたことはありませんか?

私は経験ありです(言う側で)

ただ手順を聞いても Google Cloud だのサービスアカウントだの聞き慣れない言葉が並んでいて、ちょっと敷居が高いんじゃないかと思います

でも、やることは5つだけで1つずつ見ていけばそんなに難しい話じゃありません
Google Cloud のコンソールで①プロジェクトを作る → ②APIを有効にする → ③サービスアカウントを作る → ④秘密鍵のJSONをダウンロードする → ⑤スプレッドシートを共有する、この順番に進めば完了です

今回はこの5手順を紹介します

目次

スプレッドシートAPIの秘密鍵とは?利用者本人が作る理由

秘密鍵(サービスアカウントキー)は、プログラム専用のGoogleアカウントに発行されるパスワード代わりのファイルです
その専用アカウントを Google は「サービスアカウント」と呼んでいて、早速の横文字に抵抗を感じますがその名の通りただのアカウント(≒メアド)だと思ってもらえれば大丈夫

プログラムがスプレッドシートを操作するは、いつも使っているアカウント(≒Gmailアカウント)ではなくてこのサービスアカウントで行うことになります
後述しますが、プログラムに読み書きしてほしいスプレッドシートには、そのサービスアカウントを共有設定しておく必要が出てきます

サービスアカウントと秘密鍵は、どちらも Google Cloud の「プロジェクト」という箱の中に作られます
プロジェクトを作った人が、そのプロジェクトのオーナーになります

Google Cloud の用語の関係図(あなたの Google アカウントの持ち物として、鍵を作る側の Google Cloud と鍵で触る側のスプレッドシートなどを並べた図)
ツールが動くときの流れ(鍵JSONでサービスアカウントとして認証し、共有されたシートだけを読み書きする方式と、APIキーで公開情報を取る方式)

では、開発者など誰か他の人に作ってもらえないのでしょうか?

開発者側のアカウントで作った鍵でも、もちろん技術的には動きます
ただしそれだと、鍵の管理を開発者に握られてしまい、もし無効化されてしまうと何も操作できなくなって別の開発者にまた鍵の作成を依頼することになってしまいます

だから自分のツールとして使い続けるなら、シートを持っている人のGoogleアカウントで作るのが鉄則です
自分で操作するのが不安なら、画面共有しながら(よりもこの記事を見てもらって・・)本人のアカウントで進めるのが現実的で、GoogleアカウントのIDとパスワードを預けて代わりに作ってもらう形はアカウントごと預けることになるのでもっと避けたいところです

全体の流れはこんな並びで、APIの反映待ちを入れても全部でだいたい15分ほど

順番やること開く画面私の手元での目安
1プロジェクトを作るGoogle Cloud コンソール3分
2Google Sheets API と Google Drive API を有効にするAPIライブラリ3分
3サービスアカウントを作るIAMと管理3分
4秘密鍵のJSONをダウンロードする認証情報 / サービスアカウント2分
5スプレッドシートを共有するスプレッドシートの共有ダイアログ1分
  • 必要なものはGoogleアカウント(個人のGmailでも、会社の Google Workspace でも可)
  • 読み書きしてほしいスプレッドシート(先に自分で作っておく)
  • 会社の Google Workspace のアカウントは、管理者の設定で鍵が作れない・共有できないことがあります(対処は記事の後半に)
ジャベ雄

Google Cloud の画面は大量のメニューがありますが、やることは明確なので順番に進めてください

Google Cloudコンソールを開いてプロジェクトを作る

コンソールへのアクセスは https://cloud.google.com/ から
初めてのアクセスの時は「無料で利用開始」をクリックしたくなりますが、無料トライアル(カード登録)の申し込み画面に進むので、コンソールから入るほうが手順が少ないです

※画面写真は2026年9月現在なので、細かい見た目は変わっているかもしれません

STEP
コンソールを開く

Google Cloud のトップから入る場合は、右上の「コンソール」リンクのほうをクリックしてください

Google Cloud トップページ右上の「コンソール」リンク
STEP
初回だけ利用規約に同意する

初めての場合は、国の選択と利用規約への同意を求められます
規約のチェックだけ必須で、更新情報のメール受信は任意です

初回に表示される利用規約の同意画面(国の選択・利用規約・メール受信)

このあと300ドル分の無料クレジットの案内が出ることがありますが、そのまま閉じて次へ進んで大丈夫です

STEP
プロジェクトを作る

画面上部の「プロジェクトの選択」→「新しいプロジェクト」と進み、プロジェクト名にツール名など後から分かる名前を入れて作成
名前は4〜30文字、自動で決まるプロジェクトIDは作成後に変更できないので、適当過ぎない程度に適当に

「場所」は個人のアカウントなら「組織なし」のままでOK
会社の Google Workspace アカウントだと、ここに組織名が入っていたりします

「プロジェクトの選択」→「新しいプロジェクト」→ プロジェクト名を入れて「作成」までの流れ
STEP
作ったプロジェクトを選択する

作成が終わったら、もう一度「プロジェクトの選択」を開いて、いま作ったプロジェクトを選んでおいてください

「プロジェクトを選択」ダイアログで作ったプロジェクトを選ぶ

Google Sheets APIとGoogle Drive APIを有効にする

セルの読み書きを担当するのが Google Sheets API、スプレッドシートというファイル自体を名前で探したり一覧するのが Google Drive API の担当
今回はこの2つを有効にします(どちらも有効化は無料)

ツールがURLやIDで直接シートを開くだけなら Drive API なしでも大丈夫
ただ有効化そのものにお金はかからないので、両方まとめて入れておくほうが確実です

STEP
APIライブラリを開く

左上のハンバーガーメニューから「APIとサービス」→「ライブラリ」と進みます
直接開くなら APIライブラリのページ からでもOK

メニューの「APIとサービス」から「ライブラリ」を選ぶ
STEP
Google Sheets APIを有効にする

画面上でGoogle Workspaceカテゴリ内を探すか検索欄に “sheets” と入れて「Google Sheets API」を開き、「有効にする」をクリック

Google Sheets API のページにある「有効にする」ボタン
STEP
同じ手順でGoogle Drive APIも有効にする

ライブラリに戻って同じくGoogle Workspaceのカテゴリ内を探すか検索欄で “drive” を検索し、「Google Drive API」も同じように有効化します
有効にした直後は反映まで数分かかることがあるので、ツールが「APIが有効になっていない」系のエラーを出したら、少し待ってもう一度動かしてみてください

Google Drive API のページにある「有効にする」ボタン

有効化しただけでは何も起きませんし、料金も発生しません
Google Sheets API と Google Drive API は、標準的な利用範囲なら追加料金なしです
Sheets API の上限は読み取り・書き込みそれぞれ1プロジェクトあたり300リクエスト/分、1ユーザーあたり60リクエスト/分
この1分あたりの枠に収まっていれば、1日の上限はありません(Sheets API の使用量の上限)

ただし2026年9月時点の公式の日本語ページには、割り当てリクエストの上限を超えた分について2026年後半に Google Cloud の請求先アカウントへ料金が発生する予定と書かれています
数千行を読み書きする程度なら届かない数字ですが、大量にアクセスするツールなら開発者に確認しておくといいと思います
開始日や単価は公式ページのほうで確認してください

Drive API など一部のAPIは、2026年5月以降に作ったプロジェクトから割り当ての数え方が変わっています
自分でコードを書く人は、公式の上限表を一度見ておくと話が早いです

サービスアカウントを作って秘密鍵(JSON)をダウンロードする

サービスアカウントを作ると 〜@〜.iam.gserviceaccount.com という形のメールアドレスが発行されます
そのアドレスに対して秘密鍵のJSONを1つ作り、あとでスプレッドシートを共有する相手として使う流れ

作成そのものは、名前を1つ決めるだけで終わります
ちょっと手数が多いのは、むしろ鍵を作る画面までの移動のほう

STEP
サービスアカウントの一覧を開く

ハンバーガーメニューから「IAMと管理」→「サービスアカウント」へ進みます

メニューの「IAMと管理」から「サービスアカウント」を選ぶ
STEP
サービスアカウントを作成する

サービスアカウントを作成」をクリックし、「サービスアカウント名」に用途が分かる名前を入れます
私は spreadsheet-editor のような名前にしていて、下の「サービスアカウントID」は自動で埋まるのでそのまま「作成して続行」でOK

サービスアカウントの作成画面(サービスアカウント名・ID・説明の入力欄と「作成して続行」)
STEP
権限の画面は何も選ばずに完了する

次に出てくる「権限」と「アクセス権を持つプリンシパル」は、1つ前の画面写真にもあるとおり「省略可」の項目で、今回のようにAPIを利用するだけの目的なら省略でOK
ここは何も選ばずに「続行」→「完了」で先に進んでください

STEP
認証情報から「サービスアカウントを管理」を開く

ハンバーガーメニューから「APIとサービス」→「認証情報」へ

メニューの「APIとサービス」から「認証情報」を選ぶ

さっき作ったサービスアカウントが一覧に出ているので、右側の「サービスアカウントを管理」をクリックします
「IAMと管理」→「サービスアカウント」の一覧から直接開いても、行き先は変わりません

認証情報ページ右側の「サービスアカウントを管理」リンク
STEP
「鍵を管理」を開く

一覧の右端にある「︙」(三点リーダー)をクリックして「鍵を管理」を選びます
日本語の画面は「キー」と「鍵」の表記が混ざっているので、どちらの言葉が出ても同じものだと思ってください

サービスアカウント一覧の三点リーダーから「鍵を管理」を選ぶ
STEP
JSON形式で鍵を作成する

キーを追加」(公式ドキュメントの表記は「鍵を追加」)→「新しい鍵を作成」と進み、キーのタイプは既定の JSON のまま右下の「作成」をクリック
押した瞬間にJSONファイルがパソコンへ自動でダウンロードされます
保存先は特に変えていなければブラウザの「ダウンロード」フォルダで、Chrome なら右上のダウンロード履歴から場所を開けます

「キーを追加」→「新しい鍵を作成」→ キーのタイプ JSON を選んで「作成」

ファイル名はプロジェクトIDと英数字をつないだ形で、test-project-9016-xxxx.json みたいな感じで付きます
ファイルを右クリック →「プログラムから開く」→ メモ帳(Mac ならテキストエディット)で開くと、こういう10行ほどのJSONが入っています

{
  "type": "service_account",
  "project_id": "PROJECT_ID",
  "private_key_id": "KEY_ID",
  "private_key": "-----BEGIN PRIVATE KEY-----\nPRIVATE_KEY\n-----END PRIVATE KEY-----\n",
  "client_email": "SERVICE_ACCOUNT_EMAIL",
  "client_id": "CLIENT_ID",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://accounts.google.com/o/oauth2/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/SERVICE_ACCOUNT_EMAIL"
}

大文字の部分に入るのは、プロジェクトごとの固有の値で、項目や値は時期によって少し変わります
このうち共有に使うのは client_email の値(〜@〜.iam.gserviceaccount.com の形)だけで、private_key が秘密の本体なので人に見せません

  • このJSONは再ダウンロードできません(無くしたら新しい鍵を作って古い鍵を削除する形になります)
  • メールやチャットで送らない、共有フォルダにも置かない、ツールの説明書で指定された場所にだけ置きます
  • 詳しい仕様は公式の鍵の作成と削除のページを確認
ジャベ雄

鍵の名前を用途で付けておくと、あとで消すときに迷いません

📚 Python自動化の独学に効く本PR
退屈なことはPythonにやらせよう 第3版

退屈なことはPythonにやらせよう 第3版

Al Sweigart

シゴトがはかどる Python自動処理の教科書

シゴトがはかどる Python自動処理の教科書

クジラ飛行机

もっとシゴトがはかどる Python×Excel×AI 業務自動化の教科書

もっとシゴトがはかどる Python×Excel×AI 業務自動化の教科書

クジラ飛行机

私のおすすめからランダムで3冊を表示しています

スプレッドシートをサービスアカウントに共有して動作確認

共有する相手は、さきほどのJSONに入っていた client_email のアドレスです
人を招待するときと同じ「共有」ボタンから、そのアドレスを追加するだけ

スプレッドシートを先に作成して共有します
APIでは既にあるスプレッドシートを操作することになるので先に準備しておいてください

STEP
client_emailのアドレスをコピーする

ダウンロードしたJSONをメモ帳などで開き、client_email の値をコピー
コンソールのサービスアカウント一覧にも出ているアドレスなので、そちらからコピーしても構いません

STEP
スプレッドシートの共有に追加する

対象のスプレッドシートを開いて右上の「共有」→ アドレス欄にコピーした値を貼り付け
権限は参照だけなら「閲覧者」、書き換えてもらうなら「編集者」を選んで「送信」
サービスアカウントはメールを受け取れないので、「通知」のチェックは外して大丈夫です(外すとボタンの表記が変わることがあります)

※機密性が高くないファイルなら「制限付き→リンクを知っている全員」に変えてもOK

Google ドライブでスプレッドシートを右クリックして「共有」を選ぶ
共有ダイアログにサービスアカウントのメールアドレスを「編集者」で追加した状態

会社の Google Workspace アカウントで「組織外のユーザーとは共有できません」のようなメッセージが出る場合(表記は環境で変わります)は、管理者側の外部共有の設定が原因です
外部共有を許可リスト方式にしている会社だと、そのままでは通りません
公式にも「gserviceaccount.com で終わるサービスアカウントは信頼できるドメインとして使えない」と書かれているためです
情報システム部門に相談する案件なので、共有したいシートの範囲を添えて聞いてみてください
動いていたツールが急に403で止まった、という場合もここが原因のことがあります(外部共有をオフにすると、過去に共有したファイルへのアクセスも切れます)

共有まで済んだら、ちゃんと動くか確かめてみましょう
ツールを受け取った側は、渡された起動方法でツールを実行して、シートが更新されれば完了です

自分でPythonを書く人向けに、鍵と共有が合っているかを確かめる最短のコードも置いておきます
事前に pip install gspread を1回だけ実行してください(gspread が認証用の google-auth も一緒に入れてくれます)

import gspread

# ダウンロードした秘密鍵(JSON)のパス
gc = gspread.service_account(filename="spreadsheet-editor-xxxxxxxx.json")

# 共有したスプレッドシートを URL で開く
sh = gc.open_by_url("https://docs.google.com/spreadsheets/d/xxxxxxxxxxxxxxxxxxxxxxxx/edit")
ws = sh.sheet1

print(ws.get_all_values())   # 中身が表示されれば成功

JSON はスクリプトと同じフォルダに置くか、フルパスで書きます(Windows なら r”C:\Users\ユーザー名\Downloads\spreadsheet-editor-xxxxxxxx.json” のように先頭に r を付けたraw文字にすると、パスの \ でつまずきません)

gspread の最新安定版は 6.2.1(2025年5月14日リリース、2026年9月時点)、対応するPythonは 3.8 以上
認証の書き方は gspread 公式の認証ページ があるので参考にしてみてください

403 The caller does not have permission や SpreadsheetNotFound と出るとき

私がハマったので備忘的に・・・

ほぼ共有し忘れです
私の手元で試してみたところ、共有する前に実行するとこんなメッセージで止まりました(表記は変わることがあります)

例外が発生しました: PermissionError
{'code': 403, 'message': 'The caller does not have permission', 'status': 'PERMISSION_DENIED'}
gspread.exceptions.APIError: {'code': 403, 'message': 'The caller does not have permission', 'status': 'PERMISSION_DENIED'}

The above exception was the direct cause of the following exception:

  File "C:\Users\xxxx\Desktop\python\sample.py", line 9, in <module>
    sheet = gc.open_by_url('https://docs.google.com/spreadsheets/d/xxxxxxxxxxxxxxxxxxxxxxxx/edit#gid=0').worksheet('テストシート')
PermissionError: 

「SpreadsheetNotFound」(スプレッドシートが見つかりません)で止まる場合も、原因は同じ共有し忘れです
共有ダイアログを開いて、client_email のアドレスが一覧に入っているか確認してください
書き込みで失敗するなら、権限が「閲覧者」のままかもしれません

Google Sheets API has not been used in project … と出るとき

「Google Sheets API has not been used in project … before or it is disabled」のような文言なら、APIを有効にしていないか、別のプロジェクトで作った鍵を使っているかのどちらかです
私が API を有効にしていないプロジェクトの鍵で試したときの実物がこちら(表記は変わることがあります)

例外が発生しました: PermissionError
APIError: [403]: Google Sheets API has not been used in project 123456789012 before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/sheets.googleapis.com/overview?project=123456789012 then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.
gspread.exceptions.APIError: APIError: [403]: Google Sheets API has not been used in project 123456789012 before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/sheets.googleapis.com/overview?project=123456789012 then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.

The above exception was the direct cause of the following exception:

  File "C:\Users\xxxx\Downloads\test.py", line 7, in <module>
    sh = gc.open_by_url("https://docs.google.com/spreadsheets/d/xxxxxxxxxxxxxxxxxxxxxxxx/edit")
PermissionError: 

メッセージの中の project= に続く12桁の数字が、鍵が属しているプロジェクトの番号です
そのリンクをそのまま開くと、そのプロジェクトの Sheets API の有効化ページに飛べるので、そこで「有効にする」を押すのがいちばん早い直し方
有効化したはずなのに出るときは、鍵JSONの project_id が別のプロジェクトになっていないか見比べてみてください

ちゃんと有効になっていても、有効化した直後は反映に数分かかることがあるので、少し待ってから再実行してみてください

秘密鍵で許可される範囲と保管場所、漏洩した場合は削除して作り直す

権限の画面を省略したこの記事の作り方なら、秘密鍵を使って操作できるのはサービスアカウントに共有したファイルだけです
日頃から利用しているGoogleアカウント本体やGmail、共有していない他のシートはもちろん操作できないので安心

ただ、共有したシートに対してパスワードなしで読み書きできる鍵
セキュリティ的にも保管場所は限定して、メール添付やチャットへの貼り付け、クラウド同期のフォルダとかも避けたいところ

ツールを自分のパソコンで動かすなら、開発者に鍵を渡す必要はありません
開発中は開発者に自分のテスト用の鍵を準備してもらうか、本番で使う鍵と別で開発用に一時利用する鍵を渡せばOK
どうしても開発者側のサーバーで動かす運用にするなら専用の鍵を作ってちゃんと操作ログを追えるようにしたいですね

ちなみに鍵の有効期限は既定で無期限、会社の Google Cloud だと組織ポリシーで期限が付くことがあります
1つのサービスアカウントに作れる鍵は最大10個までです

漏洩したかもしれないときは削除して作り直す

手順は「IAMと管理」→「サービスアカウント」→ 対象のアカウント →「キー(鍵)」タブ → 該当の鍵を削除、そのあと新しい鍵を作ってツールに差し替えるだけです
削除するとその鍵では新しく認証できなくなります(反映に少し時間がかかることがあります)

ちなみに GitHub や GitLab の公開リポジトリに鍵JSONを上げてしまうと、2024年6月16日から Google 側が検知して自動で無効化する仕組みが既定で動いているそうです(そもそもそんなミスしないようにしてるので経験ありませんが・・)

会社のアカウントで鍵が作れないと言われたら

「Key creation is not allowed on this service account.」のようなメッセージで鍵の作成が止まる場合は、組織のポリシーで禁止されています
2024年5月3日より後に作られた組織だと、鍵の作成を止める設定が最初から入っているためです

制約の名前は constraints/iam.managed.disableServiceAccountKeyCreation(旧表記は constraints/iam.disableServiceAccountKeyCreation)
個人のGoogleアカウントで作ったプロジェクトなら、この制限にはまず当たりません

会社のアカウントで出たなら、自分では解除できないので Google Cloud の管理者(情報システム部門)にお願いしてみてください

カレンダーやドライブなど他のGoogleサービスでも基本は同じ手順

Google カレンダーや Google ドライブに対してツールで操作したい時も、APIを有効にする → サービスアカウントに共有するの同じ考え方で使えます
コンソールで触る場所も、プロジェクト・APIライブラリ・サービスアカウントの3か所で変わりません

ドライブも同じで、フォルダやファイルは手動で作って、サービスアカウントは許可(共有)された範囲で操作することになります
当然それぞれの所有者は利用している人(=オーナー)になるのでサービスアカウント自身が所有者になる作り方はできません

まとめ ツールを受け取る側がやることリスト

ここまでの作業でツールに読み込ませるのは、JSONファイル1つ共有したシートのURLだけです
抜けやすいところを並べておくので、順番に確かめてみてください

  • Google Cloud コンソールを開いて利用規約に同意した
  • プロジェクトを作って、画面上部でそのプロジェクトを選んでいる
  • Google Sheets API と Google Drive API を有効にした
  • サービスアカウントを作った(権限の画面は省略でよい)
  • JSON形式の秘密鍵をダウンロードした
  • 対象のスプレッドシートを client_email のアドレスに共有した(書き換えるなら編集者)
  • JSONをツールの説明書で指定されたフォルダに置いた
  • JSONはメール・チャットで送らず、公開リポジトリにも上げていない

鍵の用意と共有だけは、どうしても利用者側の作業として残ります
逆に言えばここが終われば、あとはツールを起動するだけの状態です

スプレッドシート連携のツールそのものを作ってほしい、という相談も受けているので、必要なときは気軽に声をかけてください

ジャベ雄

一度通しておけば、2回目からは迷わずに済みます

APIのトークンや鍵を Python から扱う書き方は、Chatwork通知の記事でもう少し具体的に書いています

📚 Python自動化の独学に効く本PR
退屈なことはPythonにやらせよう 第3版

退屈なことはPythonにやらせよう 第3版

Al Sweigart

シゴトがはかどる Python自動処理の教科書

シゴトがはかどる Python自動処理の教科書

クジラ飛行机

もっとシゴトがはかどる Python×Excel×AI 業務自動化の教科書

もっとシゴトがはかどる Python×Excel×AI 業務自動化の教科書

クジラ飛行机

私のおすすめからランダムで3冊を表示しています


最後に・・・

クラウドワークスココナラでお仕事受け付けています!

PythonとExcelを中心に仕事に役立つ業務ツールや自動化、スクレイピングツールの作成を受注していて、クラウドワークスでは気が付けば100件以上のお仕事を受注してきました!

会社員をやりながらの副業なので時間の捻出は相応ですが、クライアントの方々と近い立場でこちらからも提案しながら活動していますのでお悩みあれば是非ご相談ください

ココナラのプロフィールページへ

"ココナラ"に新規登録する際は1,000Pもらえる紹介コード使ってください

78E62K

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

VBAとPythonを中心にユーザー側でできるITを自己学習しているので備忘録半分、学習履歴を残して同じ道を辿る人の参考になればとブログを始めました

副業でスクレイピングツール作成を中心にできることを色々やっていますのでご相談いただけるとありがたいです!


クラウドワークスのページへ


ココナラのページへ

コメント

コメントする

目次