スプレッドシートを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 };
};
完成