LoginSignup
52
32

More than 3 years have passed since last update.

Cloud Functions for Firebaseでスプレッドシートに書き込む

Posted at

やりたいこと

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なのだろう、そのサービスアカウントを
スプレッドシート側で共有に設定していれば認証は通る模様。

52
32
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
52
32