서버 없이 5분만에! 웹사이트 문의 폼 구글 시트에 연동하기⚡️

서버 없이 문의 폼 구글 시트에 연동하기 with Google Apps Script

안녕하세요. 오랜만에 실용적인 글로 찾아온 융입니다😎!

여러분은 “내 웹사이트에서 사용자가 연락처나 이메일을 남길 수 있었으면 좋겠어.” 라고 생각해 보신 적 있으신가요? 서버 없이 정적인 사이트를 운영하고 계신 분들에게는 웹사이트에서 고객 문의를 받을 수 없다는 점이 큰 고민일 겁니다. 그런 분들을 위해 5분 만에 웹사이트 문의 폼을 구글 시트에 연동하는 방법을 알려드릴게요. 해당 방법은 Google Apps Script를 사용합니다. 준비물은 “구글 계정” 오직 하나뿐!

(이 글에서는 문의 폼 만들기와 폼 태그 관련 기본 지식에 대해서는 다루지 않습니다. 이미 소유하신 웹사이트에 문의 폼이 만들어져 있다고 가정하겠습니다.)



문의 폼 연동하기

자, 우선 목적부터 명확히 해볼까요. 우리가 하고 싶은 일은 ‘사용자가 웹사이트 문의 폼에 정보를 제출하면 자동으로 구글 시트에 기재되도록 하는 것’ 입니다. 이렇게요.

문의 폼 연동 예시

어렵지 않아요. 순서대로 따라와주세요.


1️⃣ 먼저, 구글 시트를 만들어봅시다.

  • 폼에서 받아올 정보에 맞춰 미리 세팅해 놓으면 좋아요. 저는 아래와 같은 형태로 미리 세팅을 해주었습니다.
  • ‘일시’ 항목은 입력받지 않고, 시트에 기재될 때 자동으로 넣어줄 거예요. 사용자가 언제 문의했는지 아는 게 편리하기 때문에, 시트에 추가하는 것을 추천합니다.

문의 폼 시트 예시

2️⃣ 그 다음은 메뉴에서 ‘확장 프로그램’ > ‘Apps Script’ 를 클릭하세요.

apps script 클릭

3️⃣ 그럼 아래와 같은 화면이 보입니다.

  • 식별을 위해 ‘제목 없는 프로젝트’ 부분을 클릭해서 원하는 이름으로 변경해주세요. (필수는 아닙니다.)

script 화면

4️⃣ 이제 스크립트를 작성할 차례입니다.

  • 기존 스크립트(myFunction 함수)를 모두 지우고 아래 스크립트를 붙여넣어 주세요.
  • doPost 함수는 HTTP POST 요청을 처리하는 데 사용됩니다. 여러분의 홈페이지에서 POST 메서드로 요청하면 이 함수가 실행됩니다. GET 메서드로 요청하려면 doGet 메서드를 사용하면 됩니다.
  • 문의 폼에는 고객의 개인정보가 담겨있으므로 내용이 주소창에 노출되지 않는 POST 방식을 사용하겠습니다.
function doPost(e) {
  try {
    const spreadsheet = SpreadsheetApp.openById('YOUR_SPREADSHEET_ID');  // --(1)
    const sheet = spreadsheet.getSheetByName('시트1');  // --(2)
    const newRow = sheet.getLastRow() + 1;
    const data = JSON.parse(e.postData.contents);
    const dateTime = new Date().toLocaleString();
    const rowData =
      [
        dateTime, //일시
        data.name,
        data.phoneNumber,
        data.inquiry
      ];  // --(3)

    // Write the form data to the spreadsheet
    for (let i = 1; i <= rowData.length; i++) {
      sheet.getRange(newRow, i, 1, 1).setValue(rowData[i - 1])
    }

    return ContentService
      .createTextOutput("success")
  } catch (error) {
    return ContentService
      .createTextOutput("fail")
  }
}

5️⃣ 스크립트에 필요한 내용을 채워줍시다.

  • (1) YOUR_SPREADSHEET_ID 에 여러분이 사용할 구글 스프레드시트 ID를 넣어주세요. 구글 시트 URL에서 /d/ 와 /edit 사이에 있는 값이 스프레드시트 ID입니다.
  • (2) 시트1 은 연결시킨 구글 시트의 활성화된 시트 이름을 넣어줍니다. 저는 기본값 그대로 ‘시트1’로 작성했습니다.
시트 명 적기
  • (3) rowData 배열에는 행에 기입할 순서대로 데이터를 적어줍니다. data.name, data.phoneNumber … 부분을 여러분의 문의 폼 name 속성값에 맞게 바꿔주세요. 저는 구글 시트에 열을 ‘일시, 성함, 연락처, 문의내용’ 순으로 배치했기 때문에 배열 순서도 똑같이 배치했습니다. 여러분의 시트 열 순서에 따라 수정해주세요.

    (제 코드에서는 form 데이터를 JSON.stringfy() 로 변환해서 보내고 있기 때문에 e.postData.contents 을 JSON.parse() 로 파싱 후 data.[name 속성 값]으로 꺼내오도록 했습니다. 다른 형식으로 데이터를 넘겨 주고 있다면 구글 앱 스크립트 가이드 에서 속성을 확인하여 사용해주세요.)

<form id="inqury-form">
	...
	<input type="text" name="phoneNumber"/> //input의 name 속성 값을 data. 다음에 기입해주세요 => data.phoneNumber
</form>

6️⃣ 스크립트 작성이 끝났다면, 그 위에 있는 ‘배포’ > ‘새 배포’를 눌러주세요.

  • 유형선택 ‘톱니바퀴 아이콘’ 클릭 > ‘웹 앱’을 선택합니다.
  • 배포 설정은 아래처럼 해주시면 됩니다. ‘다음 사용자 인증 정보로 실행’을 ‘나’를 선택하고, ‘엑세스 권한이 있는 사용자’를 ‘모든 사용자’로 설정해주세요. 이렇게 해야 고객이 내 홈페이지에서 문의폼을 보낼 때, 인증 관련 문제가 튀어나오지 않아요.
세팅
  • 설정이 끝났으면 ‘배포’를 눌러주세요.
  • ‘엑세스 승인’ 버튼이 나옵니다. 승인을 진행해주세요.
  • 배포가 완료되면 배포ID 와 웹 앱 URL 이 생성됩니다. 이 때 웹 앱 URL은 클라이언트에서 요청보낼 때 사용됩니다. 해당 정보는 ‘배포’ > ‘배포 관리’ 에서도 확인 가능합니다.

7️⃣ 자, 구글쪽 세팅은 끝났습니다. 이제 웹사이트에서 문의 폼 제출시 우리가 배포한 구글 앱 스크립트 URL 로 요청을 보내주면 됩니다.

  • 요청을 보내는 fetch 코드는 활용하는 스택에 따라 달라질 수 있습니다. 저는 next.js 와 typeScript를 사용하기에 아래와 같이 짰는데요. 단순 js 코드가 필요하시다면 아래 <script> 태그 안의 코드처럼 짜주면 됩니다.
  • (1) YOUR_WEB_APP_ID 에 여러분의 웹앱 URL을 넣어주세요. (배포 > 배포관리 > 웹앱 URL 을 복사하면 됩니다.)
const handleOnSubmit: FormEventHandler<HTMLFormElement> = async (e: FormEvent) => {
    e.preventDefault();
    if (!contactFormRef.current) return;
    const formData = new FormData(contactFormRef.current);
    const objData: { [key: string]: any } = {};
    formData.forEach((value, key) => (objData[key] = value));
    try {
      const response = await fetch(
        "YOUR_WEB_APP_ID", // --(1)
        {
          method: "POST",
          headers: { "Content-Type": "text/plain" },
          body: JSON.stringify(objData),
          redirect: "follow",
        }
      )
        .then((res) => res.text())
        .then((text) => text);

      if (response === "success") {
        (e.target as HTMLFormElement).reset();
        alert("문의가 전송되었습니다. 빠른 시일 내에 연락드리겠습니다.");
      } else {
        alert("문의 전송에 실패했습니다. 관리자에게 문의해주세요.");
      }
    } catch (error) {
      alert("문의 전송에 실패했습니다. 잠시후 다시 시도해주세요.");
    }
  };

단순 js 코드는 아래처럼 작성해주세요.

<script>
  const contactForm = document.getElementById("YOUR_FORM_ID");  //폼 태그의 아이디 값을 넣어주세요.
  contactForm.addEventListener("submit", async (e) => {
    e.preventDefault();
    const formData = new FormData(contactForm);
    const objData = {};
    formData.forEach((value, key) => (objData[key] = value));
    try {
      const response = await fetch(
        "YOUR_WEB_APP_ID",  // --(1)
        {
          method: "POST",
          headers: { "Content-Type": "text/plain" },
          body: JSON.stringify(objData),
          redirect: "follow",
        }
      );
      const text = await response.text();
      if (text === "success") {
        e.target.reset();
        alert("문의가 전송되었습니다. 빠른 시일 내에 연락드리겠습니다.");
      } else {
        alert("문의 전송에 실패했습니다. 잠시후 다시 시도해주세요.");
      }
    } catch (error) {
      alert("문의 전송에 실패했습니다. 잠시후 다시 시도해주세요.");
    }
  });
</script>

자, 이렇게 모든 절차가 마무리되었습니다.

이제 여러분의 웹사이트에서 문의 폼에 내용을 입력 후 제출해 보세요. 연결한 구글 시트에 입력한 내용이 쏙 들어와 있는 것을 확인하실 수 있을 거예요. 주의하실 점은 무료로 제공되는 서비스이다 보니, 하루 할당량이 정해져 있습니다. 자세한 한도 확인은 여기서 가능합니다.


마치며

서버 없이도 구글 스프레드시트를 DB처럼 활용할 수 있다는게 놀랍지 않으신가요? 문의 폼 이외에도 Google Apps Script를 활용하여 다양한 기능을 추가할 수 있습니다. 예를 들어, 구글 시트의 이메일 리스트에 자동으로 이메일을 발송하는 기능을 구현할 수도 있고, 매일 구글 애드센스 데이터를 시각화하고 문서화할 수도 있죠. 공식문서를 참고해서 여러분의 웹사이트에 다양하게 활용해보세요. 그럼, 다음에도 유용한 글로 찾아뵙겠습니다. 긴 글 읽어주셔서 감사합니다.🌸




참고자료 및 출처 Google Apps Script Guide ※ 사용된 도표 및 이미지는 자체 제작하였습니다.

디지엠유닛원 주식회사

  • 대표이사 권혁태
  • 개인정보보호책임자 정경영
  • 사업자등록번호 252-86-01619
  • 주소
    서울특별시 금천구 가산디지털1로 83, 6층 601호(가산동, 파트너스타워)
  • 이메일 unit1@dgmit.com