やりたいこと
Firestoreの特定コレクションにドキュメントが追加されたら
その内容をスプレッドシートに書き込みたい。
手順
書き込むスプレッドシートに、GAEのサービスアカウントが書き込めるようにする
Firebaseコンソールの「設定」→「サービスアカウント」から
「サービスアカウント権限の管理」リンクから、GCPの「IAMと管理」に飛び
名前が「App Engine default service account」となっている
<プロジェクトID>@appspot.gserviceaccount.com
をメモしておく。
書き込みたい対象のスプレッドシートの「共有」メニューで
上記GAEのデフォルトサービスアカウントに権限を付与する。
Google Sheets APIを有効にする
GCPのコンソールから「APIとサービス」→「ライブラリ」を開き
「Google Sheets API」を検索し、有効にする
googleapis ライブラリを追加する
$ npm install googleapis
functionを実装して、デプロイする
const functions = require('firebase-functions')
const {google} = require('googleapis');
exports.appendSpreadSheet = functions.region(functions.config().region.name).firestore.document('test/{testId}').onCreate((snap, context) => {
const test = snap.data();
return google.auth.getClient({
scopes: ['https://www.googleapis.com/auth/spreadsheets']
})
.then(auth => {
const sheets = google.sheets('v4');
return sheets.spreadsheets.values.append({
auth,
spreadsheetId: "*************", // 書き込みたいスプレッドシートのID
range: "****", //書き込み先のシート名やセル範囲
valueInputOption: "RAW",
insertDataOption: "INSERT_ROWS",
resource: {
values: [
[
context.params.testId, //ドキュメントID
test.foo //ドキュメントの任意の属性を必要なだけ入れる
]
]
}
});
})
})
これで、 test
コレクションに ドキュメントを追加すると、スプレッドシートに書き込める。
補足
意外とこの方法がネット上で載ってなく
Googleのドキュメントでも OAuth2使った少々煩雑なサンプルしかなく
サービスアカウント使えばもっとシンプルに実装できるはずだよなぁ、と実験していてたどりついたのがこの方法。
なお、auth
に 認証情報のjsonを渡している例や、環境変数 GOOGLE_APPLICATION_CREDENTIALS
を利用する例もあったが、
Cloud Functionsから利用する場合には、これらはなくても動いた。
その理由については以下が詳しい。
ADCを得るロジックで、3番目に
GAE (Google App Engine) 上で実行されていれば、その built-in service account を使う
とあり、Cloud Functionsは、裏の実行環境としてはGAEなのだろう、そのサービスアカウントを
スプレッドシート側で共有に設定していれば認証は通る模様。