GASで超簡単にウェブサイトを作ってみる

# はじめに
この記事は「[Ateam LifeDesign Advent Calendar 2023](https://qiita.com/advent-calendar/2023/ateam-life-design)」で完走賞を狙って25記事書いているうちの19日目の記事です。今年も完走目指して頑張るぞ！

# 作るもの

今日はGASを使って簡単なウェブサイトを作ってみようと思います。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/fac68e02-24cf-20e9-5011-af950ab4d189.png" width="300">

こんなスプレッドシートがあったときに、これをサイトにテーブル形式で出力するサンプルを作っていきます。

# 流れ

GASで作ったサイトが表示されるまでの流れは以下のようになっています。

## リクエストの受信

ユーザーがウェブブラウザで特定のURLを開くと、Google サーバーにリクエストが送信されます。

## doGet() 関数の実行
`doGet()`関数は、GASの中で特別な役割を果たす関数です。サーバーへGETのリクエストがあると、`doGet()`関数が実行されます。この関数内で、必要なデータを取得したり、処理を行います。例えば、スプレッドシートからデータを取得したり、データベースとのやり取りを行ったりします。


## htmlの生成
取得したデータや処理結果を元に、htmlを生成します。doGet() 関数が最後にhtmlをreturnすると、それがブラウザへのレスポンスとして送信されサイトが表示されます。

# サンプルコード

## スクリプト

それでは実際に処理を見ていきましょう。

```javascript
function doGet() {
  // ここに処理を書く
}
```

これが上述の`doGet`関数です。この関数の中にサイトが表示されたときに行いたい処理を書いていきます。

```javascript
  const ss = SpreadsheetApp.getActive();
  const sheet = ss.getSheetByName('Sheet1'); // シート名を入力
  const items = sheet.getDataRange().getValues(); // シートのデータを取得
```

ここは今まで同様、スプレッドシートを指定して、データを取得しています。`getDataRange`はシートにある全てのデータ範囲を`range`として返してくれる便利な関数なので覚えておくと良いでしょう。

```javascript
  var template = HtmlService.createTemplateFromFile("index");
  template.items = items;
  return template.evaluate();
```

`HtmlService.createTemplateFromFile("index")`を使ってhtmlファイル（ここでは "index.html"）をテンプレートとして読み込みます。このhtmlファイルは次のステップで作成していきます。このテンプレート元にhtmlコンテンツを動的に生成します。
`template.items = items;`とすることでGAS内の変数である`items`をhtml側でも`items`という名前で呼び出せるようにします。`template.evaluate()`を使うことで、`template`のオブジェクトを評価して、`HtmlOutput`オブジェクトを返します。

ここまでの処理をまとめるとこんな感じ。
```javascript
// スプレッドシートからデータを取得して HTML ページにテーブル形式で表示する
function doGet() {
  const ss = SpreadsheetApp.getActive();
  const sheet = ss.getSheetByName('Sheet1'); // シート名を入力
  const items = sheet.getDataRange().getValues(); // シートのデータを取得

  var template = HtmlService.createTemplateFromFile("index");
  template.items = items; 
  return template.evaluate();

}

```

## html

ここでは新たにhtmlファイルを作成します。今回は`index`というファイル名でhtmlを用意してください。

![スクリーンショット 2023-12-16 22.59.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/ed79fa15-49c3-a53f-b50a-af2f2750c064.png)

エディタの上部にある「＋」アイコンをクリックするとHTMLというのがでてくるのでここをクリックします。そしてファイル名を聞かれるのでindexと入力します。

```html
<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
    <h1>簡単なサイトを作るよ。</h1>

    <table border="1">
      <tr><th>日付</th><th>顔</th><th>食べ物</th></tr>
      <? for(let i = 1; i < items.length; i++){ ?>
      <? let item = items[i]; ?>
      <tr><td><?= item[0] ?></td><td><?= item[1] ?></td><td><?= item[2] ?></td></tr>
      <? } ?>
    </table>

  </body>
</html>
```

htmlの内容はシンプルで先程取得した`items`をループで回しながら`table`を作っています。
 `<?　・・・　?>`というのと`<?=　・・・　?>`というのがありますが、どちらもテンプレートを動的に操作するためのjavascriptを書くことができます。 `<?　・・・　?>`は単なる処理（ループや代入など）で、`<?=　・・・　?>`は実行結果がその部分にhtmlとして吐き出されます。つまり今回の`<td><?= item[2] ?></td>`の例でいうと実際に実行された結果`<td>りんご</td>`という結果が吐き出されることになります。


# デプロイ

ここまでコードがかけたら作ったものをデプロイしていきます。

![スクリーンショット 2023-12-16 22.52.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/10d42b0c-b3ce-2914-94be-6709e14135ee.png)

画面右上の「デプロイ」から「新しいデプロイ」をクリックします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/83a34e93-58af-21f0-934e-32c0bb0c1aa1.png" width="400">

デプロイの種類は「ウェブアプリ」を選択します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/ebed710d-77e6-fb07-0835-1d5f8a6cca23.png" width="400">

デプロイ内容を設定します。アクセス権については要件に応じて適切に設定してください。今回は「自分のみ」がサイトをみれるようにするのでこの状態で「デプロイ」をクリックします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/bf2dab26-204a-153f-cc88-c4c99c4c0927.png" width="400">

この画面になったらデプロイ完了です。URLをコピーしてアクセスすると先程作ったサイトが見れるようになります。

# アクセスした結果
![スクリーンショット 2023-12-16 22.56.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/dc29080c-e55b-7ab5-8547-e8d99e1857c1.png)

きちんとスプレッドシートに書いていたデータがサイト上に表示されていることが確認できました！

# 最後に
今日はGASで簡単にウェブサイトを作ってみました。サーバー側の設定を何もせずこんなに簡単にサイトが作れるなんて衝撃的じゃないですか・・・！？またGASはGoogleの他のサービスとも簡単に統合できるのでGmailやGoogleカレンダーなどとサイトを連携させるのも非常に容易に行うことができます。便利！