Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将Firestore数据同步到google工作表_Javascript_Firebase_Google Cloud Firestore_Google Cloud Functions_Google Sheets Api - Fatal编程技术网

Javascript 将Firestore数据同步到google工作表

Javascript 将Firestore数据同步到google工作表,javascript,firebase,google-cloud-firestore,google-cloud-functions,google-sheets-api,Javascript,Firebase,Google Cloud Firestore,Google Cloud Functions,Google Sheets Api,我正在尝试将数据从Firestore同步到我的google工作表 我已经创建了一个serviceAccount并将凭据保存在JSON文件中 functions文件夹成功部署,但函数执行时出错 下面是我的index.js var functions = require('firebase-functions') var admin = require('firebase-admin') var { google } = require('googleapis') var sheets = goog

我正在尝试将数据从Firestore同步到我的google工作表

我已经创建了一个serviceAccount并将凭据保存在JSON文件中

functions文件夹成功部署,但函数执行时出错

下面是我的index.js

var functions = require('firebase-functions')
var admin = require('firebase-admin')
var { google } = require('googleapis')
var sheets = google.sheets('v4')
admin.initializeApp()

var spreadsheetId = '...'
var serviceAccount = require('./serviceAccount.json')

var jwtClient = new google.auth.JWT({
  email: serviceAccount.client_email,
  keys: serviceAccount.private_key,
  scopes: ['https://www.googleapis.com/auth/spreadsheets'],
})

var jwtAuthPromise = jwtClient.authorize()

exports.testFunction = functions.firestore.document('/scores/{docID}').onCreate(async snap => {
  if (snap.exists) {
    var obj = JSON.parse(JSON.stringify(snap.data()))
    await jwtAuthPromise
    sheets.spreadsheets.values.append(
      {
        auth: jwtClient,
        spreadsheetId: spreadsheetId,
        range: 'new!A2',
        valueInputOption: 'RAW',
        requestBody: {
          values: [[obj['Player'], obj['Score']]],
        },
      },
      (err, result) => {
        if (err) {
          // Handle error
          console.log(err)
        } else {
          console.log('%d cells updated.', result.updatedCells)
        }
      },
    )
  }
})
当任何文档被添加到我的
scores
集合时,云函数就会触发,然后数据会被添加到我的google工作表中

当我手动更新Firestore时,这些是我的错误日志中的错误

testFunction Function execution took 2620 ms, finished with status: 'error'
testFunction Error: function crashed out of request scope Function invocation was interrupted.
testFunction
Error: No key or keyFile set. at GoogleToken.<anonymous> (/srv/node_modules/googleapis/node_modules/gtoken/build/src/index.js:115:23) at Generator.next (<anonymous>) at /srv/node_modules/googleapis/node_modules/gtoken/build/src/index.js:13:71 at new Promise (<anonymous>) at __awaiter (/srv/node_modules/googleapis/node_modules/gtoken/build/src/index.js:9:12) at GoogleToken.getTokenAsync (/srv/node_modules/googleapis/node_modules/gtoken/build/src/index.js:110:16) at GoogleToken.getToken (/srv/node_modules/googleapis/node_modules/gtoken/build/src/index.js:64:21) at JWT.<anonymous> (/srv/node_modules/googleapis/node_modules/google-auth-library/build/src/auth/jwtclient.js:144:40) at Generator.next (<anonymous>) at /srv/node_modules/googleapis/node_modules/google-auth-library/build/src/auth/jwtclient.js:22:71
testFunction
Error: No key or keyFile set.
    at GoogleToken.<anonymous> (/srv/node_modules/googleapis/node_modules/gtoken/build/src/index.js:115:23)
    at Generator.next (<anonymous>)
    at /srv/node_modules/googleapis/node_modules/gtoken/build/src/index.js:13:71
    at new Promise (<anonymous>)
    at __awaiter (/srv/node_modules/googleapis/node_modules/gtoken/build/src/index.js:9:12)
    at GoogleToken.getTokenAsync (/srv/node_modules/googleapis/node_modules/gtoken/build/src/index.js:110:16)
    at GoogleToken.getToken (/srv/node_modules/googleapis/node_modules/gtoken/build/src/index.js:64:21)
    at JWT.<anonymous> (/srv/node_modules/googleapis/node_modules/google-auth-library/build/src/auth/jwtclient.js:144:40)
    at Generator.next (<anonymous>)
    at /srv/node_modules/googleapis/node_modules/google-auth-library/build/src/auth/jwtclient.js:22:71
testFunction Unhandled rejection
testFunction
Billing account not configured. External network is not accessible and quotas are severely limited. Configure billing account to remove these restrictions
testFunction
Function execution started
testFunction函数执行耗时2620毫秒,完成状态为:“错误”
testFunction错误:函数在请求范围外崩溃,函数调用被中断。
测试函数
错误:未设置密钥或密钥文件。谷歌代币。(/srv/node_modules/googleapis/node_modules/gtoken/build/src/index.js:115:23)在Generator.next()在/srv/node_modules/googleapis/node_modules/gtoken/build/src/index.js:13:71在GoogleToken.gettoken.gettoken的新承诺()在等待者(/srv/node_modules/googleapis/node_modules/gtoken/build/src/index.js:9:12)(/srv/node_modules/googleapis/node_modules/gtoken/build/src/index.js:110:16)在GoogleToken.getToken(/srv/node_modules/googleapis/node_modules/gtoken/build/src/index.js:64:21)在Generator.next(/srv/node_modules/googleapis/node_modules/google auth library/build/src/jwtclient.js:144:40)在/srv/node_modules/googleapis/node_modules/google auth library/build/src/auth/jwtclient.js:22:71
测试函数
错误:未设置密钥或密钥文件。
在谷歌代币上。(/srv/node_modules/googleapis/node_modules/gtoken/build/src/index.js:115:23)
在Generator.next()处
at/srv/node_modules/googleapis/node_modules/gtoken/build/src/index.js:13:71
在新的承诺()
at_uuwaiter(/srv/node_modules/googleapis/node_modules/gtoken/build/src/index.js:9:12)
在GoogleToken.getTokenAsync(/srv/node_modules/googleapis/node_modules/gtoken/build/src/index.js:110:16)
在GoogleToken.getToken(/srv/node_modules/googleapis/node_modules/gtoken/build/src/index.js:64:21)
在JWT。(/srv/node_modules/googleapis/node_modules/google auth library/build/src/auth/jwtclient.js:144:40)
在Generator.next()处
在/srv/node_modules/googleapis/node_modules/google auth library/build/src/auth/jwtclient.js:22:71
testFunction未处理拒绝
测试函数
未配置计费帐户。无法访问外部网络,并且配额受到严重限制。请配置计费帐户以删除这些限制
测试函数
函数执行已开始

通过创建使用Json文件并在需要时返回授权的承诺,我已经获得了与Google Sheets集成的函数。这是我使用的方法的精简版本,但您可以根据需要调整它:

// Helper to get authorization
// (You may need to add the Drive scope 
// if you want to add additional users permission to edit the file)
var clientPromise = new Promise((resolve, reject) => {
    const client = new google.auth.JWT({
            keyFile: 'my_key_file.json',
            scopes: ['https://www.googleapis.com/auth/spreadsheets', 
                    'https://www.googleapis.com/auth/drive'],
        });

        resolve(client);
});

exports.myFunction = functions.firestore
.document('myCollection/{addedDoc}')
.onCreate((snap, context) => {
    // do something with the new document
    // ...
    return new Promise((resolve, reject) => {
        // You may not need this part but you can use a new promise here if you need it.
        console.log(snap);
        resolve(true);

    }).then(result => {
        return clientPromise;

    }).then(auth => {
        sheets = google.sheets({
            version: 'v4',
            auth: auth,
        });

        // do something with the sheets variable
        // ...
    });
});

干杯,我等会儿再给你