commit
cc14863280
@ -0,0 +1,6 @@ |
|||||||
|
token.json |
||||||
|
pnpm-lock.yaml |
||||||
|
.idea |
||||||
|
locale |
||||||
|
node_modules |
||||||
|
credentials.json |
@ -0,0 +1,16 @@ |
|||||||
|
# Google Sheets API Quickstart |
||||||
|
|
||||||
|
Complete the steps described in the [quickstart instructions]( |
||||||
|
https://developers.google.com/sheets/api/quickstart/nodejs), and in about five |
||||||
|
minutes you'll have a simple Node.js command-line application that makes |
||||||
|
requests to the Google Sheets API. |
||||||
|
|
||||||
|
## Install |
||||||
|
|
||||||
|
`npm install` |
||||||
|
|
||||||
|
## Run |
||||||
|
|
||||||
|
After following the quickstart setup instructions, run the sample: |
||||||
|
|
||||||
|
`npm start` |
@ -0,0 +1,162 @@ |
|||||||
|
/** |
||||||
|
* @license |
||||||
|
* Copyright Google Inc. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
// [START sheets_quickstart]
|
||||||
|
const fs = require('fs'); |
||||||
|
const readline = require('readline'); |
||||||
|
const {google} = require('googleapis'); |
||||||
|
|
||||||
|
// If modifying these scopes, delete token.json.
|
||||||
|
const SCOPES = ['https://www.googleapis.com/auth/spreadsheets.readonly']; |
||||||
|
// The file token.json stores the user's access and refresh tokens, and is
|
||||||
|
// created automatically when the authorization flow completes for the first
|
||||||
|
// time.
|
||||||
|
const TOKEN_PATH = 'token.json'; |
||||||
|
|
||||||
|
// Load client secrets from a local file.
|
||||||
|
fs.readFile('credentials.json', (err, content) => { |
||||||
|
if (err) return console.log('Error loading client secret file:', err); |
||||||
|
// Authorize a client with credentials, then call the Google Sheets API.
|
||||||
|
authorize(JSON.parse(content), listMajors); |
||||||
|
}); |
||||||
|
|
||||||
|
/** |
||||||
|
* Create an OAuth2 client with the given credentials, and then execute the |
||||||
|
* given callback function. |
||||||
|
* @param {Object} credentials The authorization client credentials. |
||||||
|
* @param {function} callback The callback to call with the authorized client. |
||||||
|
*/ |
||||||
|
function authorize(credentials, callback) { |
||||||
|
const {client_secret, client_id, redirect_uris} = credentials.installed; |
||||||
|
const oAuth2Client = new google.auth.OAuth2( |
||||||
|
client_id, client_secret, redirect_uris[0]); |
||||||
|
|
||||||
|
// Check if we have previously stored a token.
|
||||||
|
fs.readFile(TOKEN_PATH, (err, token) => { |
||||||
|
if (err) return getNewToken(oAuth2Client, callback); |
||||||
|
oAuth2Client.setCredentials(JSON.parse(token)); |
||||||
|
callback(oAuth2Client); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get and store new token after prompting for user authorization, and then |
||||||
|
* execute the given callback with the authorized OAuth2 client. |
||||||
|
* @param {google.auth.OAuth2} oAuth2Client The OAuth2 client to get token for. |
||||||
|
* @param {getEventsCallback} callback The callback for the authorized client. |
||||||
|
*/ |
||||||
|
function getNewToken(oAuth2Client, callback) { |
||||||
|
const authUrl = oAuth2Client.generateAuthUrl({ |
||||||
|
access_type: 'offline', |
||||||
|
scope: SCOPES, |
||||||
|
}); |
||||||
|
console.log('Authorize this app by visiting this url:', authUrl); |
||||||
|
const rl = readline.createInterface({ |
||||||
|
input: process.stdin, |
||||||
|
output: process.stdout, |
||||||
|
}); |
||||||
|
rl.question('Enter the code from that page here: ', (code) => { |
||||||
|
rl.close(); |
||||||
|
oAuth2Client.getToken(code, (err, token) => { |
||||||
|
if (err) return console.error('Error while trying to retrieve access token', err); |
||||||
|
oAuth2Client.setCredentials(token); |
||||||
|
// Store the token to disk for later program executions
|
||||||
|
fs.writeFile(TOKEN_PATH, JSON.stringify(token), (err) => { |
||||||
|
if (err) return console.error(err); |
||||||
|
console.log('Token stored to', TOKEN_PATH); |
||||||
|
}); |
||||||
|
callback(oAuth2Client); |
||||||
|
}); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Prints the names and majors of students in a sample spreadsheet: |
||||||
|
* @see https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit
|
||||||
|
* @param {google.auth.OAuth2} auth The authenticated Google OAuth client. |
||||||
|
*/ |
||||||
|
function listMajors(auth) { |
||||||
|
const sheets = google.sheets({version: 'v4', auth}); |
||||||
|
sheets.spreadsheets.values.get({ |
||||||
|
spreadsheetId: '1GWnrP4WepYM8ERqSVGwKw5yxezMLnpdjxT0usn5mQKU', |
||||||
|
range: 'i18n', |
||||||
|
}, (err, res) => { |
||||||
|
if (err) return console.log('The API returned an error: ' + err); |
||||||
|
const rows = res.data.values; |
||||||
|
|
||||||
|
// console.info(rows)
|
||||||
|
let keyIndex=rows[0].indexOf('key') |
||||||
|
if (rows.length&&keyIndex!==-1&&rows[0][keyIndex+1]==='default') { |
||||||
|
|
||||||
|
let keys=rows.slice(1).map((item,row)=>{return {row:row+1,key:item[keyIndex]}}) |
||||||
|
|
||||||
|
let i18n= rows[0].slice(keyIndex+1).map(()=>{return {}}) |
||||||
|
console.info(`共找到${i18n.length-1}种语言,${keys.length}个词条`) |
||||||
|
keys.map((key,row)=>{ |
||||||
|
i18n.map((obj,column)=>{ |
||||||
|
|
||||||
|
if(!/^[a-zA-Z][0-9a-zA-Z_]+$/g.test(key.key)){ |
||||||
|
console.error(`第${row+1}行${key.key}不合法,key必须以英文字母开头,只能包含字母数字和下划线`) |
||||||
|
return |
||||||
|
} |
||||||
|
|
||||||
|
if(key.key in obj){ |
||||||
|
console.warn(`第${row+1}行${key.key}已经在第${rows[key.row]}行定义了!`) |
||||||
|
} |
||||||
|
let value=rows[row+1][column+keyIndex+1]||'' |
||||||
|
if(value===''){ |
||||||
|
console.warn(`第${row+1}行${key.key}对应的${rows[0].slice(keyIndex+1)[column]}没有翻译!`) |
||||||
|
} |
||||||
|
obj[key.key]=value |
||||||
|
}) |
||||||
|
}) |
||||||
|
|
||||||
|
console.info(i18n) |
||||||
|
let dir='locale' |
||||||
|
if (!fs.existsSync(dir)){ |
||||||
|
fs.mkdir(dir,function(error){ |
||||||
|
if(error){ |
||||||
|
console.log(error); |
||||||
|
return false; |
||||||
|
} |
||||||
|
createFile(rows[0].slice(keyIndex+1),i18n) |
||||||
|
}) |
||||||
|
}else{ |
||||||
|
createFile(rows[0].slice(keyIndex+1),i18n) |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} else { |
||||||
|
console.log('语言包没有翻译文本或格式不合法'); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
function createFile(languages,i18n){ |
||||||
|
languages.map((filename,index)=>{ |
||||||
|
fs.writeFile(`locale/${filename}.json`, JSON.stringify(i18n[index]), (err) => { |
||||||
|
if (err) { |
||||||
|
throw err; |
||||||
|
} |
||||||
|
}); |
||||||
|
}) |
||||||
|
} |
||||||
|
// [END sheets_quickstart]
|
||||||
|
|
||||||
|
module.exports = { |
||||||
|
SCOPES, |
||||||
|
listMajors, |
||||||
|
}; |
@ -0,0 +1,261 @@ |
|||||||
|
{ |
||||||
|
"name": "google-sheets-nodejs-quickstart", |
||||||
|
"version": "1.0.0", |
||||||
|
"lockfileVersion": 1, |
||||||
|
"requires": true, |
||||||
|
"dependencies": { |
||||||
|
"abort-controller": { |
||||||
|
"version": "3.0.0", |
||||||
|
"resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", |
||||||
|
"integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", |
||||||
|
"requires": { |
||||||
|
"event-target-shim": "5.0.1" |
||||||
|
} |
||||||
|
}, |
||||||
|
"agent-base": { |
||||||
|
"version": "4.2.1", |
||||||
|
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", |
||||||
|
"integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", |
||||||
|
"requires": { |
||||||
|
"es6-promisify": "5.0.0" |
||||||
|
} |
||||||
|
}, |
||||||
|
"base64-js": { |
||||||
|
"version": "1.3.0", |
||||||
|
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", |
||||||
|
"integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" |
||||||
|
}, |
||||||
|
"bignumber.js": { |
||||||
|
"version": "7.2.1", |
||||||
|
"resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", |
||||||
|
"integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==" |
||||||
|
}, |
||||||
|
"buffer-equal-constant-time": { |
||||||
|
"version": "1.0.1", |
||||||
|
"resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", |
||||||
|
"integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" |
||||||
|
}, |
||||||
|
"debug": { |
||||||
|
"version": "3.2.6", |
||||||
|
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", |
||||||
|
"integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", |
||||||
|
"requires": { |
||||||
|
"ms": "2.1.1" |
||||||
|
} |
||||||
|
}, |
||||||
|
"ecdsa-sig-formatter": { |
||||||
|
"version": "1.0.11", |
||||||
|
"resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", |
||||||
|
"integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", |
||||||
|
"requires": { |
||||||
|
"safe-buffer": "5.1.2" |
||||||
|
} |
||||||
|
}, |
||||||
|
"es6-promise": { |
||||||
|
"version": "4.2.6", |
||||||
|
"resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.6.tgz", |
||||||
|
"integrity": "sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q==" |
||||||
|
}, |
||||||
|
"es6-promisify": { |
||||||
|
"version": "5.0.0", |
||||||
|
"resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", |
||||||
|
"integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", |
||||||
|
"requires": { |
||||||
|
"es6-promise": "4.2.6" |
||||||
|
} |
||||||
|
}, |
||||||
|
"event-target-shim": { |
||||||
|
"version": "5.0.1", |
||||||
|
"resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", |
||||||
|
"integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" |
||||||
|
}, |
||||||
|
"extend": { |
||||||
|
"version": "3.0.2", |
||||||
|
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", |
||||||
|
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" |
||||||
|
}, |
||||||
|
"fast-text-encoding": { |
||||||
|
"version": "1.0.0", |
||||||
|
"resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.0.tgz", |
||||||
|
"integrity": "sha512-R9bHCvweUxxwkDwhjav5vxpFvdPGlVngtqmx4pIZfSUhM/Q4NiIUHB456BAf+Q1Nwu3HEZYONtu+Rya+af4jiQ==" |
||||||
|
}, |
||||||
|
"gaxios": { |
||||||
|
"version": "1.8.4", |
||||||
|
"resolved": "https://registry.npmjs.org/gaxios/-/gaxios-1.8.4.tgz", |
||||||
|
"integrity": "sha512-BoENMnu1Gav18HcpV9IleMPZ9exM+AvUjrAOV4Mzs/vfz2Lu/ABv451iEXByKiMPn2M140uul1txXCg83sAENw==", |
||||||
|
"requires": { |
||||||
|
"abort-controller": "3.0.0", |
||||||
|
"extend": "3.0.2", |
||||||
|
"https-proxy-agent": "2.2.1", |
||||||
|
"node-fetch": "2.5.0" |
||||||
|
} |
||||||
|
}, |
||||||
|
"gcp-metadata": { |
||||||
|
"version": "1.0.0", |
||||||
|
"resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-1.0.0.tgz", |
||||||
|
"integrity": "sha512-Q6HrgfrCQeEircnNP3rCcEgiDv7eF9+1B+1MMgpE190+/+0mjQR8PxeOaRgxZWmdDAF9EIryHB9g1moPiw1SbQ==", |
||||||
|
"requires": { |
||||||
|
"gaxios": "1.8.4", |
||||||
|
"json-bigint": "0.3.0" |
||||||
|
} |
||||||
|
}, |
||||||
|
"google-auth-library": { |
||||||
|
"version": "3.1.2", |
||||||
|
"resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-3.1.2.tgz", |
||||||
|
"integrity": "sha512-cDQMzTotwyWMrg5jRO7q0A4TL/3GWBgO7I7q5xGKNiiFf9SmGY/OJ1YsLMgI2MVHHsEGyrqYnbnmV1AE+Z6DnQ==", |
||||||
|
"requires": { |
||||||
|
"base64-js": "1.3.0", |
||||||
|
"fast-text-encoding": "1.0.0", |
||||||
|
"gaxios": "1.8.4", |
||||||
|
"gcp-metadata": "1.0.0", |
||||||
|
"gtoken": "2.3.3", |
||||||
|
"https-proxy-agent": "2.2.1", |
||||||
|
"jws": "3.2.2", |
||||||
|
"lru-cache": "5.1.1", |
||||||
|
"semver": "5.7.0" |
||||||
|
} |
||||||
|
}, |
||||||
|
"google-p12-pem": { |
||||||
|
"version": "1.0.4", |
||||||
|
"resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-1.0.4.tgz", |
||||||
|
"integrity": "sha512-SwLAUJqUfTB2iS+wFfSS/G9p7bt4eWcc2LyfvmUXe7cWp6p3mpxDo6LLI29MXdU6wvPcQ/up298X7GMC5ylAlA==", |
||||||
|
"requires": { |
||||||
|
"node-forge": "0.8.2", |
||||||
|
"pify": "4.0.1" |
||||||
|
} |
||||||
|
}, |
||||||
|
"googleapis": { |
||||||
|
"version": "39.2.0", |
||||||
|
"resolved": "https://registry.npmjs.org/googleapis/-/googleapis-39.2.0.tgz", |
||||||
|
"integrity": "sha512-66X8TG1B33zAt177sG1CoKoYHPP/B66tEpnnSANGCqotMuY5gqSQO8G/0gqHZR2jRgc5CHSSNOJCnpI0SuDxMQ==", |
||||||
|
"requires": { |
||||||
|
"google-auth-library": "3.1.2", |
||||||
|
"googleapis-common": "0.7.2" |
||||||
|
} |
||||||
|
}, |
||||||
|
"googleapis-common": { |
||||||
|
"version": "0.7.2", |
||||||
|
"resolved": "https://registry.npmjs.org/googleapis-common/-/googleapis-common-0.7.2.tgz", |
||||||
|
"integrity": "sha512-9DEJIiO4nS7nw0VE1YVkEfXEj8x8MxsuB+yZIpOBULFSN9OIKcUU8UuKgSZFU4lJmRioMfngktrbkMwWJcUhQg==", |
||||||
|
"requires": { |
||||||
|
"gaxios": "1.8.4", |
||||||
|
"google-auth-library": "3.1.2", |
||||||
|
"pify": "4.0.1", |
||||||
|
"qs": "6.7.0", |
||||||
|
"url-template": "2.0.8", |
||||||
|
"uuid": "3.3.2" |
||||||
|
} |
||||||
|
}, |
||||||
|
"gtoken": { |
||||||
|
"version": "2.3.3", |
||||||
|
"resolved": "https://registry.npmjs.org/gtoken/-/gtoken-2.3.3.tgz", |
||||||
|
"integrity": "sha512-EaB49bu/TCoNeQjhCYKI/CurooBKkGxIqFHsWABW0b25fobBYVTMe84A8EBVVZhl8emiUdNypil9huMOTmyAnw==", |
||||||
|
"requires": { |
||||||
|
"gaxios": "1.8.4", |
||||||
|
"google-p12-pem": "1.0.4", |
||||||
|
"jws": "3.2.2", |
||||||
|
"mime": "2.4.2", |
||||||
|
"pify": "4.0.1" |
||||||
|
} |
||||||
|
}, |
||||||
|
"https-proxy-agent": { |
||||||
|
"version": "2.2.1", |
||||||
|
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", |
||||||
|
"integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", |
||||||
|
"requires": { |
||||||
|
"agent-base": "4.2.1", |
||||||
|
"debug": "3.2.6" |
||||||
|
} |
||||||
|
}, |
||||||
|
"json-bigint": { |
||||||
|
"version": "0.3.0", |
||||||
|
"resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-0.3.0.tgz", |
||||||
|
"integrity": "sha1-DM2RLEuCcNBfBW+9E4FLU9OCWx4=", |
||||||
|
"requires": { |
||||||
|
"bignumber.js": "7.2.1" |
||||||
|
} |
||||||
|
}, |
||||||
|
"jwa": { |
||||||
|
"version": "1.4.1", |
||||||
|
"resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", |
||||||
|
"integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", |
||||||
|
"requires": { |
||||||
|
"buffer-equal-constant-time": "1.0.1", |
||||||
|
"ecdsa-sig-formatter": "1.0.11", |
||||||
|
"safe-buffer": "5.1.2" |
||||||
|
} |
||||||
|
}, |
||||||
|
"jws": { |
||||||
|
"version": "3.2.2", |
||||||
|
"resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", |
||||||
|
"integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", |
||||||
|
"requires": { |
||||||
|
"jwa": "1.4.1", |
||||||
|
"safe-buffer": "5.1.2" |
||||||
|
} |
||||||
|
}, |
||||||
|
"lru-cache": { |
||||||
|
"version": "5.1.1", |
||||||
|
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", |
||||||
|
"integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", |
||||||
|
"requires": { |
||||||
|
"yallist": "3.0.3" |
||||||
|
} |
||||||
|
}, |
||||||
|
"mime": { |
||||||
|
"version": "2.4.2", |
||||||
|
"resolved": "https://registry.npmjs.org/mime/-/mime-2.4.2.tgz", |
||||||
|
"integrity": "sha512-zJBfZDkwRu+j3Pdd2aHsR5GfH2jIWhmL1ZzBoc+X+3JEti2hbArWcyJ+1laC1D2/U/W1a/+Cegj0/OnEU2ybjg==" |
||||||
|
}, |
||||||
|
"ms": { |
||||||
|
"version": "2.1.1", |
||||||
|
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", |
||||||
|
"integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" |
||||||
|
}, |
||||||
|
"node-fetch": { |
||||||
|
"version": "2.5.0", |
||||||
|
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.5.0.tgz", |
||||||
|
"integrity": "sha512-YuZKluhWGJwCcUu4RlZstdAxr8bFfOVHakc1mplwHkk8J+tqM1Y5yraYvIUpeX8aY7+crCwiELJq7Vl0o0LWXw==" |
||||||
|
}, |
||||||
|
"node-forge": { |
||||||
|
"version": "0.8.2", |
||||||
|
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.8.2.tgz", |
||||||
|
"integrity": "sha512-mXQ9GBq1N3uDCyV1pdSzgIguwgtVpM7f5/5J4ipz12PKWElmPpVWLDuWl8iXmhysr21+WmX/OJ5UKx82wjomgg==" |
||||||
|
}, |
||||||
|
"pify": { |
||||||
|
"version": "4.0.1", |
||||||
|
"resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", |
||||||
|
"integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" |
||||||
|
}, |
||||||
|
"qs": { |
||||||
|
"version": "6.7.0", |
||||||
|
"resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", |
||||||
|
"integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" |
||||||
|
}, |
||||||
|
"safe-buffer": { |
||||||
|
"version": "5.1.2", |
||||||
|
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", |
||||||
|
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" |
||||||
|
}, |
||||||
|
"semver": { |
||||||
|
"version": "5.7.0", |
||||||
|
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", |
||||||
|
"integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" |
||||||
|
}, |
||||||
|
"url-template": { |
||||||
|
"version": "2.0.8", |
||||||
|
"resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", |
||||||
|
"integrity": "sha1-/FZaPMy/93MMd19WQflVV5FDnyE=" |
||||||
|
}, |
||||||
|
"uuid": { |
||||||
|
"version": "3.3.2", |
||||||
|
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", |
||||||
|
"integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" |
||||||
|
}, |
||||||
|
"yallist": { |
||||||
|
"version": "3.0.3", |
||||||
|
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", |
||||||
|
"integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,17 @@ |
|||||||
|
{ |
||||||
|
"name": "google-sheets-nodejs-quickstart", |
||||||
|
"version": "1.0.0", |
||||||
|
"description": "A simple Node.js command-line application that makes requests to the Google Sheets API.", |
||||||
|
"private": true, |
||||||
|
"dependencies": { |
||||||
|
"googleapis": "^39.0.0" |
||||||
|
}, |
||||||
|
"devDependencies": {}, |
||||||
|
"engines": { |
||||||
|
"node": ">=6.4.0" |
||||||
|
}, |
||||||
|
"scripts": { |
||||||
|
"start": "node ." |
||||||
|
}, |
||||||
|
"license": "Apache-2.0" |
||||||
|
} |
Loading…
Reference in new issue