本サイトはアフィリエイト広告(A8.net/もしもアフィリエイト/アクセストレード等)を利用しています
承認エラーを解決するGASアクセス設定手順|OAuth スコープと権限の完全ガイド
📂 GAS入門

承認エラーを解決するGASアクセス設定手順|OAuth スコープと権限の完全ガイド

📅 ⏱ 読了 約8分 ✍️ 凛

💡 本記事には広告(アフィリエイトリンク)が含まれる場合があります。

「Authorization is required to perform that action」——この赤い文字、スクリプトはいったい何を要求しているのでしょうか?

答えを先に言ってしまうと、これはエラーというよりお願いです。「このスクリプトがあなたのスプレッドシートやGmailを触ることを、あなた自身の手で許可してください」と言われているだけ。壊れたわけでも、書いたコードが間違っているわけでもありません。

こんにちは、独学でGASを覚えた現役看護師の凛です。私も副業を始めたばかりの頃、書いたコードを初めて実行した瞬間にこの赤い文字が出て、固まったまま30分以上悩みました。仕組みさえ分かれば何も怖くないので、この記事で承認エラーの正体と、つまずきやすいパターンをまるごと整理していきます。

なぜ「許可」を求められるのか:OAuthスコープの話

GASには OAuthスコープ という考え方があって、「このスクリプトはどのサービスにアクセスしてよいか」を細かく管理しています。いわば関所です。

スコープの例許可される操作
auth/spreadsheetsスプレッドシートの読み書き
auth/gmail.sendGmailでメールを送信する
auth/gmail.readonlyGmailのメールを読み取る
auth/calendarGoogleカレンダーの操作
auth/driveGoogle Driveの操作
auth/script.external_request外部URL(UrlFetchApp)への接続

スクリプトの中で SpreadsheetApp.openById(...) を呼ぶと、GASは「お、スプレッドシートのアクセス権限が要るな」と判断して、実行者に承認を求めてきます。逆に言えば、承認エラーが出たら「どの関所で止められているのか」を見ればいい。この視点があるだけで、エラーの原因はぐっと特定しやすくなります。

ここからは、実際によく出会う4つのパターンを深掘りしていきます。

パターン別・承認エラーの解決手順

その1:「Authorization is required to perform that action」

一番よく出るやつです。初回実行時、スクリプトが必要とする権限がまだ何も承認されていない状態で発生します。解決は次の流れです。

  1. GASエディタ画面で、実行する関数をドロップダウンから選択する
  2. ▶ 実行」ボタンを手動でクリックする
  3. 「このアプリは確認されていません」ダイアログが出る
  4. 詳細」リンクをクリックする
  5. (スクリプト名)に移動」をクリックする
  6. 要求される権限の一覧を確認する
  7. 許可」ボタンをクリックする

途中で「安全でないページ」「確認されていません」と脅されるので、初めてだとここで手が止まりますよね。これは、自分で作ったスクリプトがGoogleの公式審査を受けていないというだけの話です。自分が書いたスクリプトなら問題ありません。「詳細 > 移動」から堂々と許可して大丈夫です。

その2:「insufficient authentication scopes」

こちらは少し意地悪なパターン。初回承認のときには含まれていなかったスコープが、あとから必要になったときに出ます。典型的なのは、動いているスクリプトに新しいサービス(たとえばGmail送信)のコードを追加した場合です。

解決するには、appsscript.json というマニフェストファイルに必要なスコープを自分で書き足します。GASエディタの「プロジェクトの設定(歯車マーク)」を開き、「appsscript.json マニフェスト ファイルをエディタで表示する」をONにすると、ファイル一覧に appsscript.json が現れます。開いて、oauthScopes に必要なスコープを追加して保存してください。

{
  "timeZone": "Asia/Tokyo",
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",
  "oauthScopes": [
    "https://www.googleapis.com/auth/spreadsheets",
    "https://www.googleapis.com/auth/gmail.send",
    "https://www.googleapis.com/auth/gmail.readonly",
    "https://www.googleapis.com/auth/calendar",
    "https://www.googleapis.com/auth/drive",
    "https://www.googleapis.com/auth/script.external_request",
    "https://www.googleapis.com/auth/script.scriptapp",
    "https://www.googleapis.com/auth/userinfo.email"
  ]
}

保存したら、一度権限をリセットしてから(手順はこのあとの「権限をリセットして再承認する」参照)スクリプトを再実行し、承認ダイアログで再承認します。スコープを書き足しただけでは反映されない、というのが最大の落とし穴なので覚えておいてください。

その3:「You do not have permission to access the requested document」

これはスコープではなく、ファイルそのものへのアクセス権の問題です。操作しようとしているスプレッドシートやDriveファイルが、スクリプトを実行しているGoogleアカウントに共有されていないと出ます。

対処はシンプルで、まずファイルのオーナーに「閲覧者」または「編集者」として共有してもらうこと。あわせて、GASの「次のユーザーとして実行」が「自分」になっているか、そして openById に渡しているファイルIDがそもそも合っているかも確認してください。意外と「IDのコピペミスだった」というオチも多いです。

その4:別のアカウントからトリガーを実行すると動かない

見落としがちなのがこれ。GASのトリガーは「設定した人のアカウント」で動きます。共有スプレッドシートに仕込んだトリガーでも、実行されるのは設定者本人として。だから他のユーザーが使う場面では「設定者には権限がある → 実行ユーザーには権限がない」という不一致が起きるんです。

対処は2通りあって、各ユーザーがそれぞれ自分でトリガーを設定するか、Webアプリとして公開して「次のユーザーとして実行:アクセスしているユーザー」を選ぶか。用途に合わせて選んでください。

スコープ早見表

appsscript.json に追記するときの参照用に、よく使うスコープをまとめておきます。

やること必要なスコープ
スプレッドシートの読み書きauth/spreadsheets
Gmailでメールを送信するauth/gmail.send
Gmailのメールを読み取るauth/gmail.readonly
Gmailの全操作auth/gmail.modify
Googleカレンダーの操作auth/calendar
Google Driveの操作auth/drive
外部URL(UrlFetchApp)への接続auth/script.external_request
トリガーの作成・削除auth/script.scriptapp
実行ユーザーのメールアドレス取得auth/userinfo.email
Google Sheets API(高度な操作)auth/spreadsheets + Sheets APIサービスを追加

権限をリセットして再承認する

スコープを変更したあとや、「一度まっさらにして承認し直したい」ときの手順です。

  1. ブラウザで https://myaccount.google.com/permissions にアクセスする
  2. ページ内のアプリ一覧から対象のGASスクリプト名を探す
  3. アクセス権を削除」をクリックする
  4. GASエディタに戻り、スクリプトを手動実行する
  5. 新しいスコープを含めた承認ダイアログが出てくるので「許可」をクリックする

運用していて気づいたこと

スコープ追加と「リセット→再承認」は必ずセット

繰り返しになりますが、appsscript.json にスコープを追加しただけでは、すでに承認済みの古いスコープが使われ続けます。新しいスコープを効かせるには、上のリセット手順で一度アクセス権を削除してからの再承認が必要です。私は最初この手順を知らずに「スコープ追加したのにまだエラーが出る」で1時間悩みました。同じ回り道をする人が一人でも減りますように。

新しいサービスを足したら、トリガー任せにせず一度手動実行

トリガーで自動実行しているスクリプトに新しいサービスを追加した場合、トリガー実行では承認ダイアログが出せないため、新しい権限が使えないまま止まります。機能を追加したら、必ず一度手動実行して承認ダイアログを通してから自動実行に戻す。副業のクライアント向けに動かしているスクリプトが「機能追加後に止まった」ときは、ほぼこのパターンでした。

他人のGASは、要求スコープを読んでから許可する

「便利そう」と他人のスクリプトをコピーして実行するとき、承認ダイアログに出る権限一覧はちゃんと読んでいますか?「Gmail読み取り」を許可すればメールの全内容を読まれる可能性がありますし、「Drive編集」ならファイルの削除まで可能です。信頼できるソース(公式サイト・著名な技術ブログ)以外のGASは、慎重すぎるくらいでちょうどいいと思っています。

それでもハマったときのチェックポイント

「このアプリはGoogleによって確認されていません」から進めない

「詳細」リンクが見当たらない、というケースがほとんどです。ダイアログの右下に小さくあります。見つからなければウィンドウを少し小さくしてスクロールすると出てくることも。「詳細」をクリックすると「(スクリプト名)に移動(安全でないページ)」というリンクが現れるので、そこから許可画面に進めます。

Webアプリとして公開したら「Forbidden」が返ってくる

Webアプリの「アクセスできるユーザー」が「自分のみ」になっているのが原因です。外部サービス(LINE・Stripe等)からのPOSTは匿名アクセス扱いなので弾かれます。「デプロイを管理 > 編集 > アクセスできるユーザー:全員」に変更して、新しいバージョンでデプロイし直してください。

appsscript.json に追記したのに新しいスコープが効かない

既存の承認情報が古いスコープのまま残っているためです。myaccount.google.com/permissions でアクセス権を削除して、GASエディタから再実行し、新しいスコープで再承認すれば直ります。

怖がらなくて大丈夫、という話

最後に、4パターンを一覧にしておきます。

エラーの種類原因解決策
Authorization is required初回の承認が未完了手動実行→許可ダイアログで承認
insufficient authentication scopes必要なスコープが未追加appsscript.json にスコープを追加→再承認
permission to access the documentファイルへのアクセス権がないファイルオーナーに共有してもらう
別アカウントからのトリガーが動かないトリガーは設定者アカウントで動く各ユーザーが自分でトリガーを設定

冒頭の問いに戻ると、承認エラーは「壊れた」の合図ではなく「許可がほしい」の合図です。どの関所で止められているのかさえ分かれば、全パターン自分の手で解決できます。赤い文字が出ても、深呼吸してこの記事のパターンと照らし合わせてみてください。30分固まっていたあの日の私に、そう教えてあげたいです。

関連記事


この記事を書いた人:凛

2児2児のママで現役ナース。夜勤明けの細切れ時間を副業GASに投じ、月5〜8万円の副収入を継続中。「看護師でもコードは書ける」を合言葉に、家事育児とプログラミングを両立する等身大の情報を発信しています。


記事中の設定例・手順は執筆時点の画面と仕様をもとに確認のうえ掲載しています。お使いの環境では表示が異なる場合があります。