Firebase Firestoreを使ってGoogle Apps Scriptでデータを管理する方法

post-cover

GASを使用してプログラムを書いていると、スプレッドシートにデータを保存していると限界が来るので、DBに保存したいと考えるようになると思います。 今回はFirebase Firestore に保存する方法について解説します。

Firestore について

Firebase Firestoreは、Googleの提供するクラウドベースのNoSQLデータベースサービスです。リアルタイムデータ同期とオフラインデータアクセスのサポートを特徴とし、主にモバイルアプリケーションやウェブアプリケーションの開発に使用されます。

特徴

  • ドキュメント指向
  • リアルタイムデータ同期
  • スケーラビリティ
  • オフライン対応
  • セキュリティ

メリット

  1. 開発の迅速化
  2. クロスプラットフォーム対応
  3. 強力なクエリとデータ操作
  4. Firebase他機能との統合
  5. 従量課金制

Firebase との連携準備

まずFirestoreを作成しましょう。

GCP上でFirestoreの設定

GCP上でFirestoreにアクセス。 データベースの作成

ネイティブモードを選択 スクリーンショット 2024-04-20 9.14.01

データベースの構成 そのまま登録

GCP と Firebase のプロジェクトを関連付ける

Google Cloud Platform (GCP) で Firestore を作成した場合、そのデータベースを Firebase コンソールから直接管理し利用することができます。これを実現するためには、Firebase プロジェクトに GCP プロジェクトを関連付ける必要があります。 スクリーンショット 2024-04-20 9.17.58

そのままプロジェクト作成。 プロジェクトが作成できたら、FirebaseuのFirestoreを確認。 GCPで作成したFirestoreと関連付けされています・

ルール設定

初期設定だと、GASからアクセスできないため、セキュリティルールを変更する必要があります。

検証用なので、true に変更する。

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}

Google Apps Script での設定

Firestore へのデータ書き込みと読み取り

データ書き込みのスクリプト例:

function writeToFirestore() {
  var apiKey = PropertiesService.getScriptProperties().getProperty("FIRESTORE_API_KEY");
    var projectId = PropertiesService.getScriptProperties().getProperty("GCP_PROJECT_ID"); // GCP プロジェクトID
    var databaseId = '(default)'; // データベースID、通常は '(default)'
    var collectionPath = 'コレクション名'; // Firestore のコレクションパス

    var url = `https://firestore.googleapis.com/v1/projects/${projectId}/databases/${databaseId}/documents/${collectionPath}/${docId}?key=${apiKey}`;

    var payload = JSON.stringify({
      "fields": {
        "text": {"stringValue": tweetData.text},
        "timestamp": {"timestampValue": new Date().toISOString()},
        "url": {"stringValue": tweetData.url}
      }
    });

    var options = {
      "method": "patch",  // 新規作成または既存ドキュメントの更新
      "contentType": "application/json",
      "payload": payload,
      "muteHttpExceptions": true  // エラーハンドリングを強化
    };

    try {
      var response = UrlFetchApp.fetch(url, options);
      var responseData = JSON.parse(response.getContentText());
      if (response.getResponseCode() !== 200) {
        Logger.log("Error writing to Firestore: " + response.getContentText());
        return null;
      }
      return responseData;  // 成功した場合はレスポンスデータを返す
    } catch (error) {
      Logger.log("Exception when writing to Firestore: " + error.toString());
      return null;
    }

}

データ読み取りのスクリプト例:

function readFromFirestore() {
  var apiKey = PropertiesService.getScriptProperties().getProperty("FIRESTORE_API_KEY");
    var projectId = PropertiesService.getScriptProperties().getProperty("GCP_PROJECT_ID");  // GCP プロジェクトID
    var databaseId = '(default)';  // データベースID、通常は '(default)'
    // Firestore においてデータを保存しているコレクションパス
    var collectionPath = 'コレクション名';
    const docId = entryId

    var url = `https://firestore.googleapis.com/v1/projects/${projectId}/databases/${databaseId}/documents/${collectionPath}/${docId}?key=${apiKey}`;

    var options = {
      'method': 'get',
      'contentType': 'application/json'
    };

    try {
      var response = UrlFetchApp.fetch(url, options);
      if (response.getResponseCode() == 200) {
        var data = JSON.parse(response.getContentText());
        return data; // 成功時のデータを返す
      } else if (response.getResponseCode() == 404) {
        Logger.log("Document not found: " + docId);
        return null; // ドキュメントが存在しない場合は null を返す
      } else {
        throw new Error("Unhandled error: " + response.getContentText());
      }
    } catch (error) {
      Logger.log("Error retrieving document: " + error.toString());
      return null; // 例外が発生した場合も null を返す
    }
}

Profile picture
michael ☻︎ 🇯🇵
Web Engineer(PHP/Laravel, Python/FastAPI/Flask, TypeScript/Vue/React, AWS/GCP, etc.) / Freelance /
Profile picture
michael ☻︎ 🇯🇵
Web Engineer(PHP/Laravel, Python/FastAPI/Flask, TypeScript/Vue/React, AWS/GCP, etc.) / Freelance /
FebMarAprMayJunJul
© 2024, PWE