Я работал над персональными проектами, которые используют листы Google сейчас и по нескольким причинам: электронные таблицы супер Легко создавать, просматривать и редактировать для всех . Вы можете поделиться с ними до публики, и кто-то сможет увидеть, на что вы построили или на чем вы работаете.
Мой опыт, просматривая Интернет для ресурсов о том, как использовать листы Google программно, не было то, что я ожидал, хотя. Большинство примеров, которые я мог найти, сосредоточены на чтении с электронных таблиц, а не писать на них.
В этой статье я объясню, как вы можете создать функцию aws lambda, используя Смертный С нуля, который пишет в гугл и охватит некоторые очки, которые я нашел.
Оглавление
- Создать новый проект
- Настройте аутентификацию
- Создание вашей службы
- Поделиться документом
- Настройте вашу среду переменные
- Внедрить функцию записи
- Добавить функцию чтения
- Развернуть его
- Utils и комната для улучшений
Предварительные условия
- Вам понадобится установлена версия Node.js (рекомендуется v12.x)
- Установлена безмерная структура (
NPM I Serverless -G -G)
1. Создать новый проект
Мы будем использовать CLI из Смертный для загрузки нового проекта. Запустите следующую команду, чтобы создать Пример электронной таблицы каталог в текущей папке:
serverless create --template aws-nodejs --path spreadsheet-example
Далее мы добавим новую функцию под названием Напишите с конечной точкой Post как триггер в Serverless.yml что CLI только что создал для нас:
functions: - + write: + handler: handler.write + events: + - http: + path: /write + method: POST
Также добавьте в Handler.js файл:
module.exports.write = async event => {
console.log('Starting write function');
}
Практический способ проверить, мы на хорошем пути – это выполнить SLS вызывает локальный - писать И проверить журнал печатает правильное сообщение.
2. Настройте аутентификацию
Я прочитал документацию вокруг листов Google и их Google-Apis Библиотека, но все же расстроена из-за отсутствия четкости на механизмах аутентификации. После некоторого устранения неполадок я обнаружил, что использование учетной записи услуг достаточно, чтобы получить разрешения на запись. Ради простоты в этих примерах кода я переключусь в использование Google-Spreadsheet Что тезисны много дел Nitty-Gritty от библиотеки Google.
2. Создание вашей службы
Перейти к Страница Сервиса Счета Отказ Вы можете выбрать существующий проект или создать новый. Нажмите на «Создать учетную запись Service» и введите имя для новой учетной записи. Вам не нужно ничего менять за шаги 2 и 3. Как только он создан, вы должны иметь возможность увидеть вашу новую учетную запись в списке. Нажмите на него и выберите «Добавить клавишу> Создать новую клавишу». После этого файл JSON должен быть автоматически загружен, мы будем использовать его в следующих шагах.
2.b Поделиться документом
После создания учетной записи службы вам также нужно будет поделиться электронной таблицей с указанной учетной записью.
Вам придется сделать это для каждой электронной таблицы, которую вы хотите получить доступ с учетной записи услуг (идеальный мир будет иметь одну учетную запись услуг на электронную таблицу, но кто я должен судить вас?).
2.C настроен Ваши переменные окружающей среды
Теперь, когда ваша учетная запись службы полностью настроена, вы захотите использовать два поля из файла учетных данных: Client_email и Private_key Отказ Создать новый .env.yml.yml.yml Заменив эти два поля из файла JSON, который был загружен на шаге 2.А :
GOOGLE_SERVICE_ACCOUNT_EMAIL: spreadsheet-example@yourexample.iam.gserviceaccount.com GOOGLE_PRIVATE_KEY: "-----BEGIN PRIVATE KEY-----top-secret-do-not-share-----END PRIVATE KEY-----\n"
и включить его в свой Serverless.yml нравится:
provider:
name: aws
runtime: nodejs12.x
-
+ environment: ${file(.env.yml):}
Мы рассмотрим использование этих переменных от наших обработчиков с Spreadsheetauth Функция:
function spreadsheetAuth(document) {
return document.useServiceAccountAuth({
client_email: process.env.GOOGLE_SERVICE_ACCOUNT_EMAIL,
private_key: process.env.GOOGLE_PRIVATE_KEY.replace(/\\n/gm, '\n'),
});
}
3. Внедрить функцию записи
На данный момент мы должны иметь возможность запускать нашу функцию без сердечности, а также отсортированы аутентификация. В следующем обработке мы добавляем несколько проверок на ввод функции, и мы всегда будем писать лист с индексом 0, но он также может быть отправлен в качестве параметра.
module.exports.write = async event => {
console.log('Starting write function');
if(!event.body) {
return formatResponse(400, { message: 'body is missing' });
}
const body = JSON.parse(event.body);
if(!body.cells || !Array.isArray(body.cells)) {
return formatResponse(400, { message: '"cells" should be an array' })
}
// load up everything that's necessary to work with cells
await spreadsheetAuth(doc);
await doc.loadInfo();
const sheet = doc.sheetsByIndex[0];
await sheet.loadCells();
for(const { identifier, content } of body.cells) {
const cell = sheet.getCellByA1(identifier);
cell.value = content;
}
await sheet.saveUpdatedCells();
return formatResponse(200, { message: 'Cells saved successfully'});
};
4. Добавить функцию чтения
Поскольку мы уже пишем, почему бы не предлагать возможность читать ячейки из электронной таблицы тоже? Изменить Serverless.yml Файл и добавьте в конце файла следующее:
read:
handler: handler.read
events:
- http:
path: /read
method: GET
и добавить к нашему Handler.js Файл следующий метод:
module.exports.read = async event => {
console.log('Starting read function');
if(!event || !event.queryStringParameters || !event.queryStringParameters.cells) {
return formatResponse(400, { message: 'Invalid parameters' });
}
const cells = event.queryStringParameters.cells;
await spreadsheetAuth(doc);
await doc.loadInfo();
const sheet = doc.sheetsByIndex[0];
await sheet.loadCells();
const contents = cells.split(',').map(cell => sheet.getCellByA1(cell).value);
return formatResponse(200, { contents });
};
5. Развернуть его
Для того, чтобы проверить его, вы можете развернуть его с SLS развертывает Отказ Если развертывание было успешным, вы должны получать два конечных точка в пределах вывода терминала. Вы можете использовать скручиваемость, чтобы проверить это:
$ curl --location --request POST 'https://your.own.endpoint.com/write' \
--header 'Content-Type: application/json' \
--data-raw '{
"cells": [{"identifier": "A1", "content": "hello"}, {"identifier": "A2", "content": "world"}]
}'
Если вы хотите оба тестировать функцию чтения и проверить, как ожидалось, вы можете запустить:
$ curl --location --request GET 'https://your.own.endpoint.com/dev/read?cells=A1,A2'
6. Utils и комната для улучшений
Чтобы не продублирование нескольких строк кода в функциях, которые мы обсуждали здесь, я абстрагировал отзывчивый разбор в formatresponse функция. Вот как это выглядит:
function formatResponse(statusCode, payload) {
return {
statusCode: statusCode,
body: JSON.stringify(
payload,
null,
2
),
};
}
Есть еще часты, которые могут быть абстрагированы тоже в многоразовые компоненты, а для реального сценария, которые вы также можете подумать о перемещении читать и Напишите обработчики в разные файлы.
Я покрыл очень маленький пример, и есть много способов того, как это может быть улучшено. Существует несколько случаев для обработки ошибок, у меня намеренно оставляли примеры кода для простоты, такие как ошибки анализа JSON. Я нажал эти файлы на Репозиторий Если вы хотите проверить это. Для более сложных примеров о том, как редактировать форматирование клеток, добавление границ и удаления столбцов, вы могли бы проверить эти другие проекты, которые я нажал на GitHub:
A0Viedo/Долар-Историко
Наконец, я убежден большую часть документации по этой теме, заставляет его казаться сложнее, чем на самом деле. Если вы используете электронные таблицы в качестве хранилища данных или работаете в боковом проекте, который интегрирован с электронными таблицами самостоятельно, я хотел бы услышать об этом в комментариях.
Оригинал: “https://dev.to/a0viedo/writing-to-a-google-sheet-using-serverless-2ndc”