初めに
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