Google Sheets Node.js Краткое руководство: как вернуть массив строк, возвращенный из API, в переменную - PullRequest
0 голосов
/ 16 января 2020

Я использую Google Sheets Quickstart API для Nodejs. У меня все установлено правильно, и код работает нормально.

Основная функция находится в конце кода, она называется listMajors (). Это производит двумерный массив строк. Код просто отображает массив строк в console.log (), включающий пару элементов из каждой строки.

Я планирую использовать этот API в сложном приложении, которое я создаю. Я могу изменить идентификатор и диапазон электронной таблицы и получить значения из моего листа в порядке.

Что я хочу сделать - это вывести этот массив строк вне функции и в новую переменную. Я хочу сделать это, потому что большая часть моего кода будет написана с использованием значений строк, и мне не нужно писать весь код внутри функции listMajors ().

Мой вопрос Есть ли способ, как я могу заставить эту функцию listMajors () возвращать двумерный массив в переменную, которую я могу использовать в глобальной области видимости? Я не смог этого сделать. Я попытался просто установить функцию равной переменной и добавить оператор return rows; в конце функции. Я получил ошибку «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 (). Это решение моей проблемы, но я действительно хочу знать, есть ли другой способ сделать это sh.

Ответы [ 2 ]

1 голос
/ 17 января 2020

есть ли способ заставить эту функцию listMajors () возвращать двумерный массив в переменную, которую я могу использовать в глобальной области видимости?

Да и вам необходимо создать переменную вне объявления функции , а затем назначить вывод функции созданной переменной.

Здесь пошаговое руководство по созданию массива

  1. создания majors[] массива
  2. добавления majors[] значений массива из столбцов Имя и Majors
  3. список majors[] значения, чтобы увидеть все данные
  4. список majors[1] значения, чтобы увидеть имя и основные (Анна , Engli sh)
// 1
let majors = [];

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) {
// 2
      rows.map((row) => {
        majors.push(`${row[0]}, ${row[4]}`);
      });
    } else {
      console.log('No data found.');
    }
// 3
    console.log(majors);
    console.log('--------------------')
// 4
    console.log(majors[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{} объект

Почти такие же шаги, как указано выше:

  1. создать data{} объект
  2. добавить к data{} объекту все значения
  3. список data{} значений, чтобы увидеть все данные
  4. создать listData() весело ction для более простого вывода строки
  5. список Анна в data{}, который находится в строке 4 в Google Sheets, но мы избегаем первой строки, что означает -1, поэтому в data{} ее индекс равен 2.
// 1
let data = {
  names : [],
  gender : [],
  classLevel : [],
  homeState : [],
  major : [],
  extracurricularActivity : []
}

// 4
function listData(row){
    console.log(data.names[row]);
    console.log(data.gender[row]);
    console.log(data.classLevel[row]);
    console.log(data.homeState[row]);
    console.log(data.major[row]);
    console.log(data.extracurricularActivity[row]);
}

function listMajors(auth) {

  const sheets = google.sheets({version: 'v4', auth});

  sheets.spreadsheets.values.get({
    spreadsheetId: '1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms',
    range: 'Class Data!A2:F',
  }, (err, res) => {

    if (err) return console.log('The API returned an error: ' + err);

    const rows = res.data.values;

    if (rows.length) {
// 2
      rows.map((row) => {
        data.names.push(row[0]);
        data.gender.push(row[1]);
        data.classLevel.push(row[2]);
        data.homeState.push(row[3]);
        data.major.push(row[4]);
        data.extracurricularActivity.push(row[5]);
      });
    } else {
      console.log('No data found.');
    }
// 3
    console.log(data);
    console.log('--------------------')
// 5
    listData(2);
  });
}

Здесь вы можете увидеть вывод для listData(2):

Anna
Female
1. Freshman
NC
English
Basketball

Есть более продвинутые способы сделать это, взять Посмотрите на ссылку. Я надеюсь, что эти примеры помогут вам запустить API Google Sheets с Node.js

Ссылка:

1 голос
/ 17 января 2020
  • Вы хотите получить значения, полученные из sheets.spreadsheets.values.get() в другой функции.
  • Вы хотите добиться этого с помощью googleapis с Node.js.
  • Вы уже смогли получить и поместить значения для Spreadsheet с помощью API Sheets.

Если мое понимание правильное, как насчет этого ответа? Пожалуйста, подумайте об этом как об одном из нескольких возможных ответов.

Модифицированный скрипт:

В этом случае в качестве тестового примера сначала вызывается main(). Поэтому сначала измените, пожалуйста, следующим образом.

С:

authorize(JSON.parse(content), listMajors);

Кому:

authorize(JSON.parse(content), main);

И, пожалуйста, добавьте main() и измените listMajors() следующим образом .

main() и listMajors()

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);
}

В приведенной выше модификации, когда запускается main(), вы можете увидеть значения, полученные с помощью sheets.spreadsheets.values.get() в data.

Если я неправильно понял ваш вопрос, и это было не то направление, которое вы хотите, я прошу прощения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...