10
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Gridsome で始めるスプレッドシート生活 ~スプレッドシートからデータを取得してみる~

Last updated at Posted at 2020-09-27

ゴール

スクリーンショット 2020-09-27 23.50.16.png

こんな感じのスプレッドシートのデータをWebサイトに表示させたいと思います。

スクリーンショット 2020-09-28 0.08.47.png

動作環境

  • @gridsome/cli v0.3.4
  • gridsome v0.7.21
  • yarn 1.22.0
  • macOS 10.14.6

プロジェクト作成&準備

やる前にGraphQLがどういったものかを知るために下の記事を参考にさせていただきました。
ありがとうございます。

1.Gridsome CLI インストール

.bash
# yarn を使う場合
$ yarn global add @gridsome/cli
# npm を使う場合
$ npm install --global @gridsome/cli

2.プロジェクト作成

.bash
$ gridsome create sheetSample
$ cd  sheetSample

3.サイト表示

.bash
$ gridsome develop

スクリーンショット 2020-09-28 0.27.51.png

アクセスしてサイトが表示されたらOK

静的ファイル生成 /distフォルダに生成されます。

.bash
$ gridsome build

3.スプレッドシートのデータを利用するのに必要なプラグインのインストール

.bash
# yarn を使う場合
yarn add gridsome-source-google-sheets
# npm を使う場合
npm install gridsome-source-google-sheets

4. sheetIdとapiKeyを準備

gridsome.config.js
module.exports = {
  siteName: 'Gridsome',
  plugins: [
    {
      use: 'gridsome-source-google-sheets',
      options: {
        sheetId: 'GOOGLE_SHEET_ID', 
        apiKey: 'GOOGLE_API_KEY',
        // type: 'TYPE_NAME', //Optional - default is googleSheet. Used for graphql queries.
      }
    }
  ]
}

sheetIdapiKeyを準備します。

apiKeyを設定

APIキーを作成
https://console.developers.google.com/apis/credentials
スクリーンショット 2020-09-28 1.40.58.png

Google Sheets APIを有効にする

スクリーンショット 2020-09-28 1.40.19.png

作成したAPIキーを gridsome.config.jsGOOGLE_SHEET_IDの部分に貼り付けます

sheetIdを設定

作成したスプレッドシートの共有リンクを作成します。

スクリーンショット 2020-09-28 1.50.49.png

スプレッドシートのURLを確認します。

https://docs.google.com/spreadsheets/d/GOOGLE_SHEET_ID/edit#gid=0

GOOGLE_SHEET_IDの部分がsheetIdになります。
取得したsheetIdgridsome.config.jsGOOGLE_SHEET_IDの部分に貼り付けます

スプレッドシートからデータを取得する

1.GraphQL でデータを取得してみる

Introduction to GraphQL | GraphQL

.bash
$ gridsome develop

スクリーンショット 2020-09-28 0.27.51.png

ここにアクセスしましょう

スクリーンショット 2020-09-28 0.31.08.png

実際にサイト内でアクセスする際に使用するクエリーを作って確認してみましょう

query {
  allGoogleSheet  {
    edges {
      node  {
        id
        title
        description
      }
    }
  }
}

これを実行すると下記のような結果が得られます。

.json
{
  "data": {
    "allGoogleSheet": {
      "edges": [
        {
          "node": {
            "id": "11",
            "title": "あああああ11",
            "description": "テストテスト11"
          }
        },
        {
          "node": {
            "id": "10",
            "title": "あああああ10",
            "description": "テストテスト10"
          }
        },
        {
          "node": {
            "id": "9",
            "title": "あああああ9",
            "description": "テストテスト9"
          }
        },
        {
          "node": {
            "id": "8",
            "title": "あああああ8",
            "description": "テストテスト8"
          }
        },
        {
          "node": {
            "id": "7",
            "title": "あああああ7",
            "description": "テストテスト7"
          }
        },

スクリーンショット 2020-09-28 0.42.17.png

2.スプレッドシートのデータをサイトに表示させる

<page-query>ここのブロックに目的のquery(1.GraphQL でデータを取得してみるで作成したやつ)を記載します。

/src/pages/Index.vue
<template>
  <Layout>
    <table border="1">
      <thead>
        <tr>
          <th>id</th>
          <th>title</th>
          <th>description</th>
        </tr>
      </thead>
      <tbody>
        <tr v-for="page in $page.allGoogleSheet.edges" :key="page.id">
          <td>{{ page.node.id }}</td>
          <td>{{ page.node.title }}</td>
          <td>{{ page.node.description }}</td>
        </tr>
      </tbody>
    </table>
  </Layout>
</template>

<page-query>
query {
  allGoogleSheet  {
    edges {
      node  {
        id
        title
        description
      }
    }
  }
}
</page-query>

結果

スクリーンショット 2020-09-28 0.08.47.png

表示できました。

でもidが降順ではなく昇順がいいので昇順にしてみます。

query {
  allGoogleSheet(order: ASC, sortBy: "id")  {
    edges {
      node  {
        id
        title
        description
      }
    }
  }
}

スクリーンショット 2020-09-28 1.34.06.png

並び替えられていますね!

templateを使ってみる

Templates - Gridsome

templateを使ってよくある詳細画面を作ってみましょう

1.template作成

/src/templates/googleSheet.vue
<template>
  <layout>
    <div>{{$page.googleSheet.title}}</div>
    <div>{{$page.googleSheet.description}}</div>
  </layout>
</template>

<page-query>
query Post ($path: String!) {
  googleSheet (path: $path) {
    title
    description
  }
}
</page-query>
gridsome.config.js
module.exports = {
  siteName: 'Gridsome',
  plugins: [
    {
      use: 'gridsome-source-google-sheets',
      options: {
        sheetId: 'GOOGLE_SHEET_ID',
        apiKey: 'GOOGLE_API_KEY',
        // type: 'TYPE_NAME', //Optional - default is googleSheet. Used for graphql queries.
      }
    }
  ],
  templates: {
    googleSheet: [
      {
        path: '/:id',
        component: './src/templates/googleSheet.vue'
      }
    ]
  }
}

作成したtemplateのパスを指定します。
pathは/:id とすることで

http://localhost:8080/:id => http://localhost:8080/1 これでアクセスするとidが1のデータを取得し templateに表示されます。

2.リンク作成

Linking - Gridsome

/src/pages/Index.vue
<template>
  <Layout>
    <table border="1">
      <thead>
        <tr>
          <th>id</th>
          <th>title</th>
        </tr>
      </thead>
      <tbody>
        <tr v-for="page in $page.allGoogleSheet.edges" :key="page.id">
          <td><g-link :to="page.node.id">{{ page.node.id }}</g-link></td>
          <td>{{ page.node.title }}</td>
        </tr>
      </tbody>
    </table>
  </Layout>
</template>

<page-query>
query {
  allGoogleSheet(order: ASC, sortBy: "id")  {
    edges {
      node  {
        id
        title
        description
      }
    }
  }
}
</page-query>

スクリーンショット 2020-09-28 2.51.18.png

idのリンクを押すと対応したtitleと詳細が出るようになりました。

スクリーンショット 2020-09-28 2.44.16.png

最後に

Gridsomeのプロジェクト作成は特に指定なして今回は作成しましたが公式でstarterがいくつか用意されているのでより効率よく目的のサイトを作成できると思います。
スクリーンショット 2020-09-28 2.14.29.png

blog系のスターター + Headless CMSとかでJamStackなブログを作ってもいいですね.

gridsome-source-google-sheetsのプラグインを利用すると,
スプレッドシートAPIをそのまま利用してシートデータを取得するのではなく、Graphqlを利用してデータを取得するので扱いやすく、フロントエンドに集中できると感じたのでよかったです。
また、スプレッドシートでデータを用意できれば個人で開発する小規模のものや、短期間でサクッとものを作りたい時などに良さそうと感じました。

$ gridsome build

で静的サイト生成するときにスプレッドシートのデータを取得してくれるのでvercelnetlifyを利用してデプロイ時にbuildコマンドを走らせるようにすればサイトが最新の状態に更新されかつサクサク快適に動くサイトが作れそうですね。

Gridsomeに関しては今回スプレッドシートのプラグインを使いたくて使ってみたばかりなので

このプラグインおすすめだよなどありましたら教えてくださるとありがたいです。

参考させていただいたもの

10
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?