🦥

【Clasp】いちいちclasp loginせずに複数アカウントを切り替えたい(Google Apps Script)

2022/12/28に公開

はじめに🦥

Google Apps Scriptをローカル開発するなら不可欠なツール、Clasp。
https://github.com/google/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 cloneclasp pushをする前に、clasp loginでアカウント切り替えが都度必要になること。

たとえば、アカウントAのプロジェクトを開発した後、アカウントBのプロジェクトを開発するには改めてclasp loginをし、アカウントBで再認証する必要があります。

いちいちclasp loginしてChromeの認証画面を開き、オーナーアカウントでログインし直すのは積もり積もって面倒です。 各プロジェクトごとにローカルで認証ファイルを持たせることもできますが、Github管理には適しません。


いちいちログインして切り替えるのは面倒...

ということで、怠惰は美徳、Claspで複数アカウントを切り替える方法を調べました。

TL;DR🐍

お忙しいあなたに。結論です。

方法その1

  1. 各アカウントごとの認証ファイルをグローバルログインで作成・リネームする。
  2. clasp pushなどのコマンドに-Aまたは--authオプションを追加、認証ファイルを指定する。

方法その2

  1. 各アカウントごとの認証ファイルをグローバルログインで作成・リネームする。
  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コマンドごとに自動で更新されるため、失効の心配はないそうです。
https://github.com/google/clasp/issues/225#issuecomment-398818552

各アカウントごとに認証ファイルを作成・リネーム📜

前置きは以上です。

さっそく各アカウントで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のコメントを参考にしました。
https://github.com/google/clasp/issues/42

追記➕

ところで、.clasprc.jsonrcってなんでしょう。ラジコンでしょうか。
どうやらruncom filerun commandsが起源のようです。
http://www.catb.org/jargon/html/R/rc-file.html

脚注
  1. https://github.com/google/clasp/blob/master/docs/config-files.md ↩︎

  2. ローカルログインの方法に関してはこちらを参照してください。GCPで認証ファイルを作成⇒プロジェクトのワーキングディレクトリに配置⇒clasp login --creds <fileName>という手順です。 ↩︎

  3. https://github.com/google/clasp/blob/551000b55565d20fccc29673c5460022d42ee5cf/docs/config-files.md ↩︎

Discussion