HTML 양식에서 Google 워크시트로 데이터 전송
18544 단어 serverlessfrontendnodehtml
그래서 나는 스스로 그것을 짓기로 결정했다.그렇게 어렵지 않겠지?
나는 이렇게 했다.
기술 창고
내가 전에 쓴 바와 같이 나는 창업 회사의 가장 이상적인 기술 조합은 네가 무엇으로 가장 빨리 일을 완성할 수 있느냐고 생각한다.나에게 있어서 이것은 MERN 창고의 변체로 Serverless을 숙주 프레임워크로 한다.
만약 당신이 이전에 서버 없는 응용 프로그램을 개발한 적이 없고, 당신의 입문을 도울 수 있는 것을 찾고 있다면, take a look at this boilerplate project I threw together.은 매우 기본적인 응용 프로그램이지만, 나는 많은 프로젝트에서 그것을 사용해서 시작합니다.
내가 이 프로젝트를 연구할 때의 주요 고려 요소는 다음과 같다.
마지막으로 내가 그린 기본 구조는 다음과 같다.
이 틀이 있으면 나는 모든 논리의 세부 사항을 깊이 이해해야 한다.
Google Sheets API 사용
내 HTTP 노드에는 다음과 같은 POST 로드가 있습니다.
{
"DOB": "6/20/1997"
"Name": "Jane Doe",
"Email": "[email protected]",
}
다음과 같이 종이로 변환해야 합니다.유일하게 주의해야 할 것은 값을 표의 열과 일치하게 정렬하고 표의 끝에 추가해야 한다는 것이다.간단해.
참고: 이 모든 예제에는 Google Sheets API, v4.이 사용됩니다.
https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/append
const { google } = require('googleapis');
class ExecuteSheetUpdateCommand {
/**
* @param {string} spreadsheetId ID of the Google Spreadsheet.
* @param {Object} data Object that contains the data to add to the sheet as key-value pairs.
* @param {google.auth.OAuth2} auth An Google OAuth client with a valid access token: https://github.com/googleapis/google-api-nodejs-client.
*/
static async exec(spreadsheetId, data, auth) {
const sheets = google.sheets({ version: 'v4', auth });
const rows = [data.Name, data.Email, data.DOB];
// Add our new data to the bottom of the sheet.
await sheets.spreadsheets.values.append({
spreadsheetId,
range: 'A1',
valueInputOption: 'RAW',
insertDataOption: 'INSERT_ROWS',
resource: {
values: [rows],
},
});
}
}
비올라!간단한 기능을 통해 우리는 자동으로 폼 데이터를 구글 폼에 비출 수 있다.분명히 이 함수는 좋지 않다.그것은 폼 헤더와 폼 구조를 결합시킨다.
const rows = [data.Name, data.Email, data.DOB];
너는 정말 이렇게 해서는 안 된다.예를 들어, 스프레드시트에서 열을 이동한 경우 이 함수는 이전 위치에 데이터를 계속 삽입하고 내 워크시트에 잘못된 데이터가 있을 수 있습니다.그러나 폼 필드를 도면 제목에 자동으로 비추는 것은 좀 복잡하다. 이 예시를 위해서 나는 이 부분을 생략할 것이다.SQS Worker를 사용하여 REST 끝점 추가
좋습니다. JSON 객체를 Google 워크시트로 보낼 수 있는 함수가 있습니다. 하지만 HTML 폼은 어떻게 사용합니까?정답은 HTTP+SQS입니다.
Node 및 Express에 익숙하면 HTTP 섹션이 상당히 간단합니다.(다른 노드의 우호적인 환경에 쉽게 배치할 수 있지만, 서버와 AWS를 사용하지 않는 방법을 보여 드리겠습니다.)aws-serverless-express 패키지를 사용하여 express 응용 프로그램을 서버 없는 Lambda 기능으로 발송합니다.serverless-api-cloudfront 패키지와 결합하여 확장 가능한 API를 구축하는 것은 매우 쉽다.
다음은 Google 워크시트 업데이트를 시작하는 빠른 HTTP 끝점입니다.
const express = require('express');
const bodyParser = require('body-parser');
// An AWS SQS client
const sqsClient = require('./clients/SQSClient');
const app = express();
app.use(bodyParser.urlencoded({ extended: true }));
app.post('/form/:spreadsheetId', async (req, res, next) => {
const { spreadsheetId } = req.params; // The Google Sheet ID
const { body } = req; // The post body
/* Note: You should run your own custom validation on the
* form before forwarding it on. In this example we just continue.
*
* At a minimum, make sure you have permission to update the
* sheet, otherwise this will break downstream.
*/
const passedValidation = true;
if(passedValidation) {
// Send the data to our SQS queue for further processing
await sqsClient.createEntry.sendMessage({
spreadsheetId,
body,
});
} else {
throw new Error('Invalid form data');
}
res.status(200).send('Submitted your form');
});
그리고 Lambda 함수는 제한된 SQS FIFO 대기열에서 데이터를 추출하여 구글을 위해 처리합니다.const { google } = require('googleapis');
const ExecuteSheetUpdateCommand = require('../commands/ExecuteSheetUpdateCommand');
exports.handle = async (event, context, callback) => {
const messages = event.record.body;
// This little logic helps us throttle our API interactions
messages.reduce(async (previousPromise, nextMessage) => {
await previousPromise;
const { spreadsheetId, body } = nextMessage;
const accessToken = /* Load a valid access token for your Google user */;
// Construct an oAuth client with your client information that you've securely stored in the environment
const oAuth2Client = new google.auth.OAuth2(
process.env.GOOGLE_CLIENT_ID, process.env.GOOGLE_CLIENT_SECRET, null,
);
oAuth2Client.setCredentials({
access_token: accessToken,
});
await ExecuteSheetUpdateCommand.exec(spreadsheetId, body, oAuth2Client);
return new Promise((resolve) => {
setTimeout(resolve, 1000); // Throttle for the Google API
});
}, Promise.resolve());
callback();
};
HTTP 노드에서뿐만 아니라 SQS with FIFO을 사용하는 이유는 양식을 제출한 사용자에게 신속하게 응답하고 API 제한을 준수하는 동시에 양식을 빨리 업데이트할 수 있기 때문이다.API 제한을 고려하지 않으면 사용자가 양식을 제출하면 오류 화면이 표시됩니다.안 좋아요.Google Sheets API의 제한은 "사용자당 100초당 100개의 요청"또는 1초당 1개의 요청 속도는 우리가 안전하게 상호작용할 수 있는 속도입니다.
SQS FIFO queues은 작업표 업데이트를 한 줄에 놓고 사용자 id에 따라 그룹을 나눌 수 있도록 합니다. 그리고 위의
messages.reduce
세션을 사용하여 이 실행을 제한할 수 있습니다. 이것은 요청/초/사용자의 제한을 초과하지 않도록 합니다.우리는 또한 AWS가 흐름을 줄이는 힘든 일을 할 수 있도록 하는 추가적인 장점을 얻었다.관건은 FIFO 대기열을 채울 때 MessageGroupId
을 OAuth 요청을 보내는 Google 사용자 id로 설정하는 것입니다.그것을 싸라
이러한 기술과 기능을 결합하여 다음과 같은 HTML 양식을 작성할 수 있습니다.
<form action="https://<my-express-endpoint>/form/<my-sheet-id>" method="post">
<input type="email" name="Email" placeholder="Enter your email" required />
<input type="name" name="Name" placeholder="Enter your name" required />
<input type="submit" value="Submit" />
</form>
제출할 때마다 데이터가 당신의 구글 폼에 신기하게 나타난다.원숭이
좋아, 이것은 내가 상상한 것보다 훨씬 많아.이것이 바로 내가 마침내 그것을 little indie product으로 만든 이유다.만약 HTML 폼을 구글 폼에 보내고 번거롭게 자신의 해결 방안을 구축하고 싶지 않다면 Sheet Monkey에서 구축한 내용을 보십시오.
Reference
이 문제에 관하여(HTML 양식에서 Google 워크시트로 데이터 전송), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/levinunnink/sending-data-from-a-html-form-to-a-google-sheet-3m42
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(HTML 양식에서 Google 워크시트로 데이터 전송), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/levinunnink/sending-data-from-a-html-form-to-a-google-sheet-3m42텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)