Недавно мне нужно было получить данные из API GitHub и опубликовать их в Google Sheet, чтобы я мог поделиться некоторыми диаграммами рабочей нагрузки по проверке кода. Этот пост о том, как у меня работает аутентификация.
Я написал сценарий Node.js, потому что мой вариант использования был слишком сложен для BASH и казался слишком временным для Go. Первоначально скрипт генерировал специальные данные CSV, которые я мог вручную скопировать в Google Таблицы с помощью функции «Вставить как CSV». После нескольких раундов копирования вручную я захотел использовать свое время с умом: я подсчитал, что смогу заставить работать интеграцию с Таблицами в течение пары часов, и если так, то это
вероятно, окупится в течение нескольких месяцев.
Кроме того: Таблицы — не моя база данных. Это мой пользовательский интерфейс для отчетов о данных. Не используйте Таблицы в качестве базы данных.
Мне потребовалось около 4 часов, чтобы это заработало, потому что аутентификация сложна. В этом посте показан более прямой путь к работающему решению.
Сложность создания приложения oAuth легко отвлечь, и хотя мне особенно нравится использовать сервисную учетную запись из моих облачных сервисов, это
менее удобно при локальном запуске.
Хитрость, которую я узнал, заключается в том, что настройка учетных данных приложения по умолчанию в интерфейсе командной строки gcloud может работать как своего рода прокси-сервер OAuth для кода Google Workspace, расширяя способ аутентификации вашей учетной записи в Google и включая дополнительные разрешения (области OAuth).
Чтобы отправлять запросы API к Google Таблицам, включите Sheets API в своем облачном проекте:
$> gcloud services enable sheets.googleapis.com Operation "operations/acat.p2-480745230567-02564c8d-c6ba-4f60-90bd-13f33e41f0fe" finished successfully.
Установите учетные данные приложения по умолчанию, а также заявите некоторые области OAuth, отличные от стандартных, чтобы учетные данные можно было использовать с таблицами:
$> gcloud auth application-default login --scopes \ 'https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/drive,https://www.googleapis.com/auth/spreadsheets'
Это запустит поток OAuth, который предполагает посещение веб-страницы в вашем браузере. В зависимости от конфигурации терминала может отображаться URL-адрес или даже открываться страница.
Когда gcloud предоставляется эта область, код, который может получить доступ к вашим локальным учетным данным, будет иметь доступ для чтения и записи ко всем вашим данным Google Таблиц. Вы можете повторно запустить эту команду без настроенных областей, чтобы включать и выключать этот доступ по мере необходимости.
import {google} from 'googleapis'; function sheetsClient() { const authConfig = new google.auth.GoogleAuth({ scopes: [ // Only 'spreadsheets' scope is needed in the code. // gcloud CLI also needs 'cloud-platform' and 'drive'. 'https://www.googleapis.com/auth/spreadsheets' ], }); const auth = await authConfig.getClient(); return google.sheets({version: 'v4', auth}); }
Пример из документации о том, как добавить данные в лист
(нажмите на вкладку Node.js) сработало хорошо. Однако я не мог понять, как заставить работать аутентификацию оттуда. Пример сработал, как только я понял описанный выше трюк, позволяющий добавить недостающие области OAuth к учетным данным моей среды разработки.
Я внес несколько изменений, чтобы упростить повторное использование клиента, по-другому параметризовать запрос и подчеркнуть, как я хочу, чтобы данные обрабатывались в Таблицах.
Мой код для добавления данных в лист с использованием приведенного выше кода инициализации клиента:
let client; async function appendDataToSheet(spreadsheetId, tab, values) { if (!client) { client = sheetsClient(); } try { const result = await client.spreadsheets.values.append({ spreadsheetId, range: `${tab}!A2:AG`, // Use my data as provided. valueInputOption: 'RAW', // Inserts rows as part of appending to reduce overwrites. insertDataOption: 'INSERT_ROWS', requestBody: { values }, }); console.log(`${result.data.updates.updatedCells} cells appended.`); } catch(e) { // Show the error, do not stop. Cross-reference the error with terminal output // and decide case-by-case to re-run the script or manually copy data. console.error(e); } }
Я использую «добавление», потому что мой скрипт собирает ежемесячные показатели, а добавление позволяет мне добавлять новые строки, не удаляя предыдущие.
Вот пример вызова функции AppendDataToSheet():
const values = [ // Each nested array is a spreadsheet row. [1, 2, 3, 4, 'luggage'], [4, 5, 6, 'N/A', 'sticks'], ]; appendDataToSheet( 'HPDkfqdu6rfIq5-4uTGDqz2tvmPxDZMul27JFexample', 'Exported Data Tab', values );
В документации есть несколько хороших советов по работе с Sheets API, например, предложение не отправлять более одного запроса API в секунду на каждый лист. Я понял это на собственном горьком опыте: перезаписал данные из первого запроса данными из второго.
Если я перейду к производству, я, возможно, переключусь на использование
Облачный планировщик и задания облачного запуска. Дайте мне знать, если вы хотите об этом прочитать.
Фото на обложке: Глеб Альбовский на Unsplash
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3