Help us understand the problem. What is going on with this article?

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

やりたいこと

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から利用する場合には、これらはなくても動いた。
その理由については以下が詳しい。

https://dev.to/seizans/gcp-api--429k

ADCを得るロジックで、3番目に

GAE (Google App Engine) 上で実行されていれば、その built-in service account を使う

とあり、Cloud Functionsは、裏の実行環境としてはGAEなのだろう、そのサービスアカウントを
スプレッドシート側で共有に設定していれば認証は通る模様。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away