【GAS】「承認が必要です:このプロジェクトがあなたのデータへのアクセス権限を必要としています。」の表示工程を省くようにするスコープ設定

Code

はじまり

リサちゃん
リサちゃん

ああもう、いちいち認証画面出すのめんどくさいなあ・・・

135ml
135ml

ああ、ときどき表示されるやつだな

リサちゃん
リサちゃん

自動トリガーを付けてても、この認証切れで動かなくなっちゃうから困っちゃうよ!

135ml
135ml

まあ一応ずっと動かすことは可能です。

この記事の読者の想定

  • Google Apps Scriptの認証がいちいちめんどくさいと思う人
  • 個人でGoogle Apps Scriptを使って開発、そして利用している人

認証がクドい時ってありますよね

Google Apps Script(GAS)を利用している際に、

「承認が必要です:このプロジェクトがあなたのデータへのアクセス権限を必要としています」

というメッセージが表示されることがあります。

このメッセージは、GASがGoogleサービス内のユーザーのデータにアクセスしようとする時に、そのアクセスに必要な承認がまだ得られていない場合に表示されます。

この承認プロセスは、「OAuth」方式によって行われています。なので、OAuth認証情報の期限が切れていると再び認証プロセスを踏んで認証情報を更新して上げる必要があるわけです。

確かに、このメッセージはセキュリティを確保する上で重要です。

しかし、開発中や頻繁にアクセス権限の範囲を変更する必要がない場合は、この承認プロセスを簡素化もしくは省略したいと考えるかもしれません。少なくとも僕はそう考えました。

そこで、この承認プロセスを省略するための方法を紹介していきます。

1. GCPプロジェクトの設定を確認する

まず、承認プロセス省略のためにしなければならないことが、GCP(Google Cloud Platform)プロジェクトとの連携です。

そこで、GASの「プロジェクトの設定」画面を開いて、「Google Cloud Platform(GCP)プロジェクト」の部分にあるプロジェクト番号が自分が紐つけたいプロジェクト番号と一致しているかどうかを確認します。

2. GCPプロジェクトでAPIを有効化する

そうしたら次に、その紐づけたGCPプロジェクトでAPIを有効化します。

GCPプロジェクトのダッシュボードを開いて、「APIとサービス」>「ライブラリ」と遷移します。

そこでライブラリを検索するページに遷移するのですが、

検索するAPIの名称は、下記の「Google Identity」のスコープのリファレンスで確認します。

OAuth 2.0 Scopes for Google APIs  |  Authorization  |  Google for Developers

例えば、GASを実行して、認証プロセスのページが開いた時に表示された内容がこのような感じだったとします。

この場合、適用したいAPIの名称は、「Apps Script API, v1」になります。

なので、「Apps Script API」が有効になっていることを確認します。

これで有効化は完了です。

3. GAS内でスコープの明示

次に、GASプロジェクト内でOAuthのスコープを明示します。

そのために、「マニフェストファイル」というものを編集していきます。

appsscript.jsonを編集可にする

GASの「プロジェクトの設定」画面を開いて、「全般設定」内の『「appsscript.json」マニフェストファイルをエディタで表示する』にチェックを付けます。

すると、appsscript.jsonというファイルが編集できるようになります。

appsscript.jsonを編集する

appsscript.jsonを開くと、色々なフィールドに対して設定が書かれていると思いますが、

そのファイルの中に、"oauthScopes"フィールドを追加してOAuthスコープを明示していきます。

例えば、さっきのように、認証画面でこのように表示されていた場合・・・、

これらのスコープを加える必要があるでしょう。

{
  "timeZone": "Asia/Tokyo",
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",

  ...

  "oauthScopes": [
    "https://www.googleapis.com/auth/drive",
    "https://www.googleapis.com/auth/documents",
    "https://www.googleapis.com/auth/spreadsheets",
    "https://www.google.com/calendar/feeds",
    "https://www.googleapis.com/auth/script.external_request",
    "https://www.googleapis.com/auth/script.container.ui",
    "https://www.googleapis.com/auth/spreadsheets.currentonly"
  ]
}

一部、別サイトに載っているスコープがある・・・

Googleドライブ、ドキュメント、スプレッドシートやGoogleカレンダーは、前節で挙げたスコープのリファレンスに載っているので比較的分かりやすいです。

しかし、「外部サービスへの接続」、「Googleアプリケーション内のプロンプトとサイドバーで、サードパーティのウェブコンテンツを表示、実行します」の項目はいまいちどのスコープで明示できるのかが分かりません・・・

それもそうです。なぜならば、先程挙げたスコープのリファレンスには載っていません。

まず、「外部サービスへの接続」なのですが、このスコープは別にあるスコープのリファレンスに載っています。

Scopes  |  Apps Script  |  Google for Developers

おそらく、「Other scopes」の部分で、発見できるかと思います。

{
  "timeZone": "Asia/Tokyo",
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",

  // ...

  "oauthScopes": [
    "https://www.googleapis.com/auth/drive",
    "https://www.googleapis.com/auth/documents",
    "https://www.googleapis.com/auth/spreadsheets",
    "https://www.google.com/calendar/feeds",
    "https://www.googleapis.com/auth/script.external_request", // <- This is it!
    "https://www.googleapis.com/auth/script.container.ui",
    "https://www.googleapis.com/auth/spreadsheets.currentonly"
  ]
}

そして、また別のサイトに載っているスコープがある・・・

そして、「Googleアプリケーション内のプロンプトとサイドバーで、サードパーティのウェブコンテンツを表示、実行します」の項目なのですが、このスコープのリファレンスはまた別の場所で掲載されています・・・

Authorization scopes for Editor Add-ons  |  Apps Script  |  Google for Developers

このような記述が発見できたかと思います。

{
  ...
  "oauthScopes": [
    "https://www.googleapis.com/auth/script.container.ui",
    "https://www.googleapis.com/auth/spreadsheets.currentonly"
  ],
  ...
}

なので、appsscript.json"oauthScopes"の中身はこのようになるでしょう。

{
  "timeZone": "Asia/Tokyo",
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",

  ...

  "oauthScopes": [
    "https://www.googleapis.com/auth/drive",
    "https://www.googleapis.com/auth/documents",
    "https://www.googleapis.com/auth/spreadsheets",
    "https://www.google.com/calendar/feeds",
    "https://www.googleapis.com/auth/script.external_request",
    "https://www.googleapis.com/auth/script.container.ui", // <- This is it!
    "https://www.googleapis.com/auth/spreadsheets.currentonly" // <- This is it!
  ]
}

と、なると思うのですが、実際のところ、やりたいこととは少し違ってきます。

currentonlyをスコープに含めると結局認証プロセスが走ってしまう

「currentonly」があるスコープは、ざっと挙げると以下のものになります。

"https://www.googleapis.com/auth/documents.currentonly"
"https://www.googleapis.com/auth/spreadsheets.currentonly"
"https://www.googleapis.com/auth/presentations.currentonly"

しかし、これらのスコープをappsscript.jsonに含めてしまうと、結局例の認証画面を開いて認証しなければならなくなりますので、今回はこれらのスコープは省きます。

{
  "timeZone": "Asia/Tokyo",
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",

  ...

  "oauthScopes": [
    "https://www.googleapis.com/auth/drive",
    "https://www.googleapis.com/auth/documents",
    "https://www.googleapis.com/auth/spreadsheets",
    "https://www.google.com/calendar/feeds",
    "https://www.googleapis.com/auth/script.external_request",
    "https://www.googleapis.com/auth/script.container.ui", // <- This is it only!
  ]
}

そして、実行!

そして、編集したappsscript.jsonが保存されていれば、認証するためのクドい画面はもう出てこなくなるはずです。

しかし、GASプロジェクトを作成してから最初の実行時は、もしかしたら認証プロセスが必ず走るかもしれません。

まとめ

Google Apps Script (GAS) でOAuth認証プロセスを省略するためのスコープ設定方法を紹介しました。

本記事は、以下の流れで書かれました。

  • GCPプロジェクトの設定確認
  • 認証を省略したいスコープを担うAPIの有効化
  • appsscript.jsonファイルの設定方法

しかしながら、スコープの掲載場所が分かれていて探すのに苦労しました・・・

個人的には、もう、スコープは全部同じ場所に一覧で表示していてもらいたいです・・・

おしまい

リサちゃん
リサちゃん

ああ、設定できてしまえば、これはかなり快適かもしれない

135ml
135ml

クドかったからなあ・・・

以上になります!

コメント

タイトルとURLをコピーしました