Google Sheets APIで「Request had insufficient authentication scopes」(403 Forbidden)を修正する

intermediate📗 Google Sheets2026-04-16| Google Cloud SDK / Google Sheets API v4を使用したNode.js、Python、Java、またはGo

Error Message

403 Forbidden: Request had insufficient authentication scopes.
#google-sheets-api#oauth2#scopes#403-forbidden

エラーメッセージ

このエラーは、データの読み取りから変更へと移行したときに発生することがほとんどです。ターミナルまたはログに次のような 403 Forbidden レスポンスが表示されます:

{
  "error": {
    "code": 403,
    "message": "Request had insufficient authentication scopes.",
    "status": "PERMISSION_DENIED",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.ErrorInfo",
        "reason": "ACCESS_TOKEN_SCOPE_INSUFFICIENT",
        "domain": "googleapis.com",
        "metadata": {
          "service": "sheets.googleapis.com",
          "method": "google.apps.sheets.v4.SpreadsheetsService.GetSpreadsheet"
        }
      }
    ]
  }
}

つまり、API は「あなたが誰であるかは分かっているが、その操作を行う権限がない」と告げているのです。

根本原因

OAuth2 のスコープは、それぞれの部屋に対応する専用の鍵と考えてください。「ロビー」の鍵しか持っていなければ、「金庫室」には入れません。このエラーは、呼び出そうとしている API メソッドに必要な権限がアクセストークンに不足している場合に発生します。

よくある原因は次のとおりです:

  • 権限の不一致: アプリを spreadsheets.readonly で初期化したのに、spreadsheets.values.append の呼び出しを実行しようとしている。
  • 古いトークン: コード内の SCOPES 配列を更新したが、アプリが初回実行時にキャッシュされた古いトークンをまだ使用している。
  • ファイルの制限: アプリが作成したわけではないファイルに、広範な drive または spreadsheets スコープなしにアクセスしようとしている。

エラーの修正方法

1. ソースコードのスコープを更新する

まず、スクリプトに必要なアクセスレベルを正確に特定してください。できる限り制限の厳しいスコープを使用することがベストプラクティスですが、必要な権限は満たしていなければなりません。Google Sheets の標準的なオプションは次のとおりです:

  • 読み取り専用: .../auth/spreadsheets.readonly(スプレッドシートとプロパティの表示)
  • 読み取り/書き込み: .../auth/spreadsheets(スプレッドシートの読み取り、編集、作成)
  • ファイル限定: .../auth/drive.file(アプリが開いたまたは作成したファイルへのみアクセス)

google-auth を使用した Python スクリプトでは、定義を次のように変更します:

# 旧来の制限されたスコープ:
SCOPES = ['https://www.googleapis.com/auth/spreadsheets.readonly']

# 書き込み/編集用に更新したスコープ:
SCOPES = ['https://www.googleapis.com/auth/spreadsheets']

2. キャッシュされたトークンを削除する(重要な手順)

コードを変更するだけでは不十分です。多くの Google ライブラリは、ログインプロンプトが繰り返し表示されないよう、access_tokenrefresh_token をローカルに保存します。このファイル(通常は token.jsontoken.pickle、または credentials.json)には、古い限定的な権限がまだ残っています。

このローカルトークンファイルを手動で削除する必要があります。

削除後、スクリプトを再起動してください。これにより、ブラウザで OAuth2 フローが強制的に起動されます。昇格された権限が一覧表示された新しい同意画面が表示されます。承認すると、正しいスコープを持つ新しいトークンが生成され、403 エラーが即座に解消されます。

3. Google Cloud Console と合わせて確認する

本番環境のアプリでは、リクエストするスコープがプロジェクト設定で宣言した内容と一致している必要があります。ここに不一致があると、検証の警告や完全な障害が発生する可能性があります。

  • Google Cloud Console を開く。
  • APIs & Services > OAuth 同意画面 に移動する。
  • アプリを編集 を選択し、スコープ セクションまでスクロールする。
  • https://www.googleapis.com/auth/spreadsheets が追加・保存されていることを確認する。

確認手順

修正が恒久的であることを確認するには、次の手順に従ってください:

  • スクリプトを実行し、ブラウザリダイレクトを待つ。
  • Google ログインページの権限一覧を注意深く確認する。「すべての Google スプレッドシートの表示、編集、作成、削除」と明記されているはずです。
  • ディレクトリに新しく作成された token.json があることを確認する。
  • API 呼び出しを実行する。200 OK ステータスが返れば、正常に動作しています。

セキュリティと予防策

複数の環境を管理していると、スコープの設定が徐々にずれていくことがあります。スコープを環境変数に保存することをお勧めします。これにより、ローカル開発環境と本番サーバー間で権限を切り替えやすくなります。

サービスアカウントや複雑な OAuth 設定が必要なシステムを構築する場合、セキュリティは最重要事項です。環境ファイルを設定する際は、ToolCraft の Password Generator を使用して、アプリ内部のシークレット用にユニークで高エントロピーな文字列を生成しています。コードベースに残されがちな弱いプレースホルダーを避けるためのシンプルな方法です。

常に最小権限の原則を守ってください。アプリが作成したシートのみを編集する場合は drive.file を使用し、ユーザーのライブラリ内の任意のファイルに触れる必要がある場合にのみ、完全な spreadsheets スコープを使用してください。トークンが漏洩した際のリスクを最小限に抑えることができます。

Related Error Notes