Google Apps ScriptでFireBaseのFirestoreをシートに読み込む方法

Firestoreとは

FirestoreはGoogleが提供しているNoSQLドキュメント指向データベース。

GoogleにログインしていればFirebaseのコンソールから誰でも簡単に使用することができる。

https://console.firebase.google.com/

使用するにはコンソールから「プロジェクトを追加」を選択してプロジェクトに名前を付ける。

コンソールから「プロジェクトを追加」を選択してプロジェクトに名前を付ける

プロジェクトを作成したら左サイドにあるCloud Firestoreを選択して「データベースの作成」を押して必要事項を入力すれば使えるようになる。
(データを読み込むにはルールをallow read: if trueなどに変更が必要)

Cloud Firestoreを選択して「データベースの作成」を押して必要事項を入力
Cloud Firestore フィールドを追加

ウェブページで読み込みや書き込みを行うには「ウェブアプリにFirebaseを追加」で追加するとHTMLに貼り付けるコードが表示されるので、これをコピペして使用可能なライブラリから必要なライブラリも読み込む。(今回はFirestore)

ウェブアプリにFirebaseを追加

今回のケースの場合、貼り付けるHTMLは以下のようになる。

<script src="https://www.gstatic.com/firebasejs/8.1.2/firebase-app.js"></script>
<script src="https://www.gstatic.com/firebasejs/8.1.2/firebase-firestore.js"></script>
<script>
var firebaseConfig = {
  apiKey: "AIzaSyBymT4Q0pi2fXbyeWI8AYIBtDyHdiq8X_w",
  authDomain: "sample-5bffe.firebaseapp.com",
  projectId: "sample-5bffe",
  storageBucket: "sample-5bffe.appspot.com",
  messagingSenderId: "674515011580",
  appId: "1:674515011580:web:75010c58224fa0df4e5479"
};
firebase.initializeApp(firebaseConfig);
</script>

あとはFirestoreで読み込む処理などを追記するだけだ。

const db = firebase.firestore();
db.collection('users').get().then(snap => {
  snap.forEach(doc => {
    console.log(doc.data())
    // {name: "ryu", id: 1}
    // {name: "ken", id: 2}
  });
});

シートにFirestoreのデータを読み込む

HTMLの読み込みは前述の通りだがGoogleスプレッドシートにGoogle Apps Scriptを使用して読み込むにはいくつかの手順が必要になる。

まずシートを作成してスクリプトエディタのリソース => ライブラリで以下のコードを貼り付けてFirestoreAppを保存する。

1VUSl4b1r1eoNcRWotZM3e87ygkxvXltOgyDZhixqncz9lQ3MjfT1iKFw
スクリプトエディタのリソース => ライブラリで以下のコードを貼り付けてFirestoreAppを保存

ライブラリを保存したらあとは以下のコードを貼り付ける。
(email, key, projectIdの値は変えてください)

function myFunction() {
  const email = 'firebase-adminsdk-be2k2@sample-5bffe.iam.gserviceaccount.com';
  const key = '-----BEGIN PRIVATE KEY-----\nPC【超長いので省略】zlX\n-----END PRIVATE KEY-----\n';
  const projectId = 'sample-5bffe';
  const firestore = FirestoreApp.getFirestore(email, key, projectId);
  const sheet = SpreadsheetApp.getActiveSheet();
  const data = firestore.getDocuments('users');
  const result = data.reduce((a, c) => {
    a.push([
      c.fields.id.integerValue,
      c.fields.name.stringValue,
    ]);
    return a;
  }, [])
  const row = 2 
  const rowNum = result.length
  const colNum = result[0].length
  sheet.getRange(row, 1, rowNum, colNum).setValues(result)
}

よく勘違いされるが、emailの部分は自身のGoogleアカウントのメールアドレスではなくSettings(設定)のサービスアカウントのemailが入る。

Settings(設定)のサービスアカウント

あとkeyはサービスアカウントのページの一番下に「新しい秘密鍵の生成」というボタンがあるので、これを押してダウンロードされるJSONファイルに記載されている"private_key"の値をコピーして貼り付けてください。

以上の手順が正しく行われていればスクリプト実行時にGoogleスプレッドにFirestoreのデータを読み込めるようになります。

Google Apps Scriptの実行結果
Google Apps Scriptの実行結果