Javascript Google Sheets Node.js快速入门指南:如何将API返回的行数组返回到变量中

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

我正在为Nodejs使用Google的Sheets快速启动API。我已经正确安装了所有东西,代码运行良好

main函数位于代码的末尾,名为listMajors()。它生成一个二维行数组。代码只是将行数组映射到一个console.log()中,其中包括每行中的两个项

我计划在我正在创建的复杂应用程序中使用此API。我可以更改电子表格ID和范围,并从我的工作表中获取值

我要做的是将这个“rows”数组从函数外部放入一个新变量中。我之所以要这样做,是因为我的大部分代码将使用rows值来编写,我不想在listMajors()函数中编写所有代码

我的问题是,有没有一种方法可以让这个listMajors()函数将二维数组返回到一个可以在全局范围内使用的变量中?我没能做到这一点。我试图将函数设置为一个变量,并添加一个
返回行语句。我得到错误“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()
at
data
检索到的值

如果我误解了你的问题,而这不是你想要的方向,我道歉

有没有办法让这个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 in
    data{}
    位于谷歌表单的第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