Bash
Node.js
GoogleAppsScript
gas
clasp

claspでpush先を切り替えるコマンドを書いた


初めに

claspはGoogleAppsScript(GAS)のプロジェクトを操作するCLIツールです。

GASプロジェクトに入ってるファイルを丸々ローカルに落として着たり、逆にローカルにあるファイルをまとめてGASプロジェクト内にアップロードする作業を自動でやってくれる優れものです(そのほかにもいろいろ機能はありますがここでは説明しません)。


何がやりたいか

プロジェクトAには開発中のコードが入っていて、動作確認ができたら本番用のプロジェクトBにプッシュしたい。

でも、claspのコマンドには、プッシュ先を指定してプッシュするコマンドはないようです...


プッシュ先を切り替えるコマンドを書いた


push.sh

#!/bin/bash -eu

RUNNING_MODE=$1
cd $(dirname $0)

if [[ $RUNNING_MODE = dev ]]; then
SCRIPT_ID="xxx_dev_script_id_xxx"
elif [[ $RUNNING_MODE = stg ]]; then
SCRIPT_ID="xxx_stg_script_id_xxx"
elif [[ $RUNNING_MODE = prd ]]; then
SCRIPT_ID="xxx_prd_script_id_xxx"
else
echo 'usage: ./push.sh <dev|stg|prd>'
exit 1
fi

echo '{"scriptId":"'$SCRIPT_ID'"}' > .clasp.json
echo 'var RUNNING_MODE = '\'$RUNNING_MODE\'\; > RUNNING_MODE.js
clasp push


./push.sh dev コマンドで、 xxx_dev_script_id_xxx の箇所にあらかじめ入力しておいたスクリプトIDのプロジェクトへプッシュされます。 ./push.sh stg./push.sh prd に関しても同様です。(開発、ステージング、本番のそれぞれの環境へプッシュ先を切り替える想定です。)


動作の仕組み

clasp clone したプロジェクトのスクリプトIDは、クローン先直下の .clasp.json ファイル内に次のように保存されます。


.clasp.json

{"scriptId":"プロジェクトのスクリプトID"}


なので、上に示した push.sh

echo '{"scriptId":"'$SCRIPT_ID'"}' > .clasp.json

の部分で無理やり上書きしています。単純。

claspには、 .clasp.json 内のパラメータを上書きするコマンド clasp setting があるのでこの部分は、

clasp setting scriptId $SCRIPT_ID

と書くこともできます。ただしこの場合 .clasp.json が元から存在し、キーとして scriptId を持っている必要があります。

ついでなので、どこにプッシュしたかをスクリプト側で取得するために、

echo 'var RUNNING_MODE = '\'$RUNNING_MODE\'\; > RUNNING_MODE.js

の部分で変数 RUNNING_MODE を埋め込んでおきます。


デモ


demo.js

function checkRunningMode() {

Logger.log(RUNNING_MODE);
}

このコードを作成しdevモードでpushしてみます。

$ ./push.sh dev

└─ RUNNING_MODE.js
└─ appsscript.json
└─ demo.js
Pushed 3 files.

GASプロジェクトで、checkRunningMode() を実行してみます。

image.png


まとめ

claspのプッシュ先を切り替えるコマンドを作成しました。

作成したコードはこちらに置いておきます。

https://github.com/ttk1/clasptool