公開日:

Googleスプレッドシートを簡易データベースにするNPMモジュールを公開

Authors
  • author image
    Name
    代表取締役 宮永邦彦
    Twitter
    @miyanaga
  • 画像軽量化とWebフロントエンドのスピード改善の専門家です。Web系のIT技術大好き。

    このサイトではスピード改善のリアルや、日々の技術的な気づきを共有します。

TypeScriptによるプログラムで、Zodで型を規定しつつ、Googleスプレッドシートを簡易的なデータベースとして利用できるモジュールを開発した。


データベース面倒くさい問題

プログラムでは永続化されたデータを扱いたいことが多い。極めて小規模であればシンプルなファイルを用い、大規模になればデータベースを用いる。問題はその中間だ。ファイルではシンプルすぎるが、データベースを用意するほどでもないことがある。

データベースを用意するとそれを維持することも考えなければいけない。RDBMSだとスキーマ管理も別に必要になる。それが面倒で気が重い。

先日作成した以下のプログラムがまさにそのようなケースだった。

このプログラムでZodでスキーマを規定しつつGoogleスプレッドシートをデータベース代わりに使ってみたところ、思った以上に開発体験がよかった。そこで独立したモジュールとして機能を分離した。

使い方

まずはGCPでサービスアカウントを作成し、Googleスプレッドシートをサービスアカウントのメールアドレスに対し、編集権限付きで共有する。

JSONの鍵ファイルをservice-account.jsonとしてダウンロードすると、次のようなプログラムでスプレッドシートをドキュメントデータベースのように利用できる。

typescript
import { useWorksheetWithServiceAccountFile, useDocumentsSheet } from 'google-spreadsheet-tables'
import { z } from 'zod'

// スキーマを定義
const userSchema = z.object({
  name: z.string(),
  age: z.coerce.number(),
  gender: z.enum(['male', 'female', 'other']),
  company: z.string().optional(),
})

// スプレッドシート接続を初期化
// 'YOUR_SPREADSHEET_ID' を実際のファイルIDに置き換えてください。例:1vob8zYwa2p9mLDaczN_Egn-01QjC-tC80-Y83yYMCR0
const { doc } = useWorksheetWithServiceAccountFile('YOUR_SPREADSHEET_ID', './service-account.json')

// ドキュメントシートを作成
const { append, get, patch, snapshot, clear } = await useDocumentsSheet(
  doc,
  'Users',
  userSchema
)

// 新しいユーザーを追加
const newUser = await append({
  name: 'John Doe',
  age: 30,
  gender: 'male',
  company: 'Acme Inc.'
})

// すべてのユーザーを取得
const { documents: allUsers } = await snapshot()

// 特定のユーザーを取得
const user = await get(newUser.rowKey)

// ユーザーを更新
await patch(newUser.rowKey, {
  age: 31,
  company: 'New Company'
})

詳しくは日本語READMEをご覧いただきたい。

まとめ

もちろん性能は低いし、クリティカルな要件は満たすことができないが、小規模のゆるいデータ管理であればこれで十分だ。

データベースとしてのGoogleスプレッドシートは利点も多い。

  • リモートデータベース ローカルファイルだと実行中の端末からしかアクセスできないが、Googleスプレッドシートであれば複数の実行環境からも接続できる。
  • GUI完備 データを総覧しやすく、データの変更も直感的にできる。
  • 関数やスクリプト そのまま関数やGASで全体的なデータ加工ができる。
  • 前後の工程との接続 プログラムが全体の業務の一部である場合、前後の工程との受け渡しがある。スプレッドシートならデータ変換の手間が省けることがある。

個人的にはこれからも積極的に利用していきたい。