React JS и электронные таблицы Google: не удается прочитать свойство ‘2’ с нулевым значением

#reactjs #google-sheets

#reactjs #google-sheets

Вопрос:

В настоящее время я работаю с React JS и электронными таблицами Google и слежу за чем-то похожим на эту статью . Однако я столкнулся с проблемой. Всякий раз, когда я пытаюсь подключиться к своей электронной таблице, мое приложение React успешно запускается в течение нескольких секунд, а затем вылетает с этим сообщением об ошибке: введите описание изображения здесь

В настоящее время это мой код:

 import {
  GoogleSpreadsheet
} from 'google-spreadsheet';

function App() {
  const setup = async () => {
    const doc = new GoogleSpreadsheet('my spreadsheet-id'); // Obviously putting in my real spreadsheet id and data instead of this in my real code
    await doc.useServiceAccountAuth({
      client_email: 'my client-email',
      private_key: 'my private-key'
    });

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

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

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

Кто-нибудь знает, почему это происходит и как я могу это исправить? Спасибо!

Комментарии:

1. Что произойдет, если вы войдете doc в систему после его определения?

2. Я исправил это (проблема была с моим закрытым ключом), но спасибо за помощь!

3. Привет @HelloWorld, у меня такая же проблема. Вы помните, что вы сделали, чтобы заставить его работать?

4. @JotaRenan я смог заставить это работать, сохранив переменные в файле .env, а затем получив к ним доступ оттуда. У меня также был мой закрытый ключ, равный всему, что мне дала консоль разработчиков Google, включая ту часть, где написано «Начать закрытый ключ». Надеюсь, это поможет.

5. Я ценю ваш ответ! По-видимому, у меня был завершающий символ ‘ n’ в моем закрытом ключе. Это вызывало несоответствие регулярных выражений. Тем не менее, он еще не работает из-за другого исключения, сейчас, ха-ха.

Ответ №1:

Я понял это через некоторое время… Для тех, кто нашел этот поток StackOverflow своей единственной надеждой, я оставлю этот ответ здесь, чтобы сэкономить часть ваших часов.

По-видимому, если вы храните закрытый токен внутри вашего .env, n символ будет проанализирован как \n . Вам нужно будет убедиться, что косые черты НЕ экранированы.

Для моего проекта это решение:

 await doc.useServiceAccountAuth({
  client_email: 'my client-email',
  private_key: process.env.REACT_APP_SHEET_PRIVATE_KEY.replace(/\n/g, 'n')
});
  

Ответ №2:

Убедитесь, что вы включили свою библиотеку api, поскольку она выдает ту же ошибку, когда используемый вами api отключен.

Комментарии:

1. Это больше похоже на комментарий, чем на ответ. Как таковой, он может быть удален. Рассмотрите возможность редактирования, если у вас есть больше информации для обмена.

Ответ №3:

Также проверьте наличие последней версии этой библиотеки, поскольку в старых версиях используется API Google v3, который устарел. Последние версии используют v4 и позволяют избежать проблем с аутентификацией. https://theoephraim.github.io/node-google-spreadsheet /#/

Ответ №4:

Для меня проблема была также с ключом API. У меня создалось впечатление, что я должен был удалить часть, в которой говорилось «Начать закрытый ключ …». Люди, у которых есть эта проблема, должны проверить свои ключи API.

Комментарии:

1. так нужно ли нам удалять эту часть?

2. Нет, вы оставляете эту часть и просто копируете и вставляете то, что они вам дают.

Ответ №5:

Я закодировал закрытый ключ в base64, а затем вставил его в .env

Затем вставьте мой код:

 const private_key = Buffer.from(GOOGLE_SA_PRIVATE_KEY, 'base64').toString('utf8')

const doc = new GoogleSpreadsheet(SPREADSHEET_ID)

doc.useServiceAccountAuth({
  // env var values are copied from service account credentials generated by google
  // see "Authentication" section in docs for more info
  client_email: GOOGLE_SA_EMAIL,
  private_key: private_key.replace(/\n/g, 'n'),
})