スプレッドシートをNext.jsのデータベースとして使う

2

目次

スプレッドシートをデータベースとして使えばコードを書かずともスマホからデータが編集できるというのは素敵だなと思ってやってみた。アプリ側からの CRUD などはまだできてない(そもそも出来るのか疑問)ためひとまずデータの GET だけ。

参考: Next.js の ISR を使ってスプレッドシートをデータソースにして業務フローを変えた話

参考: Google Sheets のデータを JSON 形式で取得する Web API をサクッと作る

スプレッドシートの API 化

この記事を参考に API を作る。

function getData_(sheetName) {
  const sheet = SpreadsheetApp.getActive().getSheetByName(sheetName);
  const rows = sheet.getDataRange().getValues();
  const keys = rows.splice(0, 1)[0];
  return rows.map((row) => {
    const obj = {};
    row.map((item, index) => {
      obj[String(keys[index])] = String(item);
    });
    return obj;
  });
}

function doGet() {
  var data = getData_("Sheet1");
  return ContentService.createTextOutput(JSON.stringify(data, null, 2)).setMimeType(ContentService.MimeType.JSON);
}
注意

日本語で使ってる場合はSheet1をシート 1 にする必要がある

Next.js

npx create-next-app spreadsheet-sample とかで Next.js 立ち上げ

pages/index.js
import Head from "next/head";
import Image from "next/image";
import styles from "../styles/Home.module.css";

export default function Home({ test }) {
  console.log(test);
  return (
    <div className={styles.container}>
      <Head>
        <title>Create Next App</title>
        <meta name="description" content="Generated by create next app" />
        <link rel="icon" href="/favicon.ico" />
      </Head>

      <main className={styles.main}>
        {test.map((test, i) => (
          <div key={i}>
            <p>{test.title}</p>
            <p>{test.description}</p>
          </div>
        ))}
      </main>

      <footer className={styles.footer}>
        <a
          href="https://vercel.com?utm_source=create-next-app&utm_medium=default-template&utm_campaign=create-next-app"
          target="_blank"
          rel="noopener noreferrer"
        >
          Powered by{" "}
          <span className={styles.logo}>
            <Image src="/vercel.svg" alt="Vercel Logo" width={72} height={16} />
          </span>
        </a>
      </footer>
    </div>
  );
}

Home.getInitialProps = async (ctx) => {
  const res = await fetch("スプレッドシートAPIのURL");
  const json = await res.json();
  return { test: json };
};

完成

01

  • SNSでシェアしよう
  • Twitterでシェア
  • FaceBookでシェア
  • Lineでシェア
  • 記事タイトルとURLをコピー
トップへ戻るボタン

\ HOME /

トップへ戻る