Javascript Google Sheets Node.js快速入门指南:如何将API返回的行数组返回到变量中
我正在为Nodejs使用Google的Sheets快速启动API。我已经正确安装了所有东西,代码运行良好 main函数位于代码的末尾,名为listMajors()。它生成一个二维行数组。代码只是将行数组映射到一个console.log()中,其中包括每行中的两个项 我计划在我正在创建的复杂应用程序中使用此API。我可以更改电子表格ID和范围,并从我的工作表中获取值 我要做的是将这个“rows”数组从函数外部放入一个新变量中。我之所以要这样做,是因为我的大部分代码将使用rows值来编写,我不想在listMajors()函数中编写所有代码 我的问题是,有没有一种方法可以让这个listMajors()函数将二维数组返回到一个可以在全局范围内使用的变量中?我没能做到这一点。我试图将函数设置为一个变量,并添加一个Javascript Google Sheets Node.js快速入门指南:如何将API返回的行数组返回到变量中,javascript,node.js,google-sheets-api,Javascript,Node.js,Google Sheets Api,我正在为Nodejs使用Google的Sheets快速启动API。我已经正确安装了所有东西,代码运行良好 main函数位于代码的末尾,名为listMajors()。它生成一个二维行数组。代码只是将行数组映射到一个console.log()中,其中包括每行中的两个项 我计划在我正在创建的复杂应用程序中使用此API。我可以更改电子表格ID和范围,并从我的工作表中获取值 我要做的是将这个“rows”数组从函数外部放入一个新变量中。我之所以要这样做,是因为我的大部分代码将使用rows值来编写,我不想在l
返回行函数末尾的代码>语句。我得到错误“ReferenceError:listMajors未定义”
以下是原始代码:
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: '1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms',
range: 'Class Data!A2:E',
}, (err, res) => {
if (err) return console.log('The API returned an error: ' + err);
const rows = res.data.values;
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.');
}
});
}
这就是我试图做出的改变:
var data = function listMajors(auth) {
const sheets = google.sheets({version: 'v4', auth});
sheets.spreadsheets.values.get({
spreadsheetId: '1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms',
range: 'Class Data!A2:E',
}, (err, res) => {
if (err) return console.log('The API returned an error: ' + err);
const rows = res.data.values;
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]}`);
//});
return rows;
} else {
console.log('No data found.');
}
});
}
console.log(data);
我相信我可以在不同的文件中编写所有其他函数,导入它们,然后在listMajors()函数中调用它们。这是我问题的解决方案,但我真正想知道的是,是否有其他方法可以实现这一点。
- 您希望检索从其他函数的
sheets.spreadsheets.values.get()
中检索到的值
- 您希望通过Node.js使用googleapis实现这一点
- 您已经能够使用Sheets API获取和输入电子表格的值
如果我的理解是正确的,那么这个答案呢?请把这看作是几个可能的答案之一
修改脚本:
在本例中,作为测试用例,首先调用main()
。所以首先,请修改如下
发件人:
致:
请添加main()
并修改listMajors()
,如下所示
main()
和listMajors()
通过以上修改,当运行main()
时,您可以看到通过sheets.spreadsheets.values.get()
atdata
检索到的值
如果我误解了你的问题,而这不是你想要的方向,我道歉
有没有办法让这个listMajors()函数将二维数组返回到一个可以在全局范围内使用的变量中
是并且必须在函数声明之外创建一个变量,然后将函数输出分配给已创建的变量
下面是如何创建阵列的分步指南
创建专业[]
数组
从列名称和主项中添加主项[]
数组值
列出majors[]
值以查看整个数据
列出专业[1]
值以查看姓名和专业(Anna,英语)
//1
让专业=[];
函数列表(auth){
constsheets=google.sheets({version:'v4',auth});
表。电子表格。值。获取({
电子表格ID:'1BXIMV0xRA5NFMDKVBDBZJGMUQPTLBS74OGVE2UPMS',
范围:“类数据!A2:E”,
},(误差、分辨率)=>{
if(err)返回console.log('API返回错误:'+err);
常量行=res.data.values;
if(行数.长度){
// 2
rows.map((row)=>{
push(`${row[0]},${row[4]}`);
});
}否则{
console.log('未找到数据');
}
// 3
控制台日志(专业);
console.log('-------------------“)
// 4
console.log(专业[2])
});
}
这是console.log()
输出:
[
'Alexandra, English', 'Andrew, Math',
'Anna, English', 'Becky, Art',
'Benjamin, English', 'Carl, Art',
'Carrie, English', 'Dorothy, Math',
'Dylan, Math', 'Edward, English',
'Ellen, Physics', 'Fiona, Art',
'John, Physics', 'Jonathan, Math',
'Joseph, English', 'Josephine, Math',
'Karen, English', 'Kevin, Physics',
'Lisa, Art', 'Mary, Physics',
'Maureen, Physics', 'Nick, Art',
'Olivia, Physics', 'Pamela, Math',
'Patrick, Art', 'Robert, English',
'Sean, Physics', 'Stacy, Math',
'Thomas, Art', 'Will, Math'
]
--------------------
Anna, English
从现在起,您可以随时使用majors[]
数组
如果您想对数据有更多的控制,可以创建major{}
对象
与上述步骤几乎相同:
创建数据{}
对象
将添加到数据{}
对象所有值
列出数据{}
值以查看整个数据
创建listData()
函数以简化行输出
listAnna indata{}
位于谷歌表单的第4行,但是我们避免了第一行,这意味着-1,因此在data{}
中,她的索引是2
//1
让数据={
姓名:[],
性别:[],
类级别:[],
家园:[],
主修:[],
课外活动:[]
}
// 4
函数列表数据(行){
console.log(data.names[row]);
console.log(data.gender[row]);
log(data.classLevel[row]);
console.log(data.homeState[row]);
console.log(data.major[row]);
console.log(数据.课外活动[row]);
}
函数列表(auth){
constsheets=google.sheets({version:'v4',auth});
表。电子表格。值。获取({
电子表格ID:'1BXIMV0xRA5NFMDKVBDBZJGMUQPTLBS74OGVE2UPMS',
范围:“类数据!A2:F”,
},(误差、分辨率)=>{
if(err)返回console.log('API返回错误:'+err);
常量行=res.data.values;
if(行数.长度){
// 2
rows.map((row)=>{
data.names.push(第[0]行);
数据。性别。推送(第[1]行);
data.classLevel.push(第[2]行);
数据.homeState.push(第[3]行);
data.major.push(第[4]行);
数据。课外活动。推送(第[5]行);
});
}否则{
console.log('未找到数据');
}
// 3
控制台日志(数据);
console.log('-------------------“)
// 5
列表数据(2);
});
}
在这里您可以看到列表数据(2)
的输出:
有更先进的方法可以做到这一点,看看参考资料。
我希望这些都是真的
authorize(JSON.parse(content), main);
async function listMajors(auth) {
const sheets = google.sheets({ version: "v4", auth });
const res = await sheets.spreadsheets.values.get({
spreadsheetId: '1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms',
range: 'Class Data!A2:E',
});
return res.data.values;
}
async function main(auth) {
const data = await listMajors(auth);
console.log(data);
}
[
'Alexandra, English', 'Andrew, Math',
'Anna, English', 'Becky, Art',
'Benjamin, English', 'Carl, Art',
'Carrie, English', 'Dorothy, Math',
'Dylan, Math', 'Edward, English',
'Ellen, Physics', 'Fiona, Art',
'John, Physics', 'Jonathan, Math',
'Joseph, English', 'Josephine, Math',
'Karen, English', 'Kevin, Physics',
'Lisa, Art', 'Mary, Physics',
'Maureen, Physics', 'Nick, Art',
'Olivia, Physics', 'Pamela, Math',
'Patrick, Art', 'Robert, English',
'Sean, Physics', 'Stacy, Math',
'Thomas, Art', 'Will, Math'
]
--------------------
Anna, English
Anna
Female
1. Freshman
NC
English
Basketball