I don't get whether Google Sheets team is so against TypeScript, that I need this line... (I cannot export typeof OAuth2Client.)
async function getNewToken<T = any> (oAuth2Client: any): Promise<T>
Also, using too many callbacks is the easiest way to get into hell.
Anyways, the code is here
import fs from 'fs'
import readline from 'readline'
import { google } from 'googleapis'
const SCOPES = [
'https://www.googleapis.com/auth/spreadsheets'
]
const TOKEN_PATH = 'secrets/token.json'
const CRED_PATH = 'secrets/gsheets.json'
async function main () {
const auth = await authorize(JSON.parse(fs.readFileSync(CRED_PATH, 'utf8')))
const sheets = google.sheets({ version: 'v4', auth })
const r = await sheets.spreadsheets.values.get({
spreadsheetId: '1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms',
range: 'Class Data!A2:E'
})
if (r) {
const rows = r.data.values
if (rows) {
if (rows.length) {
console.log('Name, Major:')
// Print columns A and E, which correspond to indices 0 and 4.
rows.map((row) => {
console.log(`${row[0]}, ${row[4]}`)
})
} else {
console.log('No data found.')
}
}
}
}
async function authorize (cred: any) {
const { client_secret, client_id, redirect_uris } = cred.installed
const oAuth2Client = new google.auth.OAuth2(
client_id, client_secret, redirect_uris[0])
if (fs.existsSync(TOKEN_PATH)) {
oAuth2Client.setCredentials(JSON.parse(fs.readFileSync(TOKEN_PATH, 'utf8')))
return oAuth2Client
}
return getNewToken<typeof oAuth2Client>(oAuth2Client)
}
async function getNewToken<T = any> (oAuth2Client: any): Promise<T> {
const authUrl = oAuth2Client.generateAuthUrl({
access_type: 'offline',
scope: SCOPES
})
console.log('Authorize this app by visiting this url:', authUrl)
const code = await readlineAsync('Enter the code from that page here: ')
const token = await new Promise((resolve, reject) => {
oAuth2Client.getToken(code, (err: any, token: any) => {
err ? reject(err) : resolve(token)
})
})
oAuth2Client.setCredentials(token)
// Store the token to disk for later program executions
fs.writeFileSync(TOKEN_PATH, JSON.stringify(token))
console.log('Token stored to', TOKEN_PATH)
return oAuth2Client
}
async function readlineAsync (question: string) {
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
})
return new Promise((resolve) => {
rl.question(question, (answer) => {
rl.close()
resolve(answer)
})
})
}
main()
For this code, oAuth2Client.getToken() is not promisified. (I tested.)
For some reasons, Google Sheets API Quickstart isn't verified by google.
Also, readability can be improved if we use things like readline-sync, but I rather prefer to keep it minimal of libraries...
Top comments (1)
I just wanna say you saved my life , I was struggling with typescript and to make it work , your code was my solution !!
Thank you