初めに
claspはGoogleAppsScript(GAS)のプロジェクトを操作するCLIツールです。
GASプロジェクトに入ってるファイルを丸々ローカルに落として着たり、逆にローカルにあるファイルをまとめてGASプロジェクト内にアップロードする作業を自動でやってくれる優れものです(そのほかにもいろいろ機能はありますがここでは説明しません)。
何がやりたいか
プロジェクトAには開発中のコードが入っていて、動作確認ができたら本番用のプロジェクトBにプッシュしたい。
でも、claspのコマンドには、プッシュ先を指定してプッシュするコマンドはないようです...
プッシュ先を切り替えるコマンドを書いた
#!/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
ファイル内に次のように保存されます。
{"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
を埋め込んでおきます。
デモ
function checkRunningMode() {
Logger.log(RUNNING_MODE);
}
このコードを作成しdevモードでpushしてみます。
$ ./push.sh dev
└─ RUNNING_MODE.js
└─ appsscript.json
└─ demo.js
Pushed 3 files.
GASプロジェクトで、checkRunningMode()
を実行してみます。
まとめ
claspのプッシュ先を切り替えるコマンドを作成しました。
作成したコードはこちらに置いておきます。
https://github.com/ttk1/clasptool