【Clasp】いちいちclasp loginせずに複数アカウントを切り替えたい(Google Apps Script)
はじめに🦥
Google Apps Scriptをローカル開発するなら不可欠なツール、Clasp。
私も社内に林立するGoogle Apps ScriptのGithub管理(とTypeScript化)のため、日々お世話になっています。
しかし、下記のように複数オーナーのGoogle Apps Scriptを単一リポジトリで管理するに至って面倒が生じました。
//複数オーナーのGoogle Apps Scriptを一つのリポジトリで管理
📦GAS_Clasp
┣ 📂Owner A
┃ ┣ 📂ProjectA-1
┃ ┃ ┣ 📜.clasp.json
┃ ┃ ┣ 📜appsscript.json
┃ ┃ ┣ 📜code.ts
┃ ┃ ┣ 📜tsconfig.json
┃ ┃ ┗ 📜package.json
┃ ┣ 📂ProjectA-2
┣ 📂Owner B
┃ ┣ 📂ProjectB-1
┃ ┣ 📂ProjectB-2
┗ 📜README.md
それは、clasp clone
やclasp push
をする前に、clasp login
でアカウント切り替えが都度必要になること。
たとえば、アカウントAのプロジェクトを開発した後、アカウントBのプロジェクトを開発するには改めてclasp login
をし、アカウントBで再認証する必要があります。
いちいちclasp login
してChromeの認証画面を開き、オーナーアカウントでログインし直すのは積もり積もって面倒です。 各プロジェクトごとにローカルで認証ファイルを持たせることもできますが、Github管理には適しません。
いちいちログインして切り替えるのは面倒...
ということで、怠惰は美徳、Claspで複数アカウントを切り替える方法を調べました。
TL;DR🐍
お忙しいあなたに。結論です。
方法その1
- 各アカウントごとの認証ファイルをグローバルログインで作成・リネームする。
-
clasp push
などのコマンドに-A
または--auth
オプションを追加、認証ファイルを指定する。
方法その2
- 各アカウントごとの認証ファイルをグローバルログインで作成・リネームする。
-
clasp push
などのコマンド前に、~/.clasprc.json
に1で作った認証ファイルをコピーする。
環境🌲
- Clasp v.2.4.2
- Windows 11
- 既定ブラウザ:Google Chrome 108.0.5359.125
Claspの認証方法について🔑
最初にClaspの認証方法を見ておきます。
Claspにはグローバルとローカルの2種類のログインがあり、デフォルトでは、
- グローバル: ~/.clasprc.json
- ローカル: .clasprc.json
をそれぞれ読みにいきます。[1]
うち、本項ではグローバルログインに絞って記述します。[2]
たんにclasp login
をするとグローバルログインとなり、表示されるOAuth2の認証リンクからブラウザでログインすると、そのアカウント用の.clasprc.json
が生成されます。生成場所は~/
、すなわちホームディレクトリ以下です。
clasp login
プロジェクトのオーナーアカウントでログイン
.clasprc.json
はこんな感じ。秘匿ファイルなのでGithub等には置きません。
{
"token": {
"access_token": "~~~~~~~~~~",
"refresh_token": "~~~~~~~~~~",
"scope": "~~~~~~~~~~",
"token_type": "Bearer",
"id_token": "~~~~~~~~~~",
"expiry_date": 1667183642053
},
"oauth2ClientSettings": {
"clientId": "~~~~~~~~~~",
"clientSecret": "~~~~~~~~~~",
"redirectUri": "http://localhost"
},
"isLocalCreds": false
}
expiry_date
が指定されていますが、clasp
コマンドごとに自動で更新されるため、失効の心配はないそうです。
各アカウントごとに認証ファイルを作成・リネーム📜
前置きは以上です。
さっそく各アカウントでclasp login
をして、グローバルログインを行い、.clasprc.json
をホームディレクトリ以下に作成します。
clasp login
Logging in globally…
🔑 Authorize clasp by visiting this url:
https://accounts.google.com/o/oauth2/v2/auth?access_type=offline&scope=~~~~~
URLからChromeで認証。
Authorization successful.
Default credentials saved to: C:\Users\<userName>\.clasprc.json.
ここで、作成した.clasprc.json
をリネームします。
mv ~/.clasprc.json ~/.clasprc-accountA.json
同様にしてChromeでのログイン先のアカウントを変えてaccountBでも行い、~/.clasprc-accountB.json
を作成します。
各アカウントの認証ファイルができた後は二つの方法があります。
-A
/ --auth
オプションで認証ファイルのpathを指定
方法1: claspコマンドの際に読みに行く認証ファイルのpathは-A <path>
または--auth <path>
で指定ができます。[3]
したがって、accountAのプロジェクトにclasp push
したいときは、先ほどの.clasprc-accountA.json
を指定して、
clasp push -A ~/.clasprc-accountA.json
とすれば、accountAでのpushになります。一方で、
clasp push -A ~/.clasprc-accountB.json
とすれば、もちろんaccountBでのpushとなります。これでアカウントの切り替えは完了です。
.clasprc.json
に各アカウントの認証ファイルをコピーする
方法2: コマンド前に別解として、デフォルトで見に行く.clasprc.json
を書き換えることでもマルチアカウント対応が可能です。つまり、
cp ~/.clasprc-accountA.json ~/.clasprc.json
clasp push
とすれば、accountAのpushに、
cp ~/.clasprc-accountB.json ~/.clasprc.json
clasp push
とすれば、accountBのpushになります。
おわりに🦭
以上、Claspで複数アカウントを管理するケースでのアカウント切り替え方法でした。
私は2番目のローカルに各アカウントの認証ファイルを置いておき、cloneやpushに先んじて.clasprc.json
にコピーする方法を採っています。その際、各プロジェクトのオーナー名を親ディレクトリから取得する関数を用意し、npm scriptで回してあげるとストレスフリーです。
Claspでアカウント切り替えが面倒だな~と思ったら、ぜひお試しあれ。
参考🔍
下記issueのコメントを参考にしました。
追記➕
ところで、.clasprc.json
のrc
ってなんでしょう。ラジコンでしょうか。
どうやらruncom file
⇒run commands
が起源のようです。
-
https://github.com/google/clasp/blob/master/docs/config-files.md ↩︎
-
ローカルログインの方法に関してはこちらを参照してください。GCPで認証ファイルを作成⇒プロジェクトのワーキングディレクトリに配置⇒
clasp login --creds <fileName>
という手順です。 ↩︎ -
https://github.com/google/clasp/blob/551000b55565d20fccc29673c5460022d42ee5cf/docs/config-files.md ↩︎
Discussion