Googleスプレッドシート

Googleスプレッドシートのデータを安全に共有!特定の許可されたユーザーだけがJSON形式でアクセスできる方法

Googleスプレッドシートは、データ管理や共有において多くの場面で利用されています。しかし、そのデータを外部アプリやウェブサイトで活用する際に、安全に共有する方法を検討する必要があります。
特に、特定の許可されたユーザーにのみアクセスを許可したい場合、適切な認証プロセスを構築することが不可欠です。本記事では、Google Apps ScriptとGoogle Cloud Platform(GCP)を活用してスプレッドシートのデータをJSON形式で提供し、特定のユーザーのみがアクセスできるようにする手順を詳細に解説します。

どんな時に使用するのか

以下のような状況でこの方法が役立ちます:

  • スプレッドシートに保存されたデータを、社内システムやウェブアプリで利用したい場合。
  • 特定の許可されたユーザー(例:社内メンバーやクライアント)にのみデータを公開したい場合。
  • API形式でデータを提供し、JavaScriptなどを使って動的にウェブページに表示したい場合。
  • セキュリティを考慮し、不特定多数へのアクセスを防ぎたい場合。

Google Cloud Platform(GCP)のプロジェクト設定

1. GCPプロジェクトを作成

  1. Google Cloud Consoleにアクセスし、Googleアカウントでログインします。
  2. 左上の「プロジェクト選択」をクリックし、「新しいプロジェクトを作成」を選択します。
  3. プロジェクト名を入力し、「作成」をクリックします。

2. APIとサービスを有効化

  1. GCPのダッシュボードで作成したプロジェクトを選択します。
  2. 「APIとサービス」→「ライブラリ」を選択します。
  3. 「Google Sheets API」を検索し、「有効化」をクリックします。
  4. 同様に「Google Apps Script API」を検索し、「有効化」をクリックします。

3. OAuth 2.0クライアントIDを作成

  1. 「APIとサービス」→「認証情報」→「認証情報を作成」をクリックします。
  2. 「OAuth 2.0 クライアント ID」を選択します。
  3. 「アプリケーションの種類」で「ウェブアプリケーション」を選択します。
  4. 「リダイレクト URI」を設定します。以下のURIを追加してください:
    https://script.google.com/macros/s/YOUR_SCRIPT_ID/exec
    YOUR_SCRIPT_IDにはApps ScriptのデプロイURLからスクリプトIDを置き換えてください。
  5. 「作成」をクリックすると、クライアントIDとクライアントシークレットが表示されます。
  6. クライアントIDをメモしておきます(後ほど使用します)。

実際の記述や具体的な手順

1. Google Apps Scriptの設定

以下のコードをスプレッドシートのApps Scriptに追加します。

// Googleスプレッドシートのデータを取得してJSON形式で返す
function doGet(e) {
    const userEmail = Session.getActiveUser().getEmail(); // 現在のユーザーのメールアドレス
    const allowedEmails = ["user1@example.com", "user2@example.com"]; // 許可するユーザーリスト

    // 許可されていない場合、エラーメッセージを返す
    if (!allowedEmails.includes(userEmail)) {
        return ContentService.createTextOutput(JSON.stringify({ error: "Access denied" }))
            .setMimeType(ContentService.MimeType.JSON);
    }

    // 許可されたユーザーにはデータを返す
    const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1");
    const data = sheet.getDataRange().getValues();
    return ContentService.createTextOutput(JSON.stringify(data))
        .setMimeType(ContentService.MimeType.JSON);
}

2. フロントエンドの設定

Google OAuth認証を用いてデータを取得するHTMLを用意します。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Google OAuthでJSONデータ取得</title>
    <script src="https://apis.google.com/js/platform.js" async defer></script>
    <script>
        const CLIENT_ID = 'YOUR_CLIENT_ID'; // GCPで取得したクライアントID
        const SCRIPT_URL = 'YOUR_SCRIPT_URL'; // Apps ScriptのデプロイURL
        const SCOPES = 'https://www.googleapis.com/auth/spreadsheets.readonly';

        function authenticate() {
            gapi.load('client:auth2', () => {
                gapi.auth2.init({ client_id: CLIENT_ID, scope: SCOPES }).then(() => {
                    const GoogleAuth = gapi.auth2.getAuthInstance();
                    GoogleAuth.signIn().then(() => fetchData());
                });
            });
        }

        function fetchData() {
            const GoogleAuth = gapi.auth2.getAuthInstance();
            const user = GoogleAuth.currentUser.get();
            const token = user.getAuthResponse().id_token;

            fetch(SCRIPT_URL, {
                method: 'GET',
                headers: {
                    Authorization: `Bearer ${token}`
                }
            })
            .then(response => response.json())
            .then(data => {
                console.log(data);
                document.getElementById('data-container').innerText = JSON.stringify(data, null, 2);
            })
            .catch(error => {
                console.error('Error:', error);
            });
        }
    </script>
</head>
<body>
    <button onclick="authenticate()">データを取得する</button>
    <pre id="data-container"></pre>
</body>
</html>

注意点

  • Apps ScriptのURLをGCPで正確にリダイレクトURIとして登録してください。
  • 許可されたユーザーリストを定期的に更新する必要があります。
  • セキュリティを確保するため、必要最小限のスコープを設定してください。

まとめ

本記事では、Googleスプレッドシートのデータを特定の許可されたユーザーだけがJSON形式でアクセスできるようにする方法を解説しました。
GCPの設定からApps Script、フロントエンドまでの詳細な手順を提供しました。この方法を活用して、より安全で効率的なデータ管理を実現しましょう!

 
※参考する場合は自己責任でお願いします。