GAS（Google Apps Script）でCloud Firestoreを利用する時のメモ

Google Apps Script で Cloud Firestore を利用する方法をメモ。

#参考URL
[Firestore for Google Apps Scripts - Github](https://github.com/grahamearley/FirestoreGoogleAppsScript)
[【書籍管理シリーズ】GASとFireBase(Firestore)を連携させるよ！ - Qiita](https://qiita.com/h_plum/items/f6ba16931f955d33158e)

#事前準備
[Firebase](https://console.firebase.google.com/)でプロジェクトは作成済み。
Cloud Firestore でデータベースの作成済み。（サンプル）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725039/0aac5745-7ca7-c001-db1c-8248f4a05089.png)

#Google Apps Script で FirestoreApp のライブラリを追加
１．Google スプレッドシートで「ツール」->「スクリプトエディタ」を開く
２．「リソース」->「ライブラリ」
３．"Add a library" に「```1VUSl4b1r1eoNcRWotZM3e87ygkxvXltOgyDZhixqncz9lQ3MjfT1iKFw```」を入力
４．FirestoreAppを追加（バージョンは最新にしておく。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725039/f6bb39cd-295e-4e1f-7cb8-86f52d0fdf06.png)

#サービスアカウントの作成
１．[Google Service Accounts page](https://console.developers.google.com/projectselector/iam-admin/serviceaccounts) にアクセス。
２．Firebaseのプロジェクトを選択 ->「サービスアカウントを作成」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725039/f9126110-8650-700e-1782-83f6566c1640.png)
３．サービスアカウント名、サービスアカウントIDを入力 -> 作成
４．ロール -> 「Cloud Datastore オーナー」を選択 -> 続行
５．ユーザーロール、管理者ロールは特に設定しなくてもOK　-> 完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725039/7058ee38-2d62-ea3b-20c4-22d776379fa4.png)
６．作成したサービスアカウントから「鍵を作成」-> キーのタイプは"JSON"にしてローカルに保存しとく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725039/2ae300f3-4584-c814-cfb7-02ad936c3e0b.png)

**※JSONの中身（サンプル）**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725039/2d131281-59c4-dace-5dd8-63ab030cd225.png)

#Google Apps Script のコード
###読み込み（取得）：コレクション内の全てのドキュメント取得
「鍵の作成」で出力したJSON内の "project_id"、"private_key"、"client_email" を使う。```function firestoreData```で鍵の情報をセット。

```javascript:.gs
// CloudFirestoreで認証する為のJSON情報を指定
function firestoreDate() {
  var dateArray = {
    'email': 'test-9999@projecttest99999.iam.gserviceaccount.com',
    'key': '-----BEGIN PRIVATE KEY-----\nxxxxxxxxxxxxxx\n-----END PRIVATE KEY-----\n',
    'projectId': 'projecttest-99999'
  }
  return dateArray;
}

// メイン処理部
function myFunction(){
  // CloudFirestoreの認証
  var dateArray = firestoreDate();
  var firestore = FirestoreApp.getFirestore(dateArray.email, dateArray.key, dateArray.projectId);
  // CloudFirestoreからデータを読み込む
  const doc = firestore.getDocument("TEST/voKMytSenYR9ZWYoCeWr");
  console.log(doc);
}
```

```console:console
[20-12-06 21:58:08:439 JST] { name: 'projects/projecttest-99999/databases/(default)/documents/TEST/voKMytSenYR9ZWYoCeWr',
  fields: 
   { TEST02: { stringValue: '0002' },
     TEST01: { stringValue: '0001' } },
  createTime: '2020-12-06T11:53:16.582462Z',
  updateTime: '2020-12-06T11:53:16.582462Z' }
```

###読み込み（取得）：他のプロパティ項目

```javascript:.gs
function myFunction(){
  // CloudFirestoreの認証
  var dateArray = firestoreDate();
  var firestore = FirestoreApp.getFirestore(dateArray.email, dateArray.key, dateArray.projectId);
  // CloudFirestoreからデータを読み込む
  const doc = firestore.getDocument("TEST/voKMytSenYR9ZWYoCeWr");
  console.log(`フィールドTEST01：${doc.obj.TEST01}`);
  console.log(`フィールドTEST02：${doc.obj.TEST02}`);
  console.log(`データベースの読み込み時間：${doc.read}`);
  console.log(`データベースの更新時間：${doc.updated}`);
  console.log(`データベースの作成時間：${doc.created}`);
  console.log(`Fullドキュメントパス：${doc.name}`);
  console.log(`Localドキュメントパス：${doc.path}`);
}
```

```console:console
 フィールドTEST01：0001
 フィールドTEST02：0002
 データベースの読み込み時間：Sun Dec 06 2020 22:18:01 GMT+0900 (日本標準時)
 データベースの更新時間：Sun Dec 06 2020 20:53:16 GMT+0900 (日本標準時)
 データベースの作成時間：Sun Dec 06 2020 20:53:16 GMT+0900 (日本標準時)
 Fullドキュメントパス：projects/projecttest-99999/databases/(default)/documents/TEST/voKMytSenYR9ZWYoCeWr
 Localドキュメントパス：TEST/voKMytSenYR9ZWYoCeWr
```

###書き込み（更新）：ドキュメント内の上書き更新
「鍵の作成」で出力したJSON内の "project_id"、"private_key"、"client_email" を使う。```function firestoreData```で鍵の情報をセット。

```javascript:.gs
// CloudFirestoreで認証する為のJSON情報を指定
function firestoreDate() {
  var dateArray = {
    'email': 'test-9999@projecttest99999.iam.gserviceaccount.com',
    'key': '-----BEGIN PRIVATE KEY-----\nxxxxxxxxxxxxxx\n-----END PRIVATE KEY-----\n',
    'projectId': 'projecttest-99999'
  }
  return dateArray;
}

// メイン処理部
function myFunction(){
  // CloudFirestoreの認証
  var dateArray = firestoreDate();
  var firestore = FirestoreApp.getFirestore(dateArray.email, dateArray.key, dateArray.projectId);
  // 更新するデータ
  const data = {
    "test01": "test001",
    "test02": "test002"
  }
  // CloudFirestoreをドキュメント更新
  firestore.updateDocument("TEST/voKMytSenYR9ZWYoCeWr", data);
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725039/de3c8391-a801-1c96-063f-8a361b53ddad.png)

###書き込み（更新）：ドキュメント内の特定フィールド更新

```javascript:.gs
function myFunction(){
  // CloudFirestoreの認証
  var dateArray = firestoreDate();
  var firestore = FirestoreApp.getFirestore(dateArray.email, dateArray.key, dateArray.projectId);  
  // 追加するデータ
  const data = {
    "test01": "test111"
  }
  // CloudFirestoreをフィールド更新
  firestore.updateDocument("TEST/voKMytSenYR9ZWYoCeWr", data, true);
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725039/a65570cc-2ef8-7e6e-9fde-7c13f81a2bf0.png)

###ドキュメント追加

```javascript:.gs
function myFunction(){
  // CloudFirestoreの認証
  var dateArray = firestoreDate();
  var firestore = FirestoreApp.getFirestore(dateArray.email, dateArray.key, dateArray.projectId);
  // 追加するデータ
  const data = {
    "test03": "test003",
    "test04": "test004"
  }
  // CloudFirestoreをドキュメント追加
  firestore.createDocument("TEST", data);
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725039/0e17c250-9afd-477d-c7fe-85dda08fa76f.png)