Рубрики
Без рубрики

Писать в Google листе с помощью серверу

Шаги для автоматизации записи в Google Lists. Tagged с серверусным, JavaScript, узел, электронные таблицы.

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

Мой опыт, просматривая Интернет для ресурсов о том, как использовать листы Google программно, не было то, что я ожидал, хотя. Большинство примеров, которые я мог найти, сосредоточены на чтении с электронных таблиц, а не писать на них.

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

Оглавление

  1. Создать новый проект
  2. Настройте аутентификацию
    • Создание вашей службы
    • Поделиться документом
    • Настройте вашу среду переменные
  3. Внедрить функцию записи
  4. Добавить функцию чтения
  5. Развернуть его
  6. 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”