diff --git a/packages/nodes-base/credentials/GoogleCalendarOAuth2Api.credentials.ts b/packages/nodes-base/credentials/GoogleCalendarOAuth2Api.credentials.ts
new file mode 100644
index 0000000000..e61680011f
--- /dev/null
+++ b/packages/nodes-base/credentials/GoogleCalendarOAuth2Api.credentials.ts
@@ -0,0 +1,25 @@
+import {
+	ICredentialType,
+	NodePropertyTypes,
+} from 'n8n-workflow';
+
+const scopes = [
+	'https://www.googleapis.com/auth/calendar',
+	'https://www.googleapis.com/auth/calendar.events',
+];
+
+export class GoogleOAuth2Api implements ICredentialType {
+	name = 'googleOAuth2Api';
+	extends = [
+		'oAuth2Api',
+	];
+	displayName = 'Google OAuth2 API';
+	properties = [
+		{
+			displayName: 'Scope',
+			name: 'scope',
+			type: 'hidden' as NodePropertyTypes,
+			default: scopes.join(' '),
+		},
+	];
+}
diff --git a/packages/nodes-base/credentials/GoogleOAuth2Api.credentials.ts b/packages/nodes-base/credentials/GoogleOAuth2Api.credentials.ts
index facd5e8fac..8f658517b9 100644
--- a/packages/nodes-base/credentials/GoogleOAuth2Api.credentials.ts
+++ b/packages/nodes-base/credentials/GoogleOAuth2Api.credentials.ts
@@ -3,11 +3,6 @@ import {
 	NodePropertyTypes,
 } from 'n8n-workflow';
 
-const scopes = [
-	'https://www.googleapis.com/auth/calendar',
-	'https://www.googleapis.com/auth/calendar.events',
-];
-
 export class GoogleOAuth2Api implements ICredentialType {
 	name = 'googleOAuth2Api';
 	extends = [
@@ -27,12 +22,6 @@ export class GoogleOAuth2Api implements ICredentialType {
 			type: 'hidden' as NodePropertyTypes,
 			default: 'https://oauth2.googleapis.com/token',
 		},
-		{
-			displayName: 'Scope',
-			name: 'scope',
-			type: 'hidden' as NodePropertyTypes,
-			default: scopes.join(' '),
-		},
 		{
 			displayName: 'Auth URI Query Parameters',
 			name: 'authQueryParameters',
diff --git a/packages/nodes-base/credentials/GoogleSheetsOAuth2Api.credentials.ts b/packages/nodes-base/credentials/GoogleSheetsOAuth2Api.credentials.ts
new file mode 100644
index 0000000000..081540368a
--- /dev/null
+++ b/packages/nodes-base/credentials/GoogleSheetsOAuth2Api.credentials.ts
@@ -0,0 +1,26 @@
+import {
+	ICredentialType,
+	NodePropertyTypes,
+} from 'n8n-workflow';
+
+const scopes = [
+	'https://www.googleapis.com/auth/drive',
+	'https://www.googleapis.com/auth/drive.file',
+	'https://www.googleapis.com/auth/spreadsheets',
+];
+
+export class GoogleSheetsOAuth2Api implements ICredentialType {
+	name = 'googleSheetsOAuth2Api';
+	extends = [
+		'googleOAuth2Api',
+	];
+	displayName = 'Google OAuth2 API';
+	properties = [
+		{
+			displayName: 'Scope',
+			name: 'scope',
+			type: 'hidden' as NodePropertyTypes,
+			default: scopes.join(' '),
+		},
+	];
+}
diff --git a/packages/nodes-base/nodes/Github/GenericFunctions.ts b/packages/nodes-base/nodes/Github/GenericFunctions.ts
index f6c5d076c6..688c3e499e 100644
--- a/packages/nodes-base/nodes/Github/GenericFunctions.ts
+++ b/packages/nodes-base/nodes/Github/GenericFunctions.ts
@@ -50,7 +50,7 @@ export async function githubApiRequest(this: IHookFunctions | IExecuteFunctions,
 
 			const baseUrl = credentials!.server || 'https://api.github.com';
 			options.uri = `${baseUrl}${endpoint}`;
-
+			//@ts-ignore
 			return await this.helpers.requestOAuth.call(this, 'githubOAuth2Api', options);
 		}
 	} catch (error) {
diff --git a/packages/nodes-base/nodes/Google/EventDescription.ts b/packages/nodes-base/nodes/Google/Calendar/EventDescription.ts
similarity index 100%
rename from packages/nodes-base/nodes/Google/EventDescription.ts
rename to packages/nodes-base/nodes/Google/Calendar/EventDescription.ts
diff --git a/packages/nodes-base/nodes/Google/EventInterface.ts b/packages/nodes-base/nodes/Google/Calendar/EventInterface.ts
similarity index 100%
rename from packages/nodes-base/nodes/Google/EventInterface.ts
rename to packages/nodes-base/nodes/Google/Calendar/EventInterface.ts
diff --git a/packages/nodes-base/nodes/Google/GenericFunctions.ts b/packages/nodes-base/nodes/Google/Calendar/GenericFunctions.ts
similarity index 91%
rename from packages/nodes-base/nodes/Google/GenericFunctions.ts
rename to packages/nodes-base/nodes/Google/Calendar/GenericFunctions.ts
index 80edb44370..b772a47d0c 100644
--- a/packages/nodes-base/nodes/Google/GenericFunctions.ts
+++ b/packages/nodes-base/nodes/Google/Calendar/GenericFunctions.ts
@@ -1,11 +1,15 @@
-import { OptionsWithUri } from 'request';
+import {
+	OptionsWithUri,
+ } from 'request';
+
 import {
 	IExecuteFunctions,
 	IExecuteSingleFunctions,
 	ILoadOptionsFunctions,
 } from 'n8n-core';
+
 import {
-	IDataObject
+	IDataObject,
 } from 'n8n-workflow';
 
 export async function googleApiRequest(this: IExecuteFunctions | IExecuteSingleFunctions | ILoadOptionsFunctions, method: string, resource: string, body: any = {}, qs: IDataObject = {}, uri?: string, headers: IDataObject = {}): Promise<any> { // tslint:disable-line:no-any
@@ -27,7 +31,7 @@ export async function googleApiRequest(this: IExecuteFunctions | IExecuteSingleF
 			delete options.body;
 		}
 		//@ts-ignore
-		return await this.helpers.requestOAuth.call(this, 'googleOAuth2Api', options);
+		return await this.helpers.requestOAuth.call(this, 'googleCalendarOAuth2Api', options);
 	} catch (error) {
 		if (error.response && error.response.body && error.response.body.message) {
 			// Try to return the error prettier
diff --git a/packages/nodes-base/nodes/Google/GoogleCalendar.node.ts b/packages/nodes-base/nodes/Google/Calendar/GoogleCalendar.node.ts
similarity index 99%
rename from packages/nodes-base/nodes/Google/GoogleCalendar.node.ts
rename to packages/nodes-base/nodes/Google/Calendar/GoogleCalendar.node.ts
index c7eb35794e..1f185935d7 100644
--- a/packages/nodes-base/nodes/Google/GoogleCalendar.node.ts
+++ b/packages/nodes-base/nodes/Google/Calendar/GoogleCalendar.node.ts
@@ -44,7 +44,7 @@ export class GoogleCalendar implements INodeType {
 		outputs: ['main'],
 		credentials: [
 			{
-				name: 'googleOAuth2Api',
+				name: 'googleCalendarOAuth2Api',
 				required: true,
 			},
 		],
diff --git a/packages/nodes-base/nodes/Google/googleCalendar.png b/packages/nodes-base/nodes/Google/Calendar/googleCalendar.png
similarity index 100%
rename from packages/nodes-base/nodes/Google/googleCalendar.png
rename to packages/nodes-base/nodes/Google/Calendar/googleCalendar.png
diff --git a/packages/nodes-base/nodes/Google/GoogleDrive.node.ts b/packages/nodes-base/nodes/Google/Drive/GoogleDrive.node.ts
similarity index 99%
rename from packages/nodes-base/nodes/Google/GoogleDrive.node.ts
rename to packages/nodes-base/nodes/Google/Drive/GoogleDrive.node.ts
index 4adfbd239b..387a3d7bc0 100644
--- a/packages/nodes-base/nodes/Google/GoogleDrive.node.ts
+++ b/packages/nodes-base/nodes/Google/Drive/GoogleDrive.node.ts
@@ -12,7 +12,7 @@ import {
 	INodeType,
 } from 'n8n-workflow';
 
-import { getAuthenticationClient } from './GoogleApi';
+import { getAuthenticationClient } from '../GoogleApi';
 
 
 export class GoogleDrive implements INodeType {
diff --git a/packages/nodes-base/nodes/Google/GoogleDriveTrigger.node.ts b/packages/nodes-base/nodes/Google/Drive/GoogleDriveTrigger.node.ts
similarity index 100%
rename from packages/nodes-base/nodes/Google/GoogleDriveTrigger.node.ts
rename to packages/nodes-base/nodes/Google/Drive/GoogleDriveTrigger.node.ts
diff --git a/packages/nodes-base/nodes/Google/googleDrive.png b/packages/nodes-base/nodes/Google/Drive/googleDrive.png
similarity index 100%
rename from packages/nodes-base/nodes/Google/googleDrive.png
rename to packages/nodes-base/nodes/Google/Drive/googleDrive.png
diff --git a/packages/nodes-base/nodes/Google/Sheet/GenericFunctions.ts b/packages/nodes-base/nodes/Google/Sheet/GenericFunctions.ts
new file mode 100644
index 0000000000..e492d59547
--- /dev/null
+++ b/packages/nodes-base/nodes/Google/Sheet/GenericFunctions.ts
@@ -0,0 +1,129 @@
+import {
+	OptionsWithUri,
+ } from 'request';
+
+import {
+	IExecuteFunctions,
+	IExecuteSingleFunctions,
+	ILoadOptionsFunctions,
+} from 'n8n-core';
+
+import {
+	IDataObject,
+} from 'n8n-workflow';
+
+import * as moment from 'moment-timezone';
+
+import * as jwt from 'jsonwebtoken';
+
+export async function googleApiRequest(this: IExecuteFunctions | IExecuteSingleFunctions | ILoadOptionsFunctions, method: string, resource: string, body: any = {}, qs: IDataObject = {}, uri?: string, headers: IDataObject = {}): Promise<any> { // tslint:disable-line:no-any
+	const authenticationMethod = this.getNodeParameter('authentication', 0, 'serviceAccount') as string;
+	const options: OptionsWithUri = {
+		headers: {
+			'Content-Type': 'application/json',
+		},
+		method,
+		body,
+		qs,
+		uri: uri || `https://sheets.googleapis.com${resource}`,
+		json: true
+	};
+	try {
+		if (Object.keys(headers).length !== 0) {
+			options.headers = Object.assign({}, options.headers, headers);
+		}
+		if (Object.keys(body).length === 0) {
+			delete options.body;
+		}
+
+		if (authenticationMethod === 'serviceAccount') {
+			const credentials = this.getCredentials('googleApi');
+
+			if (credentials === undefined) {
+				throw new Error('No credentials got returned!');
+			}
+
+			const { access_token } = await getAccessToken.call(this, credentials as IDataObject);
+
+			options.headers!.Authorization = `Bearer ${access_token}`;
+			//@ts-ignore
+			return await this.helpers.request(options);
+		} else {
+			//@ts-ignore
+			return await this.helpers.requestOAuth.call(this, 'googleSheetsOAuth2Api', options);
+		}
+	} catch (error) {
+		if (error.response && error.response.body && error.response.body.message) {
+			// Try to return the error prettier
+			throw new Error(`Google Sheet error response [${error.statusCode}]: ${error.response.body.message}`);
+		}
+		throw error;
+	}
+}
+
+export async function googleApiRequestAllItems(this: IExecuteFunctions | ILoadOptionsFunctions, propertyName: string ,method: string, endpoint: string, body: any = {}, query: IDataObject = {}): Promise<any> { // tslint:disable-line:no-any
+
+	const returnData: IDataObject[] = [];
+
+	let responseData;
+	query.maxResults = 100;
+
+	do {
+		responseData = await googleApiRequest.call(this, method, endpoint, body, query);
+		query.pageToken = responseData['nextPageToken'];
+		returnData.push.apply(returnData, responseData[propertyName]);
+	} while (
+		responseData['nextPageToken'] !== undefined &&
+		responseData['nextPageToken'] !== ''
+	);
+
+	return returnData;
+}
+
+function getAccessToken(this: IExecuteFunctions | IExecuteSingleFunctions | ILoadOptionsFunctions, credentials: IDataObject) : Promise<IDataObject> {
+	//https://developers.google.com/identity/protocols/oauth2/service-account#httprest
+
+	const scopes = [
+		'https://www.googleapis.com/auth/drive',
+		'https://www.googleapis.com/auth/drive.file',
+		'https://www.googleapis.com/auth/spreadsheets',
+	];
+
+	const now = moment().unix();
+
+	const signature = jwt.sign(
+		{
+		  'iss': credentials.email as string,
+		  'sub': credentials.email as string,
+		  'scope': scopes.join(' '),
+		  'aud': `https://oauth2.googleapis.com/token`,
+		  'iat': now,
+		  'exp': now + 3600,
+		},
+		credentials.privateKey as string,
+		{
+		  algorithm: 'RS256',
+		  header: {
+			'kid': credentials.privateKey as string,
+			'typ': 'JWT',
+			'alg': 'RS256',
+		  },
+		}
+	  );
+
+	  const options: OptionsWithUri = {
+		headers: {
+			'Content-Type': 'application/x-www-form-urlencoded',
+		},
+		method: 'POST',
+		form: {
+			grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',
+			assertion: signature,
+		},
+		uri: 'https://oauth2.googleapis.com/token',
+		json: true
+	};
+
+	//@ts-ignore
+	return this.helpers.request(options);
+}
diff --git a/packages/nodes-base/nodes/Google/GoogleSheet.ts b/packages/nodes-base/nodes/Google/Sheet/GoogleSheet.ts
similarity index 80%
rename from packages/nodes-base/nodes/Google/GoogleSheet.ts
rename to packages/nodes-base/nodes/Google/Sheet/GoogleSheet.ts
index 2d31c884d2..0766a81f57 100644
--- a/packages/nodes-base/nodes/Google/GoogleSheet.ts
+++ b/packages/nodes-base/nodes/Google/Sheet/GoogleSheet.ts
@@ -1,14 +1,20 @@
-import { IDataObject } from 'n8n-workflow';
-import { google, sheets_v4 } from 'googleapis';
-import { JWT } from 'google-auth-library';
-import { getAuthenticationClient } from './GoogleApi';
+import {
+	IDataObject,
+} from 'n8n-workflow';
+
+import {
+	IExecuteFunctions,
+	ILoadOptionsFunctions,
+ } from 'n8n-core';
+
+import {
+	googleApiRequest,
+ } from './GenericFunctions';
 
 import {
 	utils as xlsxUtils,
 } from 'xlsx';
 
-const Sheets = google.sheets('v4'); // tslint:disable-line:variable-name
-
 export interface ISheetOptions {
 	scope: string[];
 }
@@ -46,18 +52,16 @@ export type ValueRenderOption = 'FORMATTED_VALUE' | 'FORMULA' | 'UNFORMATTED_VAL
 
 export class GoogleSheet {
 	id: string;
-	credentials: IGoogleAuthCredentials;
-	scopes: string[];
+	executeFunctions: IExecuteFunctions | ILoadOptionsFunctions;
 
-	constructor(spreadsheetId: string, credentials: IGoogleAuthCredentials, options?: ISheetOptions | undefined) {
+	constructor(spreadsheetId: string, executeFunctions: IExecuteFunctions | ILoadOptionsFunctions, options?: ISheetOptions | undefined) {
 		// options = <SheetOptions>options || {};
 		if (!options) {
 			options = {} as ISheetOptions;
 		}
 
+		this.executeFunctions = executeFunctions;
 		this.id = spreadsheetId;
-		this.credentials = credentials;
-		this.scopes = options.scope || ['https://www.googleapis.com/auth/spreadsheets'];
 	}
 
 
@@ -69,37 +73,29 @@ export class GoogleSheet {
 	 * @memberof GoogleSheet
 	 */
 	async clearData(range: string): Promise<object> {
-		const client = await this.getAuthenticationClient();
 
-		// @ts-ignore
-		const response = await Sheets.spreadsheets.values.clear(
-			{
-				auth: client,
-				spreadsheetId: this.id,
-				range,
-			}
-		);
+		const body = {
+			spreadsheetId: this.id,
+			range,
+		};
 
-		return response.data;
+		const response = await googleApiRequest.call(this.executeFunctions, 'POST', `/v4/spreadsheets/${this.id}/values/${range}:clear`, body);
+
+		return response;
 	}
 
     /**
      * Returns the cell values
      */
 	async getData(range: string, valueRenderMode: ValueRenderOption): Promise<string[][] | undefined> {
-		const client = await this.getAuthenticationClient();
 
-		// @ts-ignore
-		const response = await Sheets.spreadsheets.values.get(
-			{
-				auth: client,
-				spreadsheetId: this.id,
-				range,
-				valueRenderOption: valueRenderMode,
-			}
-		);
+		const query = {
+			valueRenderOption: valueRenderMode,
+		};
 
-		return response.data.values as string[][] | undefined;
+		const response = await googleApiRequest.call(this.executeFunctions, 'GET', `/v4/spreadsheets/${this.id}/values/${range}`, {}, query);
+
+		return response.values as string[][] | undefined;
 	}
 
 
@@ -107,39 +103,29 @@ export class GoogleSheet {
 	 * Returns the sheets in a Spreadsheet
 	 */
 	async spreadsheetGetSheets() {
-		const client = await this.getAuthenticationClient();
 
-		// @ts-ignore
-		const response = await Sheets.spreadsheets.get(
-			{
-				auth: client,
-				spreadsheetId: this.id,
-				fields: 'sheets.properties'
-			}
-		);
+		const query = {
+			fields: 'sheets.properties',
+		};
 
-		return response.data;
+		const response = await googleApiRequest.call(this.executeFunctions, 'GET', `/v4/spreadsheets/${this.id}`, {}, query);
+
+		return response;
 	}
 
 
 	/**
 	 * Sets values in one or more ranges of a spreadsheet.
 	 */
-	async spreadsheetBatchUpdate(requests: sheets_v4.Schema$Request[]) { // tslint:disable-line:no-any
-		const client = await this.getAuthenticationClient();
+	async spreadsheetBatchUpdate(requests: IDataObject[]) { // tslint:disable-line:no-any
 
-		// @ts-ignore
-		const response = await Sheets.spreadsheets.batchUpdate(
-			{
-				auth: client,
-				spreadsheetId: this.id,
-				requestBody: {
-					requests,
-				},
-			}
-		);
+		const body = {
+			requests
+		};
 
-		return response.data;
+		const response = await googleApiRequest.call(this.executeFunctions, 'POST', `/v4/spreadsheets/${this.id}:batchUpdate`, body);
+
+		return response;
 	}
 
 
@@ -147,21 +133,15 @@ export class GoogleSheet {
      * Sets the cell values
      */
 	async batchUpdate(updateData: ISheetUpdateData[], valueInputMode: ValueInputOption) {
-		const client = await this.getAuthenticationClient();
 
-		// @ts-ignore
-		const response = await Sheets.spreadsheets.values.batchUpdate(
-			{
-				auth: client,
-				spreadsheetId: this.id,
-				valueInputOption: valueInputMode,
-				resource: {
-					data: updateData,
-				},
-			}
-		);
+		const body = {
+			data: updateData,
+			valueInputOption: valueInputMode,
+		};
 
-		return response.data;
+		const response = await googleApiRequest.call(this.executeFunctions, 'POST', `/v4/spreadsheets/${this.id}/values:batchUpdate`, body);
+
+		return response;
 	}
 
 
@@ -169,23 +149,15 @@ export class GoogleSheet {
      * Sets the cell values
      */
 	async setData(range: string, data: string[][], valueInputMode: ValueInputOption) {
-		const client = await this.getAuthenticationClient();
 
-		// @ts-ignore
-		const response = await Sheets.spreadsheets.values.update(
-			{
-				// @ts-ignore
-				auth: client,
-				spreadsheetId: this.id,
-				range,
-				valueInputOption: valueInputMode,
-				resource: {
-					values: data
-				}
-			}
-		);
+		const body = {
+			valueInputOption: valueInputMode,
+			values: data,
+		};
 
-		return response.data;
+		const response = await googleApiRequest.call(this.executeFunctions, 'POST', `/v4/spreadsheets/${this.id}/values/${range}`, body);
+
+		return response;
 	}
 
 
@@ -193,33 +165,21 @@ export class GoogleSheet {
      * Appends the cell values
      */
 	async appendData(range: string, data: string[][], valueInputMode: ValueInputOption) {
-		const client = await this.getAuthenticationClient();
 
-		// @ts-ignore
-		const response = await Sheets.spreadsheets.values.append(
-			{
-				auth: client,
-				spreadsheetId: this.id,
-				range,
-				valueInputOption: valueInputMode,
-				resource: {
-					values: data
-				}
-			}
-		);
+		const body = {
+			range,
+			values: data,
+		};
 
-		return response.data;
+		const query = {
+			valueInputOption: valueInputMode,
+		};
+
+		const response = await googleApiRequest.call(this.executeFunctions, 'POST', `/v4/spreadsheets/${this.id}/values/${range}:append`, body, query);
+
+		return response;
 	}
 
-
-    /**
-     * Returns the authentication client needed to access spreadsheet
-     */
-	async getAuthenticationClient(): Promise<JWT> {
-		return getAuthenticationClient(this.credentials.email, this.credentials.privateKey, this.scopes);
-	}
-
-
     /**
      * Returns the given sheet data in a strucutred way
      */
@@ -505,5 +465,4 @@ export class GoogleSheet {
 
 		return setData;
 	}
-
 }
diff --git a/packages/nodes-base/nodes/Google/GoogleSheets.node.ts b/packages/nodes-base/nodes/Google/Sheet/GoogleSheets.node.ts
similarity index 95%
rename from packages/nodes-base/nodes/Google/GoogleSheets.node.ts
rename to packages/nodes-base/nodes/Google/Sheet/GoogleSheets.node.ts
index 71e76698de..b53062500e 100644
--- a/packages/nodes-base/nodes/Google/GoogleSheets.node.ts
+++ b/packages/nodes-base/nodes/Google/Sheet/GoogleSheets.node.ts
@@ -1,6 +1,8 @@
-import { sheets_v4 } from 'googleapis';
 
-import { IExecuteFunctions } from 'n8n-core';
+import {
+	IExecuteFunctions,
+ } from 'n8n-core';
+
 import {
 	IDataObject,
 	ILoadOptionsFunctions,
@@ -12,7 +14,6 @@ import {
 
 import {
 	GoogleSheet,
-	IGoogleAuthCredentials,
 	ILookupValues,
 	ISheetUpdateData,
 	IToDelete,
@@ -30,7 +31,7 @@ export class GoogleSheets implements INodeType {
 		description: 'Read, update and write data to Google Sheets',
 		defaults: {
 			name: 'Google Sheets',
-			color: '#995533',
+			color: '#0aa55c',
 		},
 		inputs: ['main'],
 		outputs: ['main'],
@@ -38,9 +39,43 @@ export class GoogleSheets implements INodeType {
 			{
 				name: 'googleApi',
 				required: true,
-			}
+				displayOptions: {
+					show: {
+						authentication: [
+							'serviceAccount',
+						],
+					},
+				},
+			},
+			{
+				name: 'googleSheetsOAuth2Api',
+				required: true,
+				displayOptions: {
+					show: {
+						authentication: [
+							'oauth2',
+						],
+					},
+				},
+			},
 		],
 		properties: [
+			{
+				displayName: 'Authentication',
+				name: 'authentication',
+				type: 'options',
+				options: [
+					{
+						name: 'Service Account',
+						value: 'serviceAccount',
+					},
+					{
+						name: 'OAuth2',
+						value: 'oauth2',
+					},
+				],
+				default: 'serviceAccount',
+			},
 			{
 				displayName: 'Operation',
 				name: 'operation',
@@ -541,18 +576,7 @@ export class GoogleSheets implements INodeType {
 			async getSheets(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]> {
 				const spreadsheetId = this.getCurrentNodeParameter('sheetId') as string;
 
-				const credentials = this.getCredentials('googleApi');
-
-				if (credentials === undefined) {
-					throw new Error('No credentials got returned!');
-				}
-
-				const googleCredentials = {
-					email: credentials.email,
-					privateKey: credentials.privateKey,
-				} as IGoogleAuthCredentials;
-
-				const sheet = new GoogleSheet(spreadsheetId, googleCredentials);
+				const sheet = new GoogleSheet(spreadsheetId, this);
 				const responseData = await sheet.spreadsheetGetSheets();
 
 				if (responseData === undefined) {
@@ -579,18 +603,8 @@ export class GoogleSheets implements INodeType {
 
 	async execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]> {
 		const spreadsheetId = this.getNodeParameter('sheetId', 0) as string;
-		const credentials = this.getCredentials('googleApi');
 
-		if (credentials === undefined) {
-			throw new Error('No credentials got returned!');
-		}
-
-		const googleCredentials = {
-			email: credentials.email,
-			privateKey: credentials.privateKey,
-		} as IGoogleAuthCredentials;
-
-		const sheet = new GoogleSheet(spreadsheetId, googleCredentials);
+		const sheet = new GoogleSheet(spreadsheetId, this);
 
 		const operation = this.getNodeParameter('operation', 0) as string;
 
@@ -638,7 +652,7 @@ export class GoogleSheets implements INodeType {
 			//         delete
 			// ----------------------------------
 
-			const requests: sheets_v4.Schema$Request[] = [];
+			const requests: IDataObject[] = [];
 
 			const toDelete = this.getNodeParameter('toDelete', 0) as IToDelete;
 
diff --git a/packages/nodes-base/nodes/Google/googlesheets.png b/packages/nodes-base/nodes/Google/Sheet/googlesheets.png
similarity index 100%
rename from packages/nodes-base/nodes/Google/googlesheets.png
rename to packages/nodes-base/nodes/Google/Sheet/googlesheets.png
diff --git a/packages/nodes-base/package.json b/packages/nodes-base/package.json
index 6ffe5a1e28..01bcd091cb 100644
--- a/packages/nodes-base/package.json
+++ b/packages/nodes-base/package.json
@@ -57,7 +57,9 @@
             "dist/credentials/GithubOAuth2Api.credentials.js",
             "dist/credentials/GitlabApi.credentials.js",
             "dist/credentials/GoogleApi.credentials.js",
+            "dist/credentials/GoogleCalendarOAuth2Api.credentials.js",
             "dist/credentials/GoogleOAuth2Api.credentials.js",
+            "dist/credentials/GoogleSheetsOAuth2Api.credentials.js",
             "dist/credentials/GumroadApi.credentials.js",
             "dist/credentials/HarvestApi.credentials.js",
             "dist/credentials/HelpScoutOAuth2Api.credentials.js",
@@ -180,9 +182,9 @@
             "dist/nodes/Github/GithubTrigger.node.js",
             "dist/nodes/Gitlab/Gitlab.node.js",
             "dist/nodes/Gitlab/GitlabTrigger.node.js",
-            "dist/nodes/Google/GoogleCalendar.node.js",
-            "dist/nodes/Google/GoogleDrive.node.js",
-            "dist/nodes/Google/GoogleSheets.node.js",
+            "dist/nodes/Google/Calendar/GoogleCalendar.node.js",
+            "dist/nodes/Google/Drive/GoogleDrive.node.js",
+            "dist/nodes/Google/Sheet/GoogleSheets.node.js",
             "dist/nodes/GraphQL/GraphQL.node.js",
             "dist/nodes/Gumroad/GumroadTrigger.node.js",
             "dist/nodes/Harvest/Harvest.node.js",
@@ -316,6 +318,7 @@
         "gm": "^1.23.1",
         "googleapis": "~50.0.0",
         "imap-simple": "^4.3.0",
+        "jsonwebtoken": "^8.5.1",
         "lodash.get": "^4.4.2",
         "lodash.set": "^4.3.2",
         "lodash.unset": "^4.5.2",