«Невозможно установить свойство« jwtClient »из неопределенного» Попытка использовать Node.js с Google Sheets - PullRequest
2 голосов
/ 22 февраля 2020

Я следовал этому уроку: https://www.youtube.com/watch?v=UGN6EUi4Yio Мне пришлось остановиться на 3:43 из-за этой проблемы:

Вот основной JS файл, в который можно попасть таблица Google:

const GoogleSpreadsheet = require('google-spreadsheet');
const { promisify } = require('util');
const { google } = require('googleapis');


const creds = require('./client_secret');

async function accessSpreadsheet()
{
    const doc = new GoogleSpreadsheet.GoogleSpreadsheet('1i1uSTZ5GkMJFqUGpxsvCOIOZJ6POPOuS9Vu0kDP1y_w');

    await promisify(doc.useServiceAccountAuth)(creds);
    const info = await promisify(doc.getInfo)();
    const sheet = info.worksheets[0];
    console.log(`TItle : ${sheet.title}, Rows: ${sheet.rowCount}`);
}

accessSpreadsheet();

Когда я выполняю это, мне выдается эта ошибка:

TypeError: Cannot set property 'jwtClient' of undefined
at useServiceAccountAuth (C:\Users\Web\WebstormProjects\discordjs\node_modules\google-spreadsheet\lib\GoogleSpreadsheet.js:53:20)"

Итак, я отправился на поиски функции. Вот GoogleSpreadsheet. js с намеченной функцией в конце этого блока кода (остальная часть класса удалена):

const _ = require('lodash');
const { JWT } = require('google-auth-library');
const Axios = require('axios');

const GoogleSpreadsheetWorksheet = require('./GoogleSpreadsheetWorksheet');
const { getFieldMask } = require('./utils');

const GOOGLE_AUTH_SCOPES = [
  'https://www.googleapis.com/auth/spreadsheets',

  // the list from the sheets v4 auth for spreadsheets.get
  // 'https://www.googleapis.com/auth/drive',
  // 'https://www.googleapis.com/auth/drive.readonly',
  // 'https://www.googleapis.com/auth/drive.file',
  // 'https://www.googleapis.com/auth/spreadsheets',
  // 'https://www.googleapis.com/auth/spreadsheets.readonly',
];

const AUTH_MODES = {
  JWT: 'JWT',
  API_KEY: 'API_KEY',
};

class GoogleSpreadsheet {
  constructor(sheetId) {
    this.spreadsheetId = sheetId;
    this.authMode = null;
    this._rawSheets = {};
    this._rawProperties = null;

    // create an axios instance with sheet root URL and interceptors to handle auth
    this.axios = Axios.create({
      baseURL: `https://sheets.googleapis.com/v4/spreadsheets/${sheetId}`,
    });
    // have to use bind here or the functions dont have access to `this` :(
    this.axios.interceptors.request.use(this._setAxiosRequestAuth.bind(this));
    this.axios.interceptors.response.use(
      this._handleAxiosResponse.bind(this),
      this._handleAxiosErrors.bind(this)
    );

    return this;
  }

  // AUTH RELATED FUNCTIONS ////////////////////////////////////////////////////////////////////////
  async useApiKey(key) {
    this.authMode = AUTH_MODES.API_KEY;
    this.apiKey = key;
  }

  // creds should be an object obtained by loading the json file google gives you
  async useServiceAccountAuth(creds) {
    this.jwtClient = new JWT({
      email: creds.client_email,
      key: creds.private_key,
      scopes: GOOGLE_AUTH_SCOPES,
    });
    await this.renewJwtAuth();
  }

Информация о файле кредитов (параметр), кажется, нормально выводится с помощью консоли .log.

Я новичок в JavaScript и безуспешно прочитал, как инициализировать эти свойства. GoogleSpreadsheet. js это не мой код.

1 Ответ

4 голосов
/ 17 марта 2020

Кажется, что node_module 'google-spreadsheets' выпустил новую версию.

Мне удалось обойти вышеуказанную ошибку с помощью этого гибрида модуля документация и видео от Twilio.

const { GoogleSpreadsheet } = require('google-spreadsheet');
const creds = require('./credentials.json');

// spreadsheet key is the long id in the sheets URL
const doc = new GoogleSpreadsheet('1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms');

async function accessSpreadsheet() {
  await doc.useServiceAccountAuth({
    client_email: creds.client_email,
    private_key: creds.private_key,
  });

  await doc.loadInfo(); // loads document properties and worksheets
  console.log(doc.title);

  const sheet = doc.sheetsByIndex[0]; // or use doc.sheetsById[id]
  console.log(sheet.title);
  console.log(sheet.rowCount);

}

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