0

I want to fetch shared google spreadsheet in a firebase web based project. I have used firebase functions for this.First i am getting the token by using google.auth.JWT and then trying to read spread sheet.Partially i am following How to use Google sheets API while inside a google cloud function. The functions code is following

exports.getNotes =functions.https.onRequest( (req, res) => {
  var jwt = getJwt();
  var apiKey = getApiKey();
  var spreadsheetId = '<spreadsheet Id/>';
  var range = 'Notes!A1:E1';
  appendSheetRow(jwt, apiKey, spreadsheetId, range)
  .then((result) => {
        //console.log(result);
      res.status(200).send(result);
    })
    .catch((err) => {
        //console.log('error');
      res.status(500).send({ err });
    });

});

function getJwt() {
    var credentials = require("./credentials.json");
    var client =  new google.auth.JWT(
        credentials.client_email, null, credentials.private_key,
        ['https://www.googleapis.com/auth/spreadsheets','https://www.googleapis.com/auth/spreadsheets.readonly']
    );
    return new Promise((resolve, reject) => {
        client.authorize((err, tokens) => {
            if (err) {
                reject(err);
            } else {
                console.log(tokens);
                // google.options({
                //     auth: client
                // });
                resolve(tokens);
            }
        });
    });
}

function getApiKey() {
  var apiKeyFile = require("./api_key.json");
  return apiKeyFile.key;

}

function appendSheetRow(jwt, apiKey, spreadsheetId, range, row) {
  const sheets = google.sheets({version: 'v4'});
    return new Promise((resolve, reject)=>{
        console.log(spreadsheetId, range, jwt, apiKey);
        sheets.spreadsheets.values.get({
            spreadsheetId: spreadsheetId,
            range: range,
            auth: jwt,
            key: apiKey,
        },function(err, result){
            if(err){
                console.log(err);
                return err;
            }else{
                console.log(result);
                resolve(result.data.values);
                //return result;
            }
        });


  });
}

The firebase log result of code is

2018-12-28T05:47:43.993155161Z D getNotes: Function execution started
2018-12-28T05:47:44.001Z I getNotes: hello
2018-12-28T05:47:44.087Z I getNotes: <spread sheetID/> Notes!A1:E1 Promise { 
 <pending> } <Key/>
2018-12-28T05:47:44.093Z I getNotes: TypeError: authClient.request is not a function
at /user_code/node_modules/googleapis/node_modules/googleapis-common/build/src/apirequest.js:225:31
at next (native)
at /user_code/node_modules/googleapis/node_modules/googleapis-common/build/src/apirequest.js:19:71
at __awaiter (/user_code/node_modules/googleapis/node_modules/googleapis-common/build/src/apirequest.js:15:12)
at createAPIRequestAsync (/user_code/node_modules/googleapis/node_modules/googleapis-common/build/src/apirequest.js:57:12)
at Object.createAPIRequest (/user_code/node_modules/googleapis/node_modules/googleapis-common/build/src/apirequest.js:49:9)
at Resource$Spreadsheets$Values.get (/user_code/node_modules/googleapis/build/src/apis/sheets/v4.js:566:37)
at Promise (/user_code/index.js:265:32)
at appendSheetRow (/user_code/index.js:263:10)
at exports.getNotes.functions.https.onRequest (/user_code/index.js:222:3)
2018-12-28T05:47:44.124Z I getNotes: { access_token: '<my token/>',
 token_type: 'Bearer',
 expiry_date: 1545979664000,
 id_token: undefined,
 refresh_token: 'jwt-placeholder' }

2 Answers 2

0

Its a very silly mistake I made on my side, Issue is because of wrong resolve like below

resolve(tokens)

but correct resolve looks like below

resolve(client)

Correct code snippet

 return new Promise((resolve, reject) => {
    client.authorize((err, tokens) => {
        if (err) {
            reject(err);
        } else {
            // Notice here
            resolve(client);
        }
    });
});
Sign up to request clarification or add additional context in comments.

Comments

0

Had a similar issue with TypeError: authClient.request is not a function and changing the resolve to the client fixed it for me.

googleClient.authorize(async (err, tokens) => {
  if (err) {
    return res.badRequest({ success: false, error: err });
  } else {

    // Search for the sheet
    // with auth (auth must be the auth client, not `tokens`)
    let gsapi = google.sheets({
      version: 'v4',
      auth: googleClient
    });

    gsapi.spreadsheets.values.get(criteria, (err, res) => { ... })
  }
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.