I'm trying to write to a Sheet document from a Node.js application which responds to a webhook. I'm stuck on the authentication part. I have the following code:
'use strict';
var fs = require('fs');
var readline = require('readline');
var google = require('googleapis');
var googleAuth = require('google-auth-library');
var request = require('request');
var moment = require('moment');
var mz = require('moment-timezone');
var unirest = require('unirest');
var onfleetWorkersUrl = "https://onfleet.com/api/v2/workers/";
var sheetsApiKey = 'MY_API_KEY';
function handleGET (req, res) {
// Do something with the GET request
res.send(req.query.check);
}
function handlePUT (req, res) {
// Do something with the PUT request
res.status(403).send('Forbidden!');
}
function appendNameApiKey(name) {
var sheets = google.sheets('v4');
sheets.spreadsheets.values.append({
auth: sheetsApiKey,
spreadsheetId: MY_SPREADHSEET_ID,
range: 'Sheet1!A:A',
body: {
"values": [
[
name
]
]
},
}, function(err, response) {
if (err) {
console.log('append request returned an error: ' + err);
return;
} else {
console.log(response);
}
});
}
function handleNewTaskPOST (req, res) {
unirest.get(onfleetWorkersUrl+req.body.workerId)
.auth(apiKey, "")
.end(function (response) {
var driverName = response.body.name;
var triggerId = req.body.triggerId;
var timeMilli = req.body.time;
var driverName = response.body.name;
var formattedTime = mz.tz(timeMilli, "America/Los_Angeles").format('h:mm a');
switch (triggerId) {
case 5:
console.log('triggerId: 5');
appendNameApiKey(driverName)
res.status(200).end();
break;
default:
console.log('Something went wrong.');
break;
}
});
}
/**
* Responds to a GET request with "Hello World!". Forbids a PUT request.
*
* @example
* gcloud alpha functions call helloHttp
*
* @param {Object} req Cloud Function request context.
* @param {Object} res Cloud Function response context.
*/
exports.eat24TimesheetCF = function eat24TimesheetCF (req, res) {
switch (req.method) {
case 'GET':
handleGET(req, res);
break;
case 'PUT':
handlePUT(req, res);
break;
case 'POST':
handleNewTaskPOST(req, res);
break;
default:
res.status(500).send({ error: 'Something blew up!' });
break;
}
};
This unfortunately returns an error which states that I haven't provided a valid key. Can someone give me some pointers as to how I can authenticate Sheet API request through Node.js using an API key?
Not for the API key but for the service account key this solution seems to work (at least for sheets):
const { google } = require('googleapis'); // my fix
let privatekey = require("./privatekey.json");
// configure a JWT auth client
let jwtClient = new google.auth.JWT(
privatekey.client_email,
null,
privatekey.private_key,
['https://www.googleapis.com/auth/spreadsheets',
'https://www.googleapis.com/auth/drive',
'https://www.googleapis.com/auth/calendar']
);
//authenticate request
jwtClient.authorize(function (err, tokens) {
if (err) {
Console.log(err);
return;
} else {
console.log("Successfully connected!");
}
});
//Google Sheets API
let spreadsheetId = '1Dua_kwZjCZx1pBp_6umDVQYy_t2MT5KfmPf6u7kakcA';
let sheetName = 'Top Rated TV Shows!A5:B10'
let sheets = google.sheets('v4');
sheets.spreadsheets.values.get({
auth: jwtClient,
spreadsheetId: spreadsheetId,
range: sheetName
}, function (err, response) {
if (err) {
console.log('The API returned an error: ' + err);
} else {
console.log('Movie list from Google Sheets:');
for (let row of response.data.values) {
console.log('Title [%s]\t\tRating [%s]', row[0], row[1]);
}
}
});
Source: https://isd-soft.com/tech_blog/accessing-google-apis-using-service-account-node-js/
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With