【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を作成します。
各アカウントの認証ファイルができた後は二つの方法があります。
 方法1: -A / --auth オプションで認証ファイルのpathを指定
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となります。これでアカウントの切り替えは完了です。
 方法2: コマンド前に.clasprc.jsonに各アカウントの認証ファイルをコピーする
別解として、デフォルトで見に行く.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