（無料枠利用）GAS で Render.com のスリープ対策

# 前置き
* Render.com の無料枠での利用におけるデプロイしたアプリのスリープ対策について調査していた → [以前書いた記事](https://qiita.com/nakad119/items/fb7befbdb7fa1355cdf1)
* [こちらの記事](https://zenn.dev/sdb_blog/articles/002-render-okosu)から監視ツールを利用する以外に GAS でも対策が可能であることを知った
* 検証した結果問題なく使用でき実用性もあると判断できたため記事にまとめた

# 本題
## 実装事項について
| | 今回の実装要件 |
|:-:|:--|
| (1) |15分間サーバーにアクセスしないと Web アプリが停止してしまうため、今回は10分毎にサーバーにアクセスさせる|
| (2) |GAS の利用制限事項に引っかからないようにスクリプトの処理は簡単し、実行済みのトリガーも消去する|

## ファイル構成
| ファイル構成名 | 処理内容 |
|:--|:--|
| main.gs |トリガーの生成および削除を担う|
| request_to_render.gs |Render.comへのリクエストを行う|

## 手順
1. https://developers.google.com/apps-script/guides/projects?hl=ja#create-and-delete の手順通りにプロジェクトを作成する
1. 以下に示すソースコードをコピペ
1. 関数 "setMinTrigger" をドロップダウンリストから選択して実行

以上で自動化完了

## 実装
```JavaScript:main.gs
/******************************************************************
 * 参考資料： https://data-x.jp/blog/gassetmintrigger/#index_id4 
 ******************************************************************/
 
// セットおよび削除するトリガー名
const TRIGGER_FUNC_NAME = 'requestRenderTrigger'

/*=================================================================
・トリガーを定期的に設定および削除するプロセス
=================================================================*/
// 既存の同名のトリガーを削除した後、
// 10mおきにトリガーをセットする処理
function setMinTrigger() {
  let triggers = ScriptApp.getScriptTriggers();
  for(let trigger of triggers){
    let funcName = trigger.getHandlerFunction();
    if(funcName == TRIGGER_FUNC_NAME){
      ScriptApp.deleteTrigger(trigger);
    }
  }
  // 年月日と現在時刻の取得
  let now = new Date();
  let y = now.getFullYear();
  let m = now.getMonth();
  let d = now.getDate();
  let hh = now.getHours();
  let mm = now.getMinutes();
  // 現在時刻から10分後に実行されるトリガーを生成
  let date = new Date(y, m, d, hh, mm + 10);
  ScriptApp.newTrigger(TRIGGER_FUNC_NAME).timeBased().at(date).create();
}

/*=================================================================
・「対象のURLにリクエストを送る」処理のトリガーのセットおよび既存の実行済みトリガー削除
=================================================================*/
function requestRenderTrigger() {
  request_to_render(); // request_to_render.gs > function request_to_render()
  setMinTrigger(); //上記内容が処理し終える度にトリガーをセットする
}
```

```JavaScript:request_to_render.gs
/******************************************************************
 * 参考資料： https://zenn.dev/sdb_blog/articles/002-render-okosu
 ******************************************************************/

// 【変更必須】ここにデプロイしたWebアプリのURLを指定する
const APP_URL = 'デプロイしたWebアプリのURL'; 

/*=================================================================
・Renderへのリクエスト
=================================================================*/
function request_to_render() {
  // レスポンスコードを取得するだけ
  const HTTP_STATUS = UrlFetchApp.fetch(APP_URL).getResponseCode();
  // console.log(HTTP_STATUS); // デバッグ用
}
```

## 補足
* 関数が 3 つだけなのでファイルを分ける必要はありませんが、手動で実行する際に指定する関数を誤ってしまうことが私個人多かったので関数指定ミス防止のためにファイルを分けています
* [こちらの記事](https://zenn.dev/sdb_blog/articles/002-render-okosu)で「GAS のエラーもたまに起こる」という点を言及されていますが、私の憶測になりますが GAS の利用制限事項に触れているからなのかもしれません → [以前書いた記事](https://qiita.com/nakad119/items/74b998fdabb379fe496c)
    * [現在の制限事項](https://developers.google.com/apps-script/guides/services/quotas?hl=ja#current_limitations) ＞ トリガー
* 目的がスクリプト利用だけだったためスプレッドシートは利用していませんが、シートへログのように何か記録するような処理を施しても良いかもしれません

---
### 所感など
* [こちらの資料](https://data-x.jp/blog/gassetmintrigger/)大変参考になりました。トリガーを削除するメソッドがあることを知れました。ありがとうございました
* いずれこういった小細工も対策されてしまうかもしれませんね
* 今回は「Render.com の無料枠のスリープ対策」が目的となっていましたが、GAS を上手く利用すればオリジナルの監視アプリが出来るかもしれないと可能性を感じることができました

---
### 参考資料
https://zenn.dev/sdb_blog/articles/002-render-okosu

https://data-x.jp/blog/gassetmintrigger/