🚀 GitとGASでスプレッドシートを完全自動管理！定期更新・バックアップの手順ガイド 📈

# GitとGASでスプレッドシートを完全自動で定期管理する手順ガイド 🚀

こんにちは、エンジニアうしです！  
本記事では、Google Apps Script（GAS）とGit（ここではGitHubを例にします）を組み合わせ、スプレッドシートのデータを自動で定期的に管理・更新する方法を1から丁寧に解説していきます。これにより、たとえば定期的なデータのバックアップや履歴管理、そしてチームでの共有がスムーズに行えます。

---

## 目次

1. [はじめに：全体の流れ](#はじめに-全体の流れ)
2. [必要な準備](#必要な準備)
   - [GitHubアカウントとリポジトリの作成](#githubアカウントとリポジトリの作成)
   - [パーソナルアクセストークンの取得](#パーソナルアクセストークンの取得)
3. [Google Apps Scriptプロジェクトの作成と設定](#google-apps-scriptプロジェクトの作成と設定)
4. [スプレッドシートデータの取得と変換](#スプレッドシートデータの取得と変換)
5. [GitHub APIを使って自動コミット](#github-apiを使って自動コミット)
6. [定期実行トリガーの設定](#定期実行トリガーの設定)
7. [全体フロー図](#全体フロー図)
8. [まとめ](#まとめ)

---

## はじめに：全体の流れ

GitとGASを連携することで、以下のようなプロセスが自動化されます。

1. **スプレッドシート**：定期的に最新のデータを取得
2. **GAS**：データをCSVなどのテキスト形式に変換し、ベース64エンコード
3. **GitHub API**：GASからPUTリクエストを用いて、Gitリポジトリ内のファイルを更新（※すでに存在する場合は更新、なければ新規作成）
4. **定期トリガー**：GASの時間ベーストリガーにより、上記プロセスを自動実行

この自動化により、誰がいつどのような変更を加えたかの履歴もGit上で管理でき、チームでの共有やバックアップも容易になります。

---

## 必要な準備

### GitHubアカウントとリポジトリの作成

1. [GitHub](https://github.com/)にサインアップし、アカウントを取得してください。
2. 「New repository」から、新規リポジトリ（例：`spreadsheet-backup`）を作成します。  
   ※公開・非公開はプロジェクトに応じて選んでください。

### パーソナルアクセストークンの取得

GitHub APIで認証するため、パーソナルアクセストークン（PAT）が必要です。

1. GitHub上で「Settings」→「Developer settings」→「Personal access tokens」に移動。
2. 「Generate new token」をクリックし、以下のスコープにチェックを入れて生成してください：
   - `repo`（リポジトリの読み書き権限）
3. 発行されたトークンは後でGASのコードに設定しますので、控えておきましょう。

---

## Google Apps Scriptプロジェクトの作成と設定

1. Google Driveまたは[Google Apps Script](https://script.google.com/)にアクセスし、新しいプロジェクトを作成します。
2. プロジェクト名を「Spreadsheet Git Backup」など、分かりやすい名称に変更します。

---

## スプレッドシートデータの取得と変換

この例では、スプレッドシートの「データ」というシートの内容をCSV形式に変換します。

- **手順**  
  1. スプレッドシートの対象シートを取得  
  2. シート内の全データを2次元配列として取得  
  3. 行ごとにカンマ区切りに変換し、全体を改行で連結  
  4. 生成されたテキストをBase64エンコード

以下はサンプルコードの一部です。

```javascript
/**
 * スプレッドシートからデータを取得し、CSV形式のBase64文字列に変換する関数
 */
function getCSVData() {
  // シート名を指定（例："データ"）
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("データ");
  var data = sheet.getDataRange().getValues();
  
  // CSV形式に変換（各行をカンマで連結し、行ごとに改行）
  var csv = data.map(function(row) {
    // セル内のカンマをエスケープ（必要に応じて）
    return row.map(function(cell) {
      return '"' + String(cell).replace(/"/g, '""') + '"';
    }).join(",");
  }).join("\n");
  
  // Base64エンコード
  var encodedCSV = Utilities.base64Encode(csv);
  return encodedCSV;
}
```

---

## GitHub APIを使って自動コミット

Google Apps Scriptの`UrlFetchApp`を利用して、GitHub API経由でリポジトリ内のファイルを更新します。  
GitHub APIでは、既存ファイルの更新の場合、現在のファイルのSHAが必要となるため、まずGETリクエストでファイルの情報を取得し、そのSHAを利用してPUTリクエストを発行します。

以下は、スプレッドシートのCSVデータをGitHubにコミットするためのサンプルコードです。

```javascript
/**
 * スプレッドシートの内容をGitHubリポジトリにコミットする関数
 */
function updateSpreadsheetToGitHub() {
  // ① CSVデータを取得
  var encodedContent = getCSVData();

  // ② GitHubリポジトリの情報を設定
  var owner = "yourusername";  // GitHubのユーザー名に置き換える
  var repo  = "spreadsheet-backup";  // 作成したリポジトリ名に置き換える
  var path  = "data.csv";  // リポジトリ内のファイルパス
  var url   = "https://api.github.com/repos/" + owner + "/" + repo + "/contents/" + encodeURIComponent(path);
  var token = "YOUR_GITHUB_PAT"; // 取得したパーソナルアクセストークンに置き換える

  // ③ ヘッダーの設定
  var headers = {
    "Authorization": "token " + token,
    "Accept": "application/vnd.github.v3+json"
  };

  // ④ 既存ファイルのSHAを取得（既にファイルがある場合）
  var sha = "";
  var options = {
    "method": "get",
    "headers": headers,
    "muteHttpExceptions": true
  };
  var response = UrlFetchApp.fetch(url, options);
  
  if (response.getResponseCode() === 200) {
    var respObj = JSON.parse(response.getContentText());
    sha = respObj.sha;
    Logger.log("既存のファイルSHAを取得: " + sha);
  } else {
    Logger.log("ファイルが存在しないか、初回コミットです。");
  }

  // ⑤ コミット用のペイロード作成
  var payload = {
    "message": "Update spreadsheet data " + new Date().toISOString(),
    "committer": {
      "name": "Your Name",  // 自分の名前に置き換え
      "email": "your.email@example.com"  // 自分のメールアドレスに置き換え
    },
    "content": encodedContent
  };
  // 既存ファイル更新の場合、SHAが必要
  if (sha) {
    payload.sha = sha;
  }

  // ⑥ PUTリクエストのオプション設定
  options = {
    "method": "put",
    "headers": Object.assign(headers, {"Content-Type": "application/json"}),
    "payload": JSON.stringify(payload),
    "muteHttpExceptions": true
  };

  // ⑦ APIリクエスト送信
  var putResponse = UrlFetchApp.fetch(url, options);
  Logger.log("更新結果: " + putResponse.getContentText());
}
```

**注意点：**  
- 上記コード内の`yourusername`、`spreadsheet-backup`、`YOUR_GITHUB_PAT`、およびコミッター情報は各自の環境に合わせて変更してください。  
- GitHub APIのレスポンスコード（200の場合は既存ファイルあり、404の場合は新規作成など）をチェックし、エラーハンドリングを適宜行いましょう。

---

## 定期実行トリガーの設定

GASでは、時間ベースの実行トリガーを設定することで、自動でスクリプトを定期実行できます。

1. GASエディタ上部の「時計アイコン（トリガー）」をクリックするか、  
   メニューから「編集」→「現在のプロジェクトのトリガー」を選択します。
2. 「トリガーを追加」ボタンをクリック。
3. 以下の設定例のように設定します：
   - **実行する関数：** `updateSpreadsheetToGitHub`
   - **イベントのソース：** 時間主導型
   - **タイプ：** 日次、あるいは任意の間隔（例：1時間ごと）
4. 保存して終了。

これで、設定した時間間隔で自動的にスプレッドシートの内容がGitHubにコミットされるようになります。⏰

---

## 全体フロー図

以下の図は全体のプロセスの流れを示しています。

```
┌──────────────────────────────┐
│    Google スプレッドシート     │
│  （データの入力・編集）         │
└─────────────┬──────────────┘
              │
              │ 「GASで定期的に実行」
              ▼
┌──────────────────────────────┐
│     Google Apps Script       │
│  ・データ取得・CSV変換         │
│  ・Base64エンコード            │
│  ・GitHub APIでPUTリクエスト    │
└─────────────┬──────────────┘
              │
              ▼
┌──────────────────────────────┐
│      GitHubリポジトリ         │
│  ・data.csv更新               │
│  ・コミット履歴管理           │
└──────────────────────────────┘
```

---

## まとめ

本記事では、GitHubとGoogle Apps Scriptを組み合わせ、スプレッドシートの内容を自動で定期的にGitリポジトリにコミットする手順を解説しました。  
主な流れは以下の通りです：

1. **準備**  
   GitHub上のリポジトリ作成とパーソナルアクセストークンの取得

2. **GASプロジェクトの作成**  
   スプレッドシートのデータを取得・CSV形式に変換し、Base64エンコード

3. **GitHub APIを利用したコミット処理**  
   PUTリクエストを用いて既存ファイルの更新または新規作成を実施

4. **時間トリガーで自動実行**  
   GASの定期実行トリガーを設定して、決まった時間にスクリプトを実行

これにより、スプレッドシートの変更履歴がGit上に自動で記録され、バックアップやチーム共有がスムーズに行えます。ぜひこの手順を参考に、あなたのプロジェクトでも自動管理を実践してみてください！

Happy Coding! 😄


---
## **💖 ご支援いただけませんか？**

![スクリーンショット 2025-01-31 7.51.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637864/f9d94b4d-dbd3-ab70-6b2b-dfc289cda562.png)


このブログでは、高品質な情報提供と学習活動を通じて、読者の皆さまのお役に立つことを目指しています。もしこの記事が役立ったと感じていただけましたら、ご支援いただけると幸いです！

---

### **暗号資産による寄付**
以下のウォレットアドレスをご利用ください。**重要：Ethereum (ETH)、BNB Chain (BNB)、Polygon (MATIC)、Avalanche (AVAX) は、全て以下の同一アドレスを使用しますが、送金ネットワークの選択を間違えると資金が失われます！** 送金時には、**絶対に**使用するネットワーク（例: ERC-20、BEP-20、Polygon、Avalanche C-Chain）を**必ず**正しく選択してください。

---

<img src="https://cryptologos.cc/logos/ethereum-eth-logo.png" alt="Ethereum Logo" width="20">

**Ethereum (ETH)**  （ネットワーク: ERC-20）

```
0x5CDA2F68f59F641B00aD172475c3d5fC10321174
```
<img src="https://cryptologos.cc/logos/binance-coin-bnb-logo.png" alt="BNB Logo" width="20">

**BNB Chain (BNB)**  （ネットワーク: BEP-20）
```
0x5CDA2F68f59F641B00aD172475c3d5fC10321174
```
<img src="https://cryptologos.cc/logos/polygon-matic-logo.png" alt="Polygon Logo" width="20">

**Polygon (MATIC)**   （ネットワーク: Polygon）

```
0x5CDA2F68f59F641B00aD172475c3d5fC10321174  
```
<img src="https://cryptologos.cc/logos/avalanche-avax-logo.png" alt="Avalanche Logo" width="20">

**Avalanche (AVAX)**    （ネットワーク: Avalanche C-Chain）

```
0x5CDA2F68f59F641B00aD172475c3d5fC10321174
```
<img src="https://cryptologos.cc/logos/solana-sol-logo.png" alt="Solana Logo" width="20">

**Solana (SOL)**  
```
EnPFbqDbF67rU9mAPvfgh4YYtncJNbFQ9NLQ5R6z5S2f
```

<img src="https://cryptologos.cc/logos/stellar-xlm-logo.png" alt="Stellar Logo" width="20">

**Stellar (XLM)**    メモ: 必要に応じて入力してください。

```
GCSMWCACKVEZ737GZAV4AJRFL52ZZKVQ7M3B3KYY64JJGOAO2GDYKABO 
```

<img src="https://cryptologos.cc/logos/xrp-xrp-logo.png" alt="Ripple Logo" width="20"> 

**Ripple (XRP)**    タグ: 必要に応じて入力してください。

```
r1s4EASr3zQRrfpDA3ptTahezBhGo2hhN
```

<img src="https://cryptologos.cc/logos/cardano-ada-logo.png" alt="Cardano Logo" width="20">

**Cardano (ADA)**  

```
addr1q8heq6ddw8rwlqa5hqlucnfk36arah9tzc8ajxvu83870h7lrre25wzq9yemex857we56cm0xu8tmxqvm8nykmtgsjdqavdpv7
```

<img src="https://cryptologos.cc/logos/dogecoin-doge-logo.png" alt="Dogecoin Logo" width="20">

**Dogecoin (DOGE)**  
```
DRFZ9JhAk3DTtu1tV85cawekWNrm1vKm3H
```

---

### **資金用途**
寄付金は以下の目的で活用させていただきます：

1. サーバー維持費やデザインツール購入  
2. 学習活動（オンラインコース受講・書籍購入）  
3. 読者向け無料コンテンツ制作  

ご協力いただいた皆さまには心より感謝申し上げます！ 🙏

---

### **補足情報**
- **Ethereum (ETH)、BNB Chain (BNB)、Polygon (MATIC)、Avalanche (AVAX)について**  
  上記4つのネットワークは**同じウォレットアドレス**（`0x5CDA2F68f59F641B00aD172475c3d5fC10321174`）を使用します。ただし、送金時には、**絶対に**使用するネットワーク（例: ERC-20、BEP-20、Polygon、Avalanche C-Chain）を**必ず**正しく選択してください。

- USDCやUSDTなどのステーブルコインも、対応するネットワーク経由であれば送金可能です。ただし、**送金先のネットワークと選択するネットワークが一致していることを必ず確認してください。**

- 初回送金時には少額でテスト送金することをおすすめします。

---