はじまり
ああもう、いちいち認証画面出すのめんどくさいなあ・・・
ああ、ときどき表示されるやつだな
自動トリガーを付けてても、この認証切れで動かなくなっちゃうから困っちゃうよ!
まあ一応ずっと動かすことは可能です。
※当ページはアフィリエイト広告を利用しています。
この記事の読者の想定
- 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」のスコープのリファレンスで確認します。
例えば、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アプリケーション内のプロンプトとサイドバーで、サードパーティのウェブコンテンツを表示、実行します」の項目はいまいちどのスコープで明示できるのかが分かりません・・・
それもそうです。なぜならば、先程挙げたスコープのリファレンスには載っていません。
まず、「外部サービスへの接続」なのですが、このスコープは別にあるスコープのリファレンスに載っています。
おそらく、「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アプリケーション内のプロンプトとサイドバーで、サードパーティのウェブコンテンツを表示、実行します」の項目なのですが、このスコープのリファレンスはまた別の場所で掲載されています・・・
このような記述が発見できたかと思います。
{
...
"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
ファイルの設定方法
しかしながら、スコープの掲載場所が分かれていて探すのに苦労しました・・・
個人的には、もう、スコープは全部同じ場所に一覧で表示していてもらいたいです・・・
Google Apps Scriptの関連書籍
Google Apps Script × ChatGPTのツボとコツがゼッタイにわかる本
Google Apps Script Webアプリ開発 第4版
Google Apps Script目的別リファレンス 実践サンプルコード付き 第3版
Google Apps Script クローリング&スクレイピングのツボとコツがゼッタイにわかる本
おしまい
ああ、設定できてしまえば、これはかなり快適かもしれない
クドかったからなあ・・・
以上になります!
コメント