KPN 웹사이트를 Google Sheets와 연동하여 참여 신청 및 커뮤니티 인사이트를 저장하는 방법을 안내합니다.
- Google Sheets 접속
- 새 스프레드시트 생성:
KPN_Members - 첫 번째 시트 이름:
참여신청 - 첫 행(헤더)에 다음 항목 입력:
A1: timestamp
B1: nickname
C1: email
D1: region
E1: interests
- 같은 스프레드시트에 새 시트 추가:
커뮤니티인사이트 - 첫 행(헤더)에 다음 항목 입력:
A1: timestamp
B1: nickname
C1: insight
- 스프레드시트에서
확장 프로그램>Apps Script클릭 - 새 프로젝트 이름:
KPN_FormHandler
기존 Code.gs 파일의 내용을 삭제하고 아래 코드를 붙여넣기:
// KPN - Google Apps Script 폼 핸들러
function doPost(e) {
try {
const sheet = SpreadsheetApp.getActiveSpreadsheet();
const params = e.parameter;
// 참여 신청 폼인지 인사이트 폼인지 구분
if (params.insight) {
// 커뮤니티 인사이트
return handleInsight(sheet, params);
} else if (params.email) {
// 참여 신청
return handleJoin(sheet, params);
} else {
throw new Error('잘못된 요청입니다.');
}
} catch (error) {
return ContentService
.createTextOutput(JSON.stringify({
status: 'error',
message: error.toString()
}))
.setMimeType(ContentService.MimeType.JSON);
}
}
// 참여 신청 처리
function handleJoin(sheet, params) {
const joinSheet = sheet.getSheetByName('참여신청');
if (!joinSheet) {
throw new Error('참여신청 시트를 찾을 수 없습니다.');
}
const timestamp = new Date();
const nickname = params.nickname || '';
const email = params.email || '';
const region = params.region || '';
const interests = params.interests || '';
// 새 행 추가
joinSheet.appendRow([timestamp, nickname, email, region, interests]);
return ContentService
.createTextOutput(JSON.stringify({
status: 'success',
message: '참여 신청이 완료되었습니다.'
}))
.setMimeType(ContentService.MimeType.JSON);
}
// 커뮤니티 인사이트 처리
function handleInsight(sheet, params) {
const insightSheet = sheet.getSheetByName('커뮤니티인사이트');
if (!insightSheet) {
throw new Error('커뮤니티인사이트 시트를 찾을 수 없습니다.');
}
const timestamp = new Date();
const nickname = params.nickname || '익명';
const insight = params.insight || '';
// 새 행 추가
insightSheet.appendRow([timestamp, nickname, insight]);
return ContentService
.createTextOutput(JSON.stringify({
status: 'success',
message: '인사이트가 공유되었습니다.'
}))
.setMimeType(ContentService.MimeType.JSON);
}
// GET 요청 처리 (테스트용)
function doGet(e) {
return ContentService
.createTextOutput('KPN Form Handler is running.')
.setMimeType(ContentService.MimeType.TEXT);
}- 디스크 아이콘 클릭 또는
Ctrl+S(Mac:Cmd+S) - 프로젝트 저장 확인
- 우측 상단
배포>새 배포클릭 - 톱니바퀴 아이콘 클릭 >
웹 앱선택 - 설정:
- 설명:
KPN Form Handler v1 - 다음 계정으로 실행:
나 - 액세스 권한:
모든 사용자(로그인 불필요)
- 설명:
배포클릭
액세스 승인클릭- Google 계정 선택
고급>[프로젝트 이름](안전하지 않음)으로 이동클릭허용클릭
배포 완료 후 표시되는 웹 앱 URL을 복사합니다.
예시: https://script.google.com/macros/s/AKfycbz.../exec
data/submit.js 파일을 열고 다음 줄을 수정:
// 수정 전
const SCRIPT_URL = 'YOUR_GOOGLE_APPS_SCRIPT_URL_HERE';
// 수정 후 (복사한 웹 앱 URL 붙여넣기)
const SCRIPT_URL = 'https://script.google.com/macros/s/AKfycbz.../exec';- 웹사이트 실행 (로컬 또는 배포 환경)
join.html페이지에서 참여 신청 테스트community.html페이지에서 인사이트 공유 테스트- Google Sheets에서 데이터가 정상적으로 추가되는지 확인
커뮤니티 인사이트를 실시간으로 웹사이트에 표시하려면 Google Sheets를 JSON으로 퍼블리시해야 합니다.
- Google Cloud Console 접속
- 새 프로젝트 생성:
KPN_API API 및 서비스>라이브러리이동Google Sheets API검색 및 활성화
사용자 인증 정보메뉴사용자 인증 정보 만들기>API 키선택- API 키 복사 (안전하게 보관)
- KPN_Members 스프레드시트 열기
- 우측 상단
공유클릭 일반 액세스>링크가 있는 모든 사용자선택- 권한:
뷰어 - 스프레드시트 ID 복사 (URL의
/d/뒤에 있는 긴 문자열)
예시 URL: https://docs.google.com/spreadsheets/d/[SPREADSHEET_ID]/edit
data/fetch_insights.js 파일을 열고:
// 수정 전
const SHEETS_JSON_URL = 'YOUR_GOOGLE_SHEETS_JSON_URL_HERE';
// 수정 후
const SHEETS_JSON_URL = 'https://sheets.googleapis.com/v4/spreadsheets/[SPREADSHEET_ID]/values/커뮤니티인사이트?key=[YOUR_API_KEY]';- 스프레드시트에서
파일>공유>웹에 게시 커뮤니티인사이트시트 선택- 형식:
웹 페이지또는CSV 게시클릭- 생성된 URL을
fetch_insights.js에 입력
- API 키 노출 방지: 클라이언트 사이드에서 API 키를 사용할 때는 도메인 제한 설정 필요
- Apps Script URL: 웹 앱 URL은 공개되어도 괜찮지만, 스팸 방지를 위해 reCAPTCHA 추가 권장
- 개인정보: 이메일 등 민감한 정보는 Sheets 접근 권한 철저히 관리
- 스팸 방지: 필요시 Apps Script에 rate limiting 추가
- Apps Script URL이 올바른지 확인
- 브라우저 콘솔(F12)에서 에러 메시지 확인
- Apps Script 실행 로그 확인 (
실행>실행 로그) - CORS 문제일 경우 Apps Script 재배포
- 시트 이름이 정확한지 확인 (
참여신청,커뮤니티인사이트) - 헤더 행이 올바른지 확인
- Apps Script 권한 재승인
- JSON URL이 올바른지 확인
- 스프레드시트 공유 설정 확인 (링크가 있는 모든 사용자)
- 브라우저 콘솔에서 fetch 에러 확인
- API 키가 활성화되어 있는지 확인
참여 신청 시 자동으로 Slack 초대 이메일을 발송하려면 Google Apps Script에 이메일 발송 함수를 추가해야 합니다.
-
Apps Script 편집기 열기
- Google Sheets에서
확장 프로그램→Apps Script클릭
- Google Sheets에서
-
sendWelcomeEmail 함수 추가
- 기존
doPost함수 아래에 다음 함수 추가:
- 기존
function sendWelcomeEmail(email, nickname) {
const subject = 'Korea Preppers Network에 오신 것을 환영합니다';
const body = `안녕하세요, ${nickname}님!
Korea Preppers Network (KPN)에 참여해주셔서 진심으로 감사드립니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🎯 KPN의 주요 소통 채널은 Slack입니다
저희는 아직 초창기 단계로, 함께 커뮤니티를 만들어가고 있습니다.
생존 지식을 나누고, 실질적인 대비 전략을 함께 고민하는 공간을
한 걸음씩 구축해 나가고자 합니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📨 Slack 채널 초대장이 발송되었습니다
아래 링크를 클릭하여 KPN Slack 워크스페이스에 참여하세요:
👉 https://join.slack.com/t/koreapreppersnetwork/shared_invite/zt-3ggvvn07k-R_8iVfj6fDD0~1dNdj6HGQ
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
💬 Slack에서 할 수 있는 것들:
• 다른 준비자들과 실시간 소통
• 생존 지식 및 경험 공유
• 재난 대비 질문 및 토론
• 지역별 커뮤니티 연결
• 최신 정보 및 업데이트 수신
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🌐 KPN 웹사이트: https://your-vercel-site.vercel.app
📚 생존 지식: https://your-vercel-site.vercel.app/knowledge.html
📋 시나리오: https://your-vercel-site.vercel.app/scenario.html
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
함께 준비하고, 함께 살아남읍시다.
- Korea Preppers Network 팀 드림
P.S. 이 이메일에 회신하시면 저희가 직접 답변드립니다.`;
try {
MailApp.sendEmail({
to: email,
subject: subject,
body: body
});
Logger.log('Welcome email sent to: ' + email);
} catch (error) {
Logger.log('Email sending failed: ' + error);
}
}- doPost 함수에 이메일 발송 코드 추가
joinSheet.appendRow(...)다음 줄에 추가:
// 이메일 발송
sendWelcomeEmail(email, nickname);-
저장 및 실행
- 저장 아이콘 클릭 (💾)
doPost함수 선택 후 "실행" 버튼 클릭
-
권한 검토
- "권한 검토" 대화상자가 나타남
- 본인의 Google 계정 선택
-
고급 옵션으로 진행
- "고급" 링크 클릭
- "[프로젝트 이름] (안전하지 않음)으로 이동" 클릭
-
권한 허용
- "허용" 버튼 클릭
- Gmail 전송 권한 승인
권한을 추가한 후에는 웹 앱을 다시 배포해야 합니다:
- 오른쪽 상단 "배포" → "배포 관리" 클릭
- 현재 배포 옆의 연필 아이콘(✏️) 클릭
- "버전" → "새 버전" 선택
- "배포" 버튼 클릭
- 하루 100통 제한: 일반 Gmail 계정은 하루 100통까지만 발송 가능
- 초기 단계에는 충분: MVP 단계에서는 문제없음
- 대량 발송 시: Gmail API 또는 SendGrid 등 전문 서비스 사용 권장
💡 팁:
- 이메일 제목과 본문은
sendWelcomeEmail함수에서 자유롭게 수정 가능 - Vercel URL은 실제 배포된 사이트 주소로 변경하세요
- 이메일 전송 실패 시
Logger.log로 오류 확인 가능 (Apps Script 편집기 → "실행 로그" 탭)
- 웹사이트에서 참여 신청 제출
- 입력한 이메일로 환영 메일 수신 확인
- Slack 링크 클릭하여 참여 확인
- Google Apps Script 공식 문서
- Google Sheets API 문서
- MailApp 문서
- KPN 커뮤니티에서 질문하기
작성일: 2025-10-18
최종 업데이트: 2025-01-19
버전: 1.1