Google Apps ScriptからFirebase Realtime Databaseにアクセス (Secret key不要)


[Authenticate via OAuth 2 access token](https://sites.google.com/site/scriptsexamples/new-connectors-to-google-services/firebase/tutorials/authenticate-via-oauth-2-access-token
)という公式チュートリアルを参考に、導入からデータベース書き込みまでを行います。

# Google Apps ScriptにFirebaseのライブラリを追加する
FirebaseにアクセスしたいGoogle Apps Scriptを開きます。
「リソース」->「ライブラリ...」といきます。

<img width="500" alt="スクリーンショット 2018-10-17 23.45.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/242744/02c56ee2-2753-3ebc-bdb5-d9c06ffd1dbb.png">

図書館(？)というウィンドウが出てくるので、

**MYeP8ZEEt1ylVDxS7uyg9plDOcoke7-2l**

というキーを入れてあげて、ライブラリ追加します。バージョンの選択は最新のものにしてください(2018年10月現在、バージョン29)。

<img width="813" alt="スクリーンショット 2018-10-17 23.46.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/242744/e3bc2102-480b-ef60-fcab-4ea1403f230a.png">

最後に保存を押して確定させます。

# マニフェストファイルにスコープを追加する
「表示」->「マニフェストファイルを表示」といきます。
横のタブにappscript.jsonが出てくるので、このファイルの最後に

```
"oauthScopes":["https://www.googleapis.com/auth/userinfo.email","https://www.googleapis.com/auth/firebase.database","https://www.googleapis.com/auth/script.external_request"]
```
を追加します。これでFirebaseの認証や書き込みが可能な状態となります。

<img width="1440" alt="スクリーンショット 2018-10-17 17.55.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/242744/ef891dc6-7690-4426-42d7-9b9e3c19ca05.png">


# コードの認証&実行
メインのコードに戻って、

```js
function updateData() {
  var token = ScriptApp.getOAuthToken();
  var fb = FirebaseApp.getDatabaseByUrl("https://my_db.firebaseio.com/", token);
  fb.setData("testPath/hoge", "huga");
}
```
のような関数を用意します。
my_db....の部分は、アクセスしたいデータベースのものに置き換えてください。基本的に以下のようなURLになると思います

```
https://プロジェクトID.firebadeio.com/
```

(テスト用のデータベースで試してください。大事なデータに上書きしないようにご注意！！)

上で用意した関数を実行すると、以下のようなウィンドウがでます。

<img width="447" alt="スクリーンショット 2018-10-18 0.09.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/242744/214a2eaa-42b3-bf9c-8813-1487a6f3c8c2.png">

ここはパーミッションが要求されてるので、**データベースの書き込み権限があるアカウント**で認証してあげてください。(書き込み権限については次節)

認証ができると、コードが実行できるようになります。
コードの実行後にFirebaseのRealtime Databに書き込みができていれば成功です！

<img width="256" alt="スクリーンショット 2018-10-18 0.13.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/242744/8f5357f4-1f0a-9a12-2af6-96d158e55853.png">


以上で、Google Apps ScriptからFirebase Databaseにアクセスできるようになりました。

# 参考:データベースの権限を確認する
<img width="981" alt="スクリーンショット 2018-10-17 21.49.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/242744/2b056cd3-cd83-cb47-f654-ace6db7b1a93.png">

プロジェクトの横の歯車から「ユーザーと権限」に飛びます。
「編集者」あるいは「オーナー」の権限がついているアカウントで前節のGoogle Apps Acount実行の認証を行います。

編集権限がないアカウントで実行しても書き込みできません。その場合は[別の方法](https://sites.google.com/site/scriptsexamples/new-connectors-to-google-services/firebase/tutorials/authenticate-with-a-service-account)ならできるらしいのですが、割愛。


#参考: Secret keyを用いた方法
Google Apps ScriptからFirebaseに書き込むためには、Secret Keyを用いて認証する方法もあります。
ただこの方法はSecret Keyをコードに直書きする必要があり、*deprecated*のようです。

[参考]
https://qiita.com/BearsSoft/items/728da4636203421292ee
https://qiita.com/maeda_88/items/9ff25772f1c910df6c06




#公式リファレンス
ライブラリの追加について
https://sites.google.com/site/scriptsexamples/new-connectors-to-google-services/firebase

メソッド等のリファレンス
https://sites.google.com/site/scriptsexamples/new-connectors-to-google-services/firebase/reference

# さいごに
シークレットキーを直書きすることなくFirebaseへのアクセスができるようになりました。

別にCloud Functions使えばいいじゃんという意見が聞こえてきそうですが、index.jsが肥大化しそうなので今回はあえてGoogle Apps ScriptにてDatabaseへの書き込みというのをやってみました。
Google Apps Scriptは実行時刻の設定も楽ですし。


一方で、**Cloud Firestore**への書き込み方法はまだ不明です。誰か教えてくり〜