ブログ
スプレッドシートをtableに表示したい
こんにちは。tsubouchiです。
今回は、はじめてVue.jsに触れたことを。
スプレッドシートをJSON出力してVue.jsで表示します。
経緯
弊社では、ページ数が多いサイトを構築する時にスプレッドシートでページ一覧を管理することがあります。
また、ページ一覧をhtmlにも表示してお客さまとのやりとりに使っています。
実はこれまで、html版も手作業でtableタグを組んでいました。
これをスプレッドシートと一緒に一括管理にしたい。
「せっかくだからVue.jsにしなよ」の鶴の一声でVue.jsでつくりました。
流れとしては
1.スプレッドシートをJSON形式で出力する
2.Vue.jsでhtmlに表示する
です。
1.スプレッドシートをJSON形式で出力する
実は、ここまでは鶴・・・okoshiさんが紹介してくださいました。
こちらの記事を参考に、スプレッドシートとGoogle App Scriptを作成します。
2.Vue.jsでhtmlに表示する
(1)スクリプト読み込み
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
axiosはVue.jsでjsonを読み込む時に使います。
(2)json読み込み
公式を参照します。
new Vue({
el: '#app',
data () {
return {
info: null
}
},
mounted () {
axios
.get('https://script.google.com/macros/s/AKfycbxBzb-mvxcuUgH19ILr76vZUm577Ka-ouTwSvkWq_f3D5ta2Mk/exec')
.then(response => {
this.info = response.data
})
}
})
<div id="app">{{info}}</div>
スプレッドシートが↓だったとして、
出力結果はこちら。
あとはこれをループにして取り出します。
if文きったりしたものがこちら。
<!DOCTYPE HTML>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<meta name="viewport" content="width=device-width">
<title>サンプル</title>
<style>
table {
width: 100%;
max-width: 100%;
border-collapse: collapse;
border-bottom: 1px solid #ccc;
border-left: 1px solid #ccc;
border-right: 1px solid #ccc;
}
table th,
table td {
border-top: 1px solid #ccc;
border-right: 1px solid #ccc;
}
table td.id {
width: 4rem;
}
table td.title {
width: 20rem;
}
table td.title.lvl2 {
padding-left: 2rem;
}
table td.title.lvl3 {
padding-left: 4rem;
}
table td.design,
table td.test {
width: 8rem;
}
</style>
</head>
<body>
<div id="app">
<table>
<thead>
<tr>
<th>ID</th>
<th>タイトル</th>
<th>デザイン</th>
<th>テストアップ</th>
<th>備考</th>
</tr>
</thead>
<tbody>
<template v-for="item in info">
<tr>
<td class="id">{{item.id}}</td>
<td class="title lvl1" v-if="item.title_lv1">{{item.title_lv1}}</td>
<td class="title lvl2" v-if="item.title_lv2">{{item.title_lv2}}</td>
<td class="title lvl3" v-if="item.title_lv3">{{item.title_lv3}}</td>
<td class="design">
<a :href="item.design_url" target="_blank" v-if="item.design_date">{{item.design_date | moment }}</a>
</td>
<td class="test">
<a :href="item.test_url" target="_blank" v-if="item.test_date">{{item.test_date | moment }}</a>
</td>
<td class="note">{{item.assigned_c}}</td>
</tr>
</template>
</tbody>
</table>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.1/moment-with-locales.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.21/moment-timezone.min.js"></script>
<script type="text/javascript">
new Vue({
el: '#app',
data () {
return {
info: null
}
},
mounted () {
axios
.get('https://script.google.com/macros/s/AKfycbxY7rSv8Mw3qRoZQRdaZ_3GPyc1JKClkz1rIcZt9Y6rjQGyRrY/exec')
.then(response => {
response.data.shift();//スプレッドシートの1行目は日本語の列名だから除く
this.info = response.data
})
},
filters: {//日付をフォーマットする
moment: function (date) {
return moment(date).format('M/D');
}
}
})
</script>
</body>
</html>