0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MySQL不要!GoogleスプレッドシートでDB構築する完全ガイド

Last updated at Posted at 2025-10-31

はじめに

実は、Googleスプレッドシートをうまい具合に使えば、誰でも簡単にデータベースとして活用することができます。

本格的なデータベースサーバーを立てる必要もなく、Googleアカウントさえあれば今すぐ始められます。

私自身も最近そのことを知って、さっそく試してみることにしました!今回の記事では、GoogleスプレッドシートをDB化する手順を初心者にもわかりやすく解説します。

まずは、覚えておくと便利なテクニックについて紹介していきます!

スプレッドシートをデータベース化する5つのテクニック

それでは、実際にスプレッドシートをデータベースとして活用する具体的な方法を見ていきましょう。

テクニック1:QUERY関数で超強力な検索機能を実装

QUERY関数を使えば、SQLのようなクエリでデータを抽出できます。

基本的な使い方

=QUERY(A1:F100, "SELECT * WHERE B = '山田太郎'")

この式は、B列(顧客名)が「山田太郎」のデータをすべて取得します。


複数条件での検索

=QUERY(A1:F100, "SELECT * WHERE B contains '山田' AND F = '契約中'")

B列に「山田」を含み、かつF列が「契約中」のデータを抽出します。


並び替えとカウント

=QUERY(A1:F100, "SELECT B, COUNT(B) GROUP BY B ORDER BY COUNT(B) DESC")

顧客名ごとにデータをグループ化して件数を集計し、多い順に並び替えます。


テクニック2:FILTER関数で動的なデータ抽出

FILTER関数を使えば、条件に合ったデータだけを表示できます。

基本構文

=FILTER(A2:F100, C2:C100="active@example.com")

C列のメールアドレスが指定した値と一致する行だけを表示します。


複数条件の組み合わせ

=FILTER(A2:F100, (C2:C100<>"") * (F2:F100="契約中"))

C列が空白でなく、かつF列が「契約中」のデータを抽出します。


テクニック3:IMPORTRANGE関数で複数シートを連携

別のスプレッドシートファイルからデータを取り込む場合は、IMPORTRANGE関数が便利です。

使い方

=IMPORTRANGE("スプレッドシートのURL", "シート名!A1:F100")

初回は「アクセス権限を許可」する必要があります。許可後は、参照元のデータが自動的に反映されます。

1つのスプレッドシートファイルに対して、最大600ファイルまでインポート可能という制限があります。大規模なシステムでは、この上限に注意が必要です。
(そもそも大規模システムでスプレッドシートDBは非推奨です)


テクニック4:データ入力規則でデータの品質を保つ

スプレッドシートの「データの入力規則」機能を使えば、誤ったデータの入力を防げます。

設定方法

  1. データを入力する範囲を選択
  2. メニューから「データ」→「データの入力規則」を選択
  3. 条件を設定(例:リストから選択、数値の範囲指定など)

活用例

  • ステータス列:「未対応」「対応中」「完了」のリストから選択
  • 日付列:今日以降の日付のみ入力可能
  • メールアドレス列:正しいメール形式のみ受付

テクニック5:Google Apps Script (GAS) でデータベース操作を自動化

より高度な処理が必要な場合は、GASを使ってプログラムでデータベース操作ができます。

基本的なデータ追加の例

function addData() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('データベース');
  const lastRow = sheet.getLastRow();
  
  // 新しいデータを追加
  const newData = [lastRow, '新規顧客', 'new@example.com', '090-1234-5678', new Date(), '見込み'];
  sheet.appendRow(newData);
}

データ検索の例

function searchData(searchName) {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('データベース');
  const data = sheet.getDataRange().getValues();
  
  const results = data.filter(row => row[1] === searchName);
  return results;
}

データ更新の例

function updateData(id, newStatus) {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('データベース');
  const data = sheet.getDataRange().getValues();
  
  for (let i = 0; i < data.length; i++) {
    if (data[i][0] === id) {
      sheet.getRange(i + 1, 6).setValue(newStatus);
      break;
    }
  }
}

実践例:Webフォームから保存できる問い合わせ管理システムを作ってみよう

最後に、実際に「フロント画面(Webフォーム)からデータを送信すると、スプレッドシートに保存される」という、本物のデータベースっぽい使い方を実践してみましょう。

ステップ1:スプレッドシートの準備

新しいスプレッドシートを作成し、「ContactDB」と名前をつけます。

1行目に以下の英語のカラム名を入力します。

| id | name | email | message | created_at | status |

image.png

ステップ2:GASでWebアプリを作成

スプレッドシートのメニューから 「拡張機能」→「Apps Script」 を開きます。

スクリーンショット 2025-10-31 095452.png

まず、Code.gsに以下のコードを貼り付けます。

// Webアプリとして公開するための関数
function doGet() {
  return HtmlService.createHtmlOutputFromFile('index')
    .setTitle('お問い合わせフォーム');
}

// フォームからデータを受け取って保存する関数
function saveData(formData) {
  try {
    const ss = SpreadsheetApp.getActiveSpreadsheet();
    const sheet = ss.getSheets()[0]; // 1枚目のシートを使用
    
    // 最終行を取得
    const lastRow = sheet.getLastRow();
    
    // IDは自動採番(最終行+1)
    const newId = lastRow;
    
    // 現在時刻を取得
    const now = new Date();
    
    // 新しい行を追加
    sheet.appendRow([
      newId,
      formData.name,
      formData.email,
      formData.message,
      now,
      '未対応'
    ]);
    
    return { success: true, message: 'データを保存しました!' };
  } catch (error) {
    return { success: false, message: 'エラーが発生しました: ' + error.toString() };
  }
}

image.png


次に、左側のメニューから「+」ボタンをクリックして「HTML」を選択し、ファイル名をindexにして以下のHTMLコードを貼り付けます。

image.png

<!DOCTYPE html>
<html>
<head>
  <base target="_top">
  <style>
    body {
      font-family: Arial, sans-serif;
      max-width: 500px;
      margin: 50px auto;
      padding: 20px;
      background-color: #f5f5f5;
    }
    .form-container {
      background-color: white;
      padding: 30px;
      border-radius: 8px;
      box-shadow: 0 2px 4px rgba(0,0,0,0.1);
    }
    h1 {
      color: #333;
      text-align: center;
    }
    .form-group {
      margin-bottom: 20px;
    }
    label {
      display: block;
      margin-bottom: 5px;
      color: #555;
      font-weight: bold;
    }
    input, textarea {
      width: 100%;
      padding: 10px;
      border: 1px solid #ddd;
      border-radius: 4px;
      box-sizing: border-box;
      font-size: 14px;
    }
    textarea {
      resize: vertical;
      min-height: 100px;
    }
    button {
      width: 100%;
      padding: 12px;
      background-color: #4CAF50;
      color: white;
      border: none;
      border-radius: 4px;
      font-size: 16px;
      cursor: pointer;
      transition: background-color 0.3s;
    }
    button:hover {
      background-color: #45a049;
    }
    button:disabled {
      background-color: #cccccc;
      cursor: not-allowed;
    }
    .message {
      margin-top: 20px;
      padding: 10px;
      border-radius: 4px;
      text-align: center;
    }
    .success {
      background-color: #d4edda;
      color: #155724;
    }
    .error {
      background-color: #f8d7da;
      color: #721c24;
    }
  </style>
</head>
<body>
  <div class="form-container">
    <h1>お問い合わせフォーム</h1>
    <form id="contactForm">
      <div class="form-group">
        <label for="name">お名前</label>
        <input type="text" id="name" name="name" required>
      </div>
      
      <div class="form-group">
        <label for="email">メールアドレス</label>
        <input type="email" id="email" name="email" required>
      </div>
      
      <div class="form-group">
        <label for="message">お問い合わせ内容</label>
        <textarea id="message" name="message" required></textarea>
      </div>
      
      <button type="submit" id="submitBtn">送信する</button>
    </form>
    
    <div id="responseMessage"></div>
  </div>

  <script>
    document.getElementById('contactForm').addEventListener('submit', function(e) {
      e.preventDefault();
      
      // ボタンを無効化
      const submitBtn = document.getElementById('submitBtn');
      submitBtn.disabled = true;
      submitBtn.textContent = '送信中...';
      
      // フォームデータを取得
      const formData = {
        name: document.getElementById('name').value,
        email: document.getElementById('email').value,
        message: document.getElementById('message').value
      };
      
      // GAS関数を呼び出してデータを保存
      google.script.run
        .withSuccessHandler(function(response) {
          showMessage(response.message, 'success');
          document.getElementById('contactForm').reset();
          submitBtn.disabled = false;
          submitBtn.textContent = '送信する';
        })
        .withFailureHandler(function(error) {
          showMessage('送信に失敗しました: ' + error, 'error');
          submitBtn.disabled = false;
          submitBtn.textContent = '送信する';
        })
        .saveData(formData);
    });
    
    function showMessage(message, type) {
      const messageDiv = document.getElementById('responseMessage');
      messageDiv.textContent = message;
      messageDiv.className = 'message ' + type;
      
      // 3秒後にメッセージを消す
      setTimeout(function() {
        messageDiv.textContent = '';
        messageDiv.className = '';
      }, 3000);
    }
  </script>
</body>
</html>

image.png

ステップ3:Webアプリとして公開

  1. 右上の「デプロイ」→「新しいデプロイ」をクリック
  2. 「種類の選択」で歯車アイコンをクリックし、「ウェブアプリ」を選択
  3. 以下のように設定します
    • 説明:お問い合わせフォーム(任意)
    • 次のユーザーとして実行:自分
    • アクセスできるユーザー:全員
  4. 「デプロイ」をクリック
  5. 「アクセスを承認」→自分のGoogleアカウントを選択
  6. 「詳細」→「(プロジェクト名)に移動」をクリックして承認 (ここは人によっては英語表記かも)
  7. 表示されたURLをコピー(これがWebアプリのURL)

image.png

image.png

image.png

image.png

image.png

ステップ4:動作確認

コピーしたURLをブラウザで開くと、お問い合わせフォームが表示されます。

試しに以下の情報を入力して送信してみましょう。

  • お名前:山田太郎
  • メールアドレス:yamada@example.com
  • お問い合わせ内容:テスト送信です

image.png

「送信する」ボタンをクリックすると、「データを保存しました!」というメッセージが表示されます。

スプレッドシートを確認すると、入力したデータが自動的に追加されているはずです!

image.png

ステップ5:データの活用(オプション)

保存されたデータは、QUERY関数やFILTER関数を使って集計・分析できます。

例えば、別シートで未対応の問い合わせだけを表示する場合は以下のようにします。

=FILTER(Sheet1!A2:F, Sheet1!F2:F="未対応")

image.png

ステータスを「対応中」や「完了」に変更すれば、進捗管理もできます。

新機能:テーブル機能の活用

2024年7月に追加された「テーブル機能」を使えば、さらに簡単にデータベース化できます。

テーブル機能の使い方

  1. データ範囲を選択
  2. 右クリックして「テーブルに変換」を選択
  3. 自動的に見やすいデザインが適用される

テーブル機能を使うと、フィルタリングやソートがワンクリックで行えるようになります。

image.png

image.png

まとめ

Googleスプレッドシートは、本格的なデータベースほどの機能はありませんが、以下のような場面では十分に活用できます。

  • 小規模なデータ管理
  • チーム内での情報共有
  • プロトタイプの作成
  • 簡易的な顧客管理や在庫管理

本記事で紹介した5つのテクニックを活用すれば、誰でも簡単にスプレッドシートをデータベースとして活用することができます!

まずは試しに軽いプロジェクトで遊んでみて、徐々に機能を拡張していきましょう。

0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?