【Google Apps Script】GitHubを活用したチーム開発手順の解説

## 概要

- [wywy(ワイワイ)合同会社](https://wywy.jp/)でCEO兼エンジニア担当しています。
- GASの開発を複数人でやるようになり、チーム開発が必要になってきたので、GitHubを活用したGAS開発手順をまとめてみました。
- GASの場合、ローカルでの開発とは異なり、クラウド上での開発になるので、Chrome拡張機能でGitを操作する必要があるなど特有のノウハウが必要になります。
    - 「Node.jsのclaspを使えばいいじゃん！」って声も聞こえてきそうですが一般向きでは無いので、この記事では割愛します。

## 方針

- GitHubフロー（現在、mainブランチが推奨です。masterブランチは非推奨です。）
    - ![at-it-git-15-009.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112294/78ae96c8-801b-9ac6-421a-35b4f7cb30b6.jpeg)
        - https://atmarkit.itmedia.co.jp/ait/articles/1708/01/news015.html より引用

- スクリプトファイル名にGitHubリポジトリ名、ブランチ名を含めるように命名規則を決める。
    - Apps Scriptサイトを`GitHubリポジトリ名で検索すれば対象のGASスクリプトをすぐに検索できます`。また、`ブランチ名で、本番用なのか開発用なのか判断ができます`。
    - ![スクリーンショット 2022-01-24 10.48.42 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112294/170329b8-956c-2deb-a17d-29e0cabb076e.png)

### Githubフローとは

GitHub Flowは、GitHub社が実践している開発フローです。
6つのルールだけのとてもシンプルな開発フローで、GASのような小規模開発に最適です。

**【ルール1】が最も重要で、それ以外のルールは【ルール1】を実現するために存在します。**

- 6つのルール
    - 【ルール1】 mainブランチは常にデプロイ可能である
    - 【ルール2】 開発用ブランチをmainから作成する（例：add-new-record）
    - 【ルール3】 開発用ブランチを定期的にプッシュする
    - 【ルール4】 プルリクエストを活用する
    - 【ルール5】 プルリクエストが承認されたらmainへマージする
    - 【ルール6】 mainへのマージが完了したら直ちにデプロイを行う

＊ 概要をサクッと知りたい方は、この記事がよくまとまっています。

https://atmarkit.itmedia.co.jp/ait/articles/1708/01/news015.html

＊ より詳しく知りたい方は、以下原書(日本語翻訳版)を参照してください。

https://gist.github.com/Gab-km/3705015

## 準備

### GitHubにリポジトリ作成

- 「そもそもGitHubって何？」ってなった方は、以下の記事がよくまとまっています。記事を参考に、GitHubに入門してみることをオススメします！
- GitHubを活用できるようになると、チームメンバーでソースコードを安全に共有できるようになるので、非常に便利です。

https://qiita.com/nnahito/items/565f8755e70c51532459

### Apps Scriptサイトをブックマーク

Apps Scriptサイトを活用することで、**「コンテナバインド型」のスクリプトが簡単に探せるようになります** 。
＊コンテナバインド型とは、スプレッドシートから作成できるGASスクリプトファイルのことです。

■ Apps Scriptサイトはこちら
https://script.google.com/home

### Google Apps Script GitHub アシスタントのインストール

■ chrome ウェブストア

https://chrome.google.com/webstore/detail/google-apps-script-github/lfjcgcmkmjjlieihflfhjopckgpelofo?hl=ja

■ Google Apps Script GitHub アシスタントの使い方
基本的な使い方は、以下、記事がよくまとまっているのでご参照ください。

https://qiita.com/kita3folio/items/7a5bd678864ae46ff616

## 開発手順

Githubに「order-form」というリポジトリを事前に作成したケースとして解説します。

![スクリーンショット 2022-01-24 9.43.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112294/8832c35b-ada2-fac2-5b49-d0b4e38075ef.png)

1. **本番用のスプレッドシート、GASスクリプトを自分のGoogleドライブにコピーし、開発用のものを用意する**
    - スプレッドシートGAS（コンテナバインド型スクリプト）の場合、スプレッドシートをコピーすると、GASも一緒にコピーされます。
    - 開発用のブランチ名は、`機能(フィーチャー)がわかるようにすると良いです`。例えば、新規レコードを追加できるようする機能の開発であれば`add-new-record`などです。
    - `命名規則：ファイル名_ブランチ名`
        - 例：商品マスタ_add-new-record
             - ファイル名：商品マスタ、ブランチ名：add-new-record
             - ![スクリーンショット 2022-01-24 9.40.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112294/e9e34d40-f5af-de3c-6dcc-e8f2d6884da5.png)
             - ![スクリーンショット 2022-01-24 9.41.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112294/caeae2dd-e842-522a-5fa7-f159a781b288.png)
2. **GitHubに開発用ブランチを作成する**
    - `開発用スプレッドシート > 拡張機能 > Apps Script`から、開発用GASを起動します。
    - Google Apps Script GitHub アシスタントを使って開発用ブランチを作成します。
    - `開発ブランチ名の例：add-new-record`
        - ![スクリーンショット 2022-01-24 9.41.35 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112294/c55d43e3-413a-a489-abc1-b4afeaafe999.png)
        - ![スクリーンショット 2022-01-24 9.49.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112294/5359ff34-149f-ccb4-9c34-02a90e04fefd.png)
        - ![スクリーンショット 2022-01-24 9.44.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112294/096dcc58-bb90-0e3e-f843-b3fbb3d8fbec.png)

3. **開発用GASのプロジェクト名を変更する**
    - `命名規則：リポジトリ名_ブランチ名`
        -  例：order-form_add-new-record
            - リポジトリ名：order-form、ブランチ名：add-new-record
            - ![スクリーンショット 2022-01-24 9.57.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112294/9e250773-706d-1bdf-10fb-c15f23131806.png)
4. **開発して、開発ブランチにコミット＆pushする**
    - GASスクリプト中のspreadsheetIDなどのプロパティ（設定値）は、開発用と本番用で切り替えられるように実装してください。
        - spreadsheetIDとは、`SpreadsheetApp.openById("abc1234567");`の`abc1234567`の部分です。
        - 設定値切り替えのコードはこちら => [本番と開発のプロパティ（設定値）の切り替え方法](https://qiita.com/ffggss/items/3aac232bdb0fb33c980a#%E6%9C%AC%E7%95%AA%E3%81%A8%E9%96%8B%E7%99%BA%E3%81%AE%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E8%A8%AD%E5%AE%9A%E5%80%A4%E3%81%AE%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E6%96%B9%E6%B3%95)
    - mainブランチにマージで修正があった場合、ローカル環境にgit cloneして、mainブランチの修正を自分の開発ブランチに取り込みます。
3. **開発ブランチからmainブランチへのプルリクを作成する**
    3. 修正内容
    3. 修正理由
    3. 開発用スプレッドシートURL
    3. 開発用GASスクリプトURL
4. **チームメンバーにレビュー依頼**
5. **mainブランチにマージ**
    - マージする前に`spreadsheetIDなど本番のプロパティ（設定値）が、間違って変更されていないかを必ず確認してください`。
6. **本番のスプレッドシートなどにmainブランチ修正を反映する**
    - Webアプリとして公開している場合は、新バージョンをデプロイします
7. **マージ済の開発ブランチに関連するスプレッドシート、GASスクリプトを削除する**
    - この時に手順1, 3で決めた命名規則が役に立ちます
    - ![スクリーンショット 2022-01-24 10.48.42 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112294/25291b7b-257b-5de9-d2e8-ce2f1fb676a6.png)

## デプロイ方法

GoogleAppsScriptの場合、デプロイ方法は、Google Apps Script GitHub アシスタントで、mainブランチをGASスクリプトエディタ上でpullする方法となります。

![スクリーンショット 2022-01-23 16.23.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112294/c1d18985-0931-4f4f-1bc5-23d3163eee9f.png)

## 本番と開発のプロパティ（設定値）の切り替え方法

■ 今回決めたGASスクリプト名の命名規則を活用して、本番、開発を判定します。

- 本番：「Gitリポジトリ名」
- 開発：「Gitリポジトリ名_ブランチ名」
 
＊`Gitリポジトリ名もブランチ名も、ケバブケースを前提としたコードになってます`

■ GASのProperties Serviceを使います。

Properties Serviceは、GASで共有する値をkey-value形式で保存する機能を提供してくれるクラス群です。

https://developers.google.com/apps-script/reference/properties

### 設定値を切り替えるコード

- `main.gs`で、`properties.gs`の`initProperties()`を実行して、プロパティを初期化します。
    - `main.gs`は、個別ロジック
    - `properties.gs`は、コピペで使える共通ロジック
- `PropertiesService.getUserProperties().getProperty('プロパティ名');` と呼び出すことで、設定値を取得することができます。
- セキュアな情報(トークンなど)は、環境ごとのJSONファイルをGoogle Driveに用意。取得するJSONファイルを命名規則によって変更するなどすれば実現できそうです。

```javascript:main.gs
/**
 * メイン
 */
function main(){
  initProperties();
  const spreadsheetId = PropertiesService.getUserProperties().getProperty('spreadsheetId');
  Logger.log(`spreadsheetId：${spreadsheetId}`);
}
```

```javascript:properties.gs
/**
 * 開発用プロパティ
 */
const developProperties = {
  'spreadsheetId': 'developId',
}
/**
 * 本番用プロパティ
 */
const productionProperties = {
  'spreadsheetId': 'productionId',
}

/**
 * プロパティを初期化します。
 */
function initProperties() {
  const id = ScriptApp.getScriptId();
  const name = DriveApp.getFileById(id).getName();
  const names = name.split('_');
  const properties = PropertiesService.getUserProperties();
  if (names.length === 1) {
    // 本番用
    properties.setProperties(productionProperties);
  } else {
    // 開発用
    properties.setProperties(developProperties);
  }
}
```

## 終わりに

- Google Apps ScriptとGitHubを使ったバージョン管理について解説した記事が少なかったので、弊社の手順を記事にしてみました。
- 複数人でGASを開発する場合、今回のような開発手順をチームで決めて、GitHubを活用することで、随分とチーム開発が楽になると思います。GASでチーム開発している方々の参考なれば嬉しいです(^^

## 宣伝

**■ Udemy**
【発売2ヶ月で受講生500人突破】GoogleアカウントとWebブラウザがあれば開発準備OK！これからプログラミングを始める方も取り組みやすいように「40のスキル」を選定。受講後、Googleアプリ連携による業務効率化ができるようになります。
`現在、約900人の受講生で、ベストセラーに選定されてます。`

https://www.udemy.com/course/wywy-google-apps-script-forty-skills/?referralCode=7F71969F9DD9849220B4

**■ YouTube**

Google Apps Scriptの動画中心のチャンネルです。

https://www.youtube.com/channel/UC255gz0OSB4hM01SmtlZQmQ