GAS（Google Apps Script）の無料枠でサーバーの死活監視を行う

# GAS（Google Apps Script）の無料枠で死活監視を行う

Google Apps Script（GAS）を利用する際、気になるのは無料でどこまで使えるのかという点だろう。この記事では、GASの無料枠の制限を整理し、実際にバックエンドサーバーの死活監視APIを叩いてスリープさせないようにするケースを紹介しながら解説する。

## GASの主な無料枠の制限

GASの無料枠には次のような制限がある。

| 項目               | 上限                  |
| ---------------- | ------------------- |
| 1回あたりの最大実行時間     | **6分（360秒）**        |
| 1日あたりの合計実行時間     | **90分（5400秒）**      |
| トリガーの数           | 1スクリプトあたり最大 **20個** |
| URL Fetchの呼び出し回数 | 1日あたり **20,000回**   |
| メールの送信可能数        | 1日あたり **100通**      |

詳細は公式ドキュメントを参照：[Quotas for Google Services（公式）](https://developers.google.com/apps-script/guides/services/quotas)

## 死活監視APIを叩いて無料枠サーバーがスリープしない仕組み

今回の例では、無料で運用しているバックエンドサーバーがスリープしないよう、5分間隔で死活監視APIを叩く仕組みをGASで実装した。

### 実装手順

以下の手順でGASを設定する。

1. 新規にスプレッドシートを作成する。
2. 「死活監視用URL一覧」という名前のシートを作成する。
3. シートのA列に、死活監視したいURLを記入する。
4. スプレッドシートの「拡張機能」メニューから「Apps Script」をクリックし、GASエディタを開く。
5. 後述のGAS実装を貼り付けて保存する。
6. 後述の手順でトリガーを設定する。


### GASによる実装例

```javascript
function main() {
  const urls = getUrlsFromSheet('死活監視用URL一覧');
  Logger.log('===== URLのHTTPステータス一覧 =====');
  urls.forEach((url, index) => {
    const statusCode = fetchHttpStatusCodeWithRetry(url, 3, 30000);
    Logger.log(`${index + 1}. URL: ${url}\n   HTTPステータス: ${statusCode}`);
  });
  Logger.log('================================');
}

// 指定シートのA列にあるURLを取得する
function getUrlsFromSheet(sheetName) {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
  const lastRow = sheet.getLastRow();

  if (lastRow < 1) return [];

  const urlRange = sheet.getRange(`A1:A${lastRow}`);
  const urls = urlRange.getValues()
    .flat()
    .filter(url => url); // 空セルを除外

  return urls;
}

// URLにアクセスしHTTPステータスコードを返す（リトライ機能付き）
function fetchHttpStatusCodeWithRetry(url, retryCount, intervalMs) {
  let statusCode = fetchHttpStatusCode(url);
  let attempts = 1;

  while (statusCode !== 200 && attempts <= retryCount) {
    Logger.log(`Retrying ${url} (${attempts}/${retryCount}) in ${intervalMs / 1000}s...`);
    Utilities.sleep(intervalMs);
    statusCode = fetchHttpStatusCode(url);
    attempts++;
  }

  return statusCode;
}

// URLにアクセスしHTTPステータスコードを返す
function fetchHttpStatusCode(url) {
  const options = { muteHttpExceptions: true };
  try {
    const response = UrlFetchApp.fetch(url, options);
    return response.getResponseCode();
  } catch (e) {
    Logger.log(`Error accessing ${url}: ${e}`);
    return 'Error';
  }
}
```

### トリガーの設定方法

1. GASエディタの左側メニューから「トリガー」を選択。
2. 右下の「トリガーを追加」ボタンをクリック。
3. 実行する関数として`main`を指定。
4. 実行する頻度を「時間ベースのタイマー」に設定。
5. 「分ベースのタイマー」を選択し、任意の時間間隔（例：5分）を設定して保存。

## 無料枠についての検証

実行時間の上限とURL Fetchの上限のどちらが先に達するかはURL数やレスポンス速度に依存するため、実際に自分の環境で確認するとよい。

### 実行時間

- **スクリプト実行の頻度**：5分間隔
- **1日に実行される回数**：24時間 × (60分 ÷ 5分) = **288回／日**
- **1回あたりの実行時間（最長）**：**約6.5秒**
  - ※この6.5秒は確認できるログの中で最も長かった実行時間であり、平均値ではない。

1日の合計実行時間の計算は以下の通り。

- 約6.5秒 × 288回 ≈ **1883秒（約31分）**

結果として、実行時間は無料枠の範囲内であることが分かる。

### URL Fetchの呼び出し回数についての検証

| URL数 | 1回の呼び出し数 | 1日あたりの実行回数（5分間隔） | 1日の合計呼び出し数 | 制限内か？       |
| ---- | -------- | ---------------- | ---------- | ----------- |
| 1    | 1        | 288              | 288        | ✅ はい        |
| 5    | 5        | 288              | 1,440      | ✅ はい        |
| 10   | 10       | 288              | 2,880      | ✅ はい        |
| 50   | 50       | 288              | 14,400     | ✅ はい        |
| 69   | 69       | 288              | 19,872     | ✅ はい        |
| 70   | 70       | 288              | 20,160     | ❌ いいえ（上限超過） |

## 結論

今回のような5分ごとの死活監視は、GASの無料枠内で安心して運用可能であることが確認できた。