GASを使用してプログラムを書いていると、スプレッドシートにデータを保存していると限界が来るので、DBに保存したいと考えるようになると思います。 今回はFirebase Firestore に保存する方法について解説します。
Firestore について
Firebase Firestoreは、Googleの提供するクラウドベースのNoSQLデータベースサービスです。リアルタイムデータ同期とオフラインデータアクセスのサポートを特徴とし、主にモバイルアプリケーションやウェブアプリケーションの開発に使用されます。
特徴
- ドキュメント指向
- リアルタイムデータ同期
- スケーラビリティ
- オフライン対応
- セキュリティ
メリット
- 開発の迅速化
- クロスプラットフォーム対応
- 強力なクエリとデータ操作
- Firebase他機能との統合
- 従量課金制
Firebase との連携準備
まずFirestoreを作成しましょう。
GCP上でFirestoreの設定
GCP上でFirestoreにアクセス。 データベースの作成
ネイティブモードを選択
データベースの構成 そのまま登録
GCP と Firebase のプロジェクトを関連付ける
Google Cloud Platform (GCP) で Firestore を作成した場合、そのデータベースを Firebase コンソールから直接管理し利用することができます。これを実現するためには、Firebase プロジェクトに GCP プロジェクトを関連付ける必要があります。
そのままプロジェクト作成。 プロジェクトが作成できたら、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 を返す
}
}