【GAS】カタログや写真集っぽいものをスプレッドシート＋GAS＋HTMLの連携で作ってみる

#いきなり完成図
　こうゆうのは先に完成版を提示したほうがいいかなと。しょぼいんですがこんな感じでセレクトボックスから選択するとそれに応じて画像、所在地、説明文が変わるというやつです。そして、その元データはスプレッドシートに入力し、GASがそれを拾ってHTMLに表示するという流れです。

![スクリーンショット 2017-05-08 2.34.02.png](https://qiita-image-store.s3.amazonaws.com/0/139134/e0260a5a-f748-3cf7-d72d-cbc6a3b01235.png)


　選択肢を変えると切り替わります。

![スクリーンショット 2017-05-08 2.24.41.png](https://qiita-image-store.s3.amazonaws.com/0/139134/c139d012-97c7-5c4e-3436-554f84b2b297.png)

　


#画像をどこに置くか？

　これがけっこう悩ましくて、まずドライブに画像を置いても.jpgなどの拡張子で参照することができず、断念しました。次に、グーグルフォトに置いてそれを参照する形を検討しました。しかしこれもまた.jpgなどの拡張子で参照することができず、あきらめました（URLFetchなど、いろいろ試したんですが）。グーグルフォトのWeb画面から検証→sourceから画像の実データを拾うというのもありですがたった75KBのサイズでたしか10万文字レベルだったのでやめました。

　最終的にはXdomainの無料レンタルサーバーを使ってひとまずそこに画像を置くことにしました。1GBまで無料のようです。

　いろいろ省略していますが、一通り登録が終わったらまずHTMLサーバーから管理パネルに入って、

![スクリーンショット 2017-05-08 1.32.47.png](https://qiita-image-store.s3.amazonaws.com/0/139134/78f74841-a316-8fef-0693-dabd88e82471.png)

　次にFTPアカウント設定に入って、
![スクリーンショット 2017-05-08 1.40.51.png](https://qiita-image-store.s3.amazonaws.com/0/139134/35f64fd2-33fa-beff-e35a-5f697be16d00.png)

　その中の、WebFTPのところのログインを押すとやっと入れます。ログインのところがボタンになっていないのでパッと見分かり辛かったです。

![スクリーンショット 2017-05-08 1.34.28.png](https://qiita-image-store.s3.amazonaws.com/0/139134/98ee77fc-8520-6305-ea51-2d9df5ac323b.png)

　imgフォルダを作ってそこに放り込んでおきました。

![スクリーンショット 2017-05-08 1.35.04.png](https://qiita-image-store.s3.amazonaws.com/0/139134/9e29844b-f82a-f530-bfdb-de04fa781d1e.png)

　imgフォルダの中身はこんな感じ。サンプルとして３つ入れました。
![スクリーンショット 2017-05-08 1.35.29.png](https://qiita-image-store.s3.amazonaws.com/0/139134/43efea1e-49b2-49aa-121c-99e19f4b1b4d.png)

#スプレッドシートの準備

　ここは単純です。画像のようにセレクトボックスに入るタイトル、そして画像アドレス、所在地、説明文です。また、E列には画像をチラ見できるよう、=IMAGE(URL)で持ってきています。このあたりがSQLiteなどのDBと違って手軽かつ便利なところじゃないかと思います。IMAGE関数は便利なのですが画像アドレスの拡張子が.jpgや.pngなどに限定されているのが残念。

　画像アドレスは黒く塗りつぶしちゃいましたがここには当たり前ですがhttp://から始まるフルパスが入っています。

![スクリーンショット 2017-05-08 2.45.15.png](https://qiita-image-store.s3.amazonaws.com/0/139134/ee8dc6e7-ccff-1391-9302-32b396a21bb4.png)

#GAS

　プログラミングに入っていきます。独立したスクリプトエディタを使いました。ちなみにレスポンシブのおまじないも混ぜたのですがスマホでは大きく表示されすぎて失敗しました。

`````コード.gs

function doGet(request) {  
  var html = HtmlService.createTemplateFromFile('Index').evaluate();
  return html.setTitle('Index').addMetaTag('viewport', 'width=device-width, initial-scale=1.0');
}

function getList() {
  var ss = SpreadsheetApp.openById("スプレッドシートキー");
  var sh = ss.getSheetByName("シート名");
  var list = sh.getRange(2,1,sh.getLastRow()-1,4).getValues();
  return list;
}

``````

　まず、ロード時にGAS側のgetList関数が動き、スプレッドシート上のデータをHTML側が取得し、div id="list"・・・の部分に表示します。

　つぎに、そのデータをセレクトボックスに入れます。option value=・・・のところには、パイプ記号で区切って画像アドレス、所在地、説明文をまとめてひとつの文字列として格納します。

　さらに、セレクトボックスで選択肢が変更になったらonChange(this)でchangeItem関数を発動させます。その中でさきほどパイプ記号で区切ってまとめて文字列としていたものを配列化して生成DOM内に入れ、div id="result"の部分に表示します。

`````Index.html
<!DOCTYPE html>
<html>
<head>
<base target="_top">

<script>

function onSuccess(list) {
　var html = '<select onChange="changeImage(this)">';
  for (var i=0; i<list.length; i++) {
    html += '<option value=' + list[i][1] + "|" + list[i][2] + "|" + list[i][3] + '>' + list[i][0] + '</option>';
  }
  html += '</select>';
  var div = document.getElementById('list');
  div.innerHTML = html;
}

function changeImage(item) {
  var ary = item.value.split("|");
  var html = "<img src="+ary[0]+">";
  html += "<p>" + ary[1] + "</p>";
  html += "<p>" + ary[2] + "</p>";
  document.getElementById("result").innerHTML = html;
}

// 初期画面
google.script.run.withSuccessHandler(onSuccess).getList();

</script>

</head>
<body>

<div id="list">
Loading...
</div>

<div id="result">
</div>

</body>
</html>

`````

　最後に公開→ウェブアプリケーションとして導入で設定し、URLを取得するだけです。言わずもがなですがファイルを変更したらそのつどこの作業を行い、バージョンは常に「新規作成」としておく必要があります。

![スクリーンショット 2017-05-08 2.57.28.png](https://qiita-image-store.s3.amazonaws.com/0/139134/7b398af6-053b-669b-12aa-4b6919367cf7.png)



#スプレッドシート＋GAS＋HTMLの利点

　特にないかもしれません。ただ、元データをいじりたいという人がプログラミング知識なしにわりと簡単にいじれるという点でよいのではないかと思っています。

　あと画像アップローダーも作ろうと思ったんですがレンサバのファイルマネージャーに直接入ってアップロードすりゃいいやって気持ちになってしまってやめました。