スプレッドシートはデータベースの夢を見るか

// Application

近年、多くの開発者やビジネスユーザーが、データ管理のためにGoogleスプレッドシートを積極的に活用しています。職種を選ばずさまざまなデータ管理ツールとして使用できるのが魅力です。直感的なインターフェースと日常的な使用経験があることに加え、専門知識やインフラ構築が不要で導入が容易なことから、多くのユーザーに選ばれています。さらに、チーム間でのデータ共有やリアルタイムな編集機能といった、現代のビジネスニーズに適した特徴も備えています。

アプリケーションにおけるデータ管理

データ管理ツールの代表格として、もう一つ「データベースソフトウェア」が挙げられます。MySQLSQLiteなどに代表されるデータベースは、データの整合性、高度な検索機能、複雑なクエリ処理など、エンタープライズレベルのデータ管理に必要な機能を提供します。その反面、 専門的な知識やインフラ構築が必要で、導入のハードルが高いという課題があります。また、一般ユーザー(非エンジニア)にとってはSQLの習得も必要となり、即座に活用することが難しい場合があります。

Googleスプレッドシートはデータベースとなり得るのか

非エンジニアでもデータの追加や編集が手軽にでき、さらにアプリケーションからも柔軟に利用できる方法を、多くの人が探しています。データ管理用のマスタ画面をリレーショナルデータベース上に構築したり、Table Plusのようなデータベースクライアントを利用したりするなど、一般的な解決方法がいくつか存在します。

しかしながら、マスタ画面の構築・運用には相当なコストがかかります。また、GUIベースのデータベースクライアントを使用する場合も、データベース接続情報の管理に伴うセキュリティ上のリスクは避けられません。

では、Googleスプレッドシートはどのような可能性を持つのでしょうか?非エンジニアの利用からアプリケーションのバックエンドまで、包括的なデータソースとして機能し得るのでしょうか?

とりあえず準備してみる

まずはプロジェクトの準備をしましょう。アプリケーションはHonoとNode.jsで実装します。今回は顧客管理ツールを作成していきます。

Honoプロジェクトの作成

$ pnpm create hono@latest .

✔ Using target directory … .
? Which template do you want to use? nodejs
? Do you want to install project dependencies? yes
? Which package manager do you want to use? pnpm
✔ Cloning the template
✔ Installing project dependencies
🎉 Copied project files
Get started with: cd .
package.json
{
  "name": "2025-02-04_google-sheets-db",
  "type": "module",
  "scripts": {
-     "dev": "tsx watch src/index.ts"
+     "dev": "tsx watch src/main.tsx"
  },
  "dependencies": {
    "@hono/node-server": "^1.13.8",
    "hono": "^4.6.20"
  },
  "devDependencies": {
    "@types/node": "^20.11.17",
    "tsx": "^4.7.1"
  }
}
src/main.tsx
import { serve } from "@hono/node-server";
import { Hono } from "hono";

const app = new Hono();

app.get("/", (c) => {
  return c.text("Hello Hono!");
});

const port = 3000;
console.log(`Server is running on http://localhost:${port}`);

serve({
  fetch: app.fetch,
  port,
});

Googleスプレッドシートの準備

まずはGoogleドライブから新しいGoogleスプレッドシートを作成します。一行目をヘッダーとして、以下のようなデータを入力します。

会社ID会社名住所代表電話番号代表メールアドレスメモ
1株式会社A東京都港区00-1234-5678a-company@example.com
2株式会社B東京都新宿区00-8765-4321b-company@example.com
3株式会社C東京都渋谷区00-2468-1357c-company@example.com
表のイメージ

Google Cloud Platformのプロジェクト作成と設定

次に、Google Cloud Platform(GCP)のプロジェクトを作成し、Google Sheets APIを有効化します。サービスアカウントを作成し、認証情報をダウンロードします。

  1. Google Cloud Platformにアクセスし、新しいプロジェクトを作成します。プロジェクト名を入力し、作成します。
  2. 作成したプロジェクトを選択し、[APIとサービス] > [ライブラリ]に移動します。
    プロジェクトの作成
  3. Google Sheets APIを検索し、有効にします。
    プロジェクトの作成
  4. [認証情報] > [認証情報を作成]を選択し、サービスアカウントを選択します。
    プロジェクトの作成
  5. サービスアカウント名とサービスアカウントIDを入力して作成します。
    プロジェクトの作成
  6. サービスアカウントにスプレッドシートの読み取り権限を持つロール([Project] > [オーナー])を割り当てます。
  7. 作成したサービスアカウントを選択肢、[鍵] > [キーを追加] > [新しい鍵を作成] > JSONを選択し、鍵を作成してダウンロードします。
    プロジェクトの作成
  8. Googleスプレッドシートの共有設定で、サービスアカウントのメールアドレスを追加します。
※ ここでダウンロードしたJSONキーは秘密情報ですので、Gitにコミットしないよう気をつけてください。

Google Sheets APIを利用してみる

まずは、Node.jsからGoogle Sheets APIを利用してデータを取得してみましょう。必要なパッケージをインストールしてから以下のコードをsrc/main.tsxに追記します。

$ pnpm add googleapis @google-cloud/local-auth
src/main.tsx
import { serve } from "@hono/node-server";
import { Hono } from "hono";
import { google } from "googleapis";
// 保存したJSONをimport
import key from "./secrets/********.json" assert { type: "json" };

const app = new Hono();

app.get("/", (c) => {
  // JSONファイルを読み込んで認証情報を取得する
  const client = google.auth.fromJSON(key);
  // 認証情報を使ってスプレッドシートAPIを利用するための認証オブジェクトを作成する
  const auth = new google.auth.GoogleAuth({
    scopes: ["https://www.googleapis.com/auth/spreadsheets.readonly"],
    authClient: client,
  });
  // スプレッドシートAPIのクライアントを作成する
  const sheets = google.sheets({ version: "v4", auth });

  // スプレッドシートの取得ロジックを実装する
  return c.text("Hello Hono!");
});

const port = 3000;
console.log(`Server is running on http://localhost:${port}`);

serve({
  fetch: app.fetch,
  port,
});

次に、データソースとして利用するGoogleスプレッドシートのIDを取得します。スプレッドシートのIDは、URLの/d//editの間にある文字列です。

https://docs.google.com/spreadsheets/d/<id>/edit

そのIDを使って、スプレッドシートのデータを取得してみましょう。

src/main.tsx
...

const SHEET_ID = "**";

app.get("/", (c) => {
  // JSONファイルを読み込んで認証情報を取得する
  const client = google.auth.fromJSON(key);
  // 認証情報を使ってスプレッドシートAPIを利用するための認証オブジェクトを作成する
  const auth = new google.auth.GoogleAuth({
    scopes: ["https://www.googleapis.com/auth/spreadsheets.readonly"],
    authClient: client,
  });
  // スプレッドシートAPIのクライアントを作成する
  const sheets = google.sheets({ version: "v4", auth });

  // スプレッドシートの取得ロジックを実装する
  return c.text("Hello Hono!");
})

引用