【GAS】Claspを開発と本番とで切り替える

こんにちは、フリーランスエンジニアの太田雅昭です。

Clasp

Claspは、簡単にGASを実行環境へデプロイできるツールです。

ただ複数対象には対応していません。たとえば開発と本番とで、切り替えたい時もあります。claspコマンドでオプションでつけてくれていればいいのですが、2025年1月18日現在、そういった機能は提供されていません。あくまで.clasp.jsonを参照するのみです。うーん、世知辛い

環境で切り替える

デプロイ対象を切り替えるためには、.clasp.jsonを書き換える必要があります。そこで以下のようなアプローチを取ります。

  • .env, .env.productionを用意する
  • スクリプトで、.clasp.jsonを書き換える

といった機能を、ライブラリで実装してみました。これを使うと、簡単に環境切り替えを実装できます。

https://www.npmjs.com/package/@masa-dev/create-gas-app

以下、切り替えに必要なコード部分です。シンプルですね。

const availabelEnvs = ['dev', 'stag', 'prod'];
const envSuffixes: Record<(typeof availabelEnvs)[number], string> = {
  dev: '',
  stag: '.staging',
  prod: '.production',
};

async function changeEnv(env: (typeof availabelEnvs)[number] = 'dev') {
  if (!availabelEnvs.includes(env)) {
    throw new Error(`Invalid environment: ${env}`);
  }
  const envPath = `.env${envSuffixes[env]}`;
  const claspJsonPath = '.clasp.json';

  if (!fs.existsSync(envPath)) {
    throw new Error(`${envPath} not found`);
  }

  dotenv.config({ path: envPath });
  const scriptId = process.env.SCRIPT_ID;
  if (!scriptId) {
    throw new Error(`SCRIPT_ID not found on ${envPath}`);
  }

  const data = {
    scriptId,
    rootDir: distDir,
  };

  fs.writeFileSync(claspJsonPath, JSON.stringify(data, null, 2));
  console.log(`env changed to ${env}`);
}