Google スプレッドシートを DB 化できる「Stein」と Nuxt.js を連携する

Stein is a suite of programs to help you turn any Google Sheet to a database. The core Stein API provides RESTful access to your sheets. 
(Stein は、Google スプレッドシードを DB として扱うための一連のプログラムです。コア機能の Stein API を使用することで、スプレッドシートへの RESTful なアクセスが可能となります。)

公式ドキュメントの冒頭を引用し、いちおう訳を付けました。今回は、この Stein を Nuxt.js 上で使ってみようと思います。なお、Nuxt.js の導入手順は省略します。

API を作成する

画像1

スプレッドシート上に 2 つのシートを用意しました。左を Foods シート、右を Beverages シートとします。このスプレッドシートをもとに、公式ドキュメントの手順に従って API を作成します。Stein にサインアップし、スプレッドシートの URL を登録するだけですね。

クライアントライブラリを導入する

JavaScript で Stein API を叩くために、クライアントライブラリをインストールします。

$ yarn add stein-js-client

あと、本筋とは関係ないですが、後述のコードを正常に動かすためには、dotenv と CSS フレームワークの Vuetify が必要です。

$ yarn add @nuxtjs/dotenv @nuxtjs/vuetify

nuxt.config.js

modules: [
  '@nuxtjs/dotenv',
  '@nuxtjs/vuetify'
],

.env

API_URL=<YOUR_API_URL>

コンポーネントを作成する

API から取得した値は、以下のようにテーブル形式で表示します。

画像2

あらかじめ、テーブルをコンポーネント化しておきましょう。

/components/Menu.vue

<template>
 <v-simple-table>
   <template v-slot:default>
     <thead>
       <tr>
         <th class="text-center">Name</th>
         <th class="text-center">Price</th>
       </tr>
     </thead>
     <tbody>
       <tr v-for="item in items" :key="item.id">
         <td class="text-center">{{ item.name }}</td>
         <td class="text-center">{{ item.price }} yen</td>
       </tr>
     </tbody>
   </template>
 </v-simple-table>
</template>

<script>
export default {
 props: {
   items: {
     default: () => [],
     type: Array
   }
 }
}
</script>

スプレッドシートの値を取得する

クライアントライブラリを使用して Stein API を叩き、Google スプレッドシートの値を取得します。

/pages/index.vue

<template>
 <v-app>
   <v-content>
     <v-container>
       <v-row class="mb-3" justify="center">
         <h2>Menu</h2>
       </v-row>
       <v-row>
         <v-col cols="12" sm="6">
           <section>
             <h3 class="mb-2">Foods</h3>
             <Menu :items="foods"></Menu>
           </section>
         </v-col>
         <v-col cols="12" sm="6">
           <section>
             <h3 class="mb-2">Beverages</h3>
             <Menu :items="beverages"></Menu>
           </section>
         </v-col>
       </v-row>
     </v-container>
   </v-content>
 </v-app>
</template>

<script>
import SteinStore from 'stein-js-client'
import Menu from '~/components/Menu.vue'

const store = new SteinStore(process.env.API_URL)

export default {
 components: {
   Menu
 },
 async asyncData() {
   const [foods, beverages] = await Promise.all(
     ['Foods', 'Beverages'].map((itemType) => {
       return store.read(itemType)
     })
   )
   return { foods, beverages }
 }
}
</script>

手順は以上です。

Stein API を介せば、今回のような「読み取り」にとどまらず、スプレッドシートに対して比較的容易に CRUD 操作を行うことができます。

この記事が気に入ったらサポートをしてみませんか?