본문 바로가기

HTML

정적 HTML form태그에서 메일보내기 : Google Apps Mail

html에서 mailto를 사용하면, 구현은 물론 간단합니다만 outlook과 같은 쓸데없는 프로그램을 실행해 사용자에게 불편을 초래합니다. 

아래와 같이 서버 없는 순수 HTML과 자바스크립트로 메일보내기를 구현할 수 있습니다.

사용자는 계정에 로그인하고 메일을 보내는 귀찮음 대신 웹페이지의 양식대로만 입력해 쉽고 빠르게 메일을 보낼 수 있습니다.


아래 문서는 https://github.com/dwyl/html-form-send-email-via-google-script-without-server 를 번역한 것입니다.

이곳에서도 보실 수 있습니다. 오역 및 오타는 댓글로 남겨주세요.


Google Apps Mail을 사용해 정적 HTML Form에서 메일을 보내세요!

백엔드 서버 없이 HTML Form을 사용하여, "Contact Us" 메시지를 보내는 스텝-바이-스텝 예제 입니다.

  • PHP, Python, Ruby, Java, Node.js 등은 필요없습니다.

작동 예제는 이곳에서 : https://dwyl.github.io/learn-to-send-email-via-google-script-html-no-server/

경고: Google의 API는 하루에 보낼 수 있는 메일 수에 제한이 있습니다. Google 계정에 따라 다를 수 있습니다, 이곳에서 본인의 한도를 확인하세요. 데이터가 항상 스프레드시트에 추가되고 메일로 전송되므로 가능하면 Part 3을 통해 이 튜토리얼을 고대로 구현하는 것을 추천합니다.

Why?

우리는 서버가 없거나 원하지 않을 때 "정적" HTML 페이지에서 email을 보내는 방법이 필요했습니다.

핵심 이점들

  • 배포/유지/지불을 위한 백엔드 서버가 필요없습니다.
  • 완전한 사용자 정의 가능 : 모든 측면에서 커스터마이징이 가능합니다!
  • 어디에서나 허용 목록에 포함된 Google Mail 을 통해 보내는 Email (높은 전송 성공률)
  • 어떤 데이터든 쉽게 볼 수 있는 스프레드시트 에 수집/저장합니다. (코딩을 전혀 모르는 사람과 공유해야하는 경우도 완벽합니다.)

What?

쉽지만 유지보수가 필요한 서버를 이용해 이메일을 보내는 대신, 사용자를 대신하여 Google로 메일을 보내고 Google 스프레드시트를 사용해 데이터를 추적하세요!

당신은 데이터 전송 위치를 신경 쓰지 않고 귀하의 받은편지함 (지저분한... 웩!)에서 제출된 데이터를 관리하려는 경우 http://formspree.io/와 같은 "무료" 서비스를 사용할 수도 있습니다. 또는 ... 몇 분을 투자하여 데이터를 비공개로 관리 할 수 ​​있습니다. 선택은 여러분 몫입니다.

How?

1. Sample Spreadsheet를 복사하세요.

Sample: https://docs.google.com/spreadsheets/d/1Bn4m6iA_Xch1zzhNvo_6CoQWqOAgwwkOWJKC-phHx2Q/copy

당신의 Google 계정에 로그인하고 "사본 만들기"를 클릭합니다.

1-make-copy

아래와 같이 나와야 됩니다:

2-copy-of-sheet

참고 : 복사본 이름을 원하는대로 변경해도 결과에 영향을 미치지 않습니다.

2. 스크립트 편집기를 여세요.

"도구" > "스크립트 편집기..."를 눌러 편집기를 여세요.

2 script-editor

필요한 스크립트의 스냅샷은 다음과 같습니다 : google-script-just-email.js

3. 스크립트에서 TO_ADDRESS 를 설정합니다.

경고: 만약 당신이 주석처리를 제거하지 않고 To_ADDRESS 값으로 당신의 이메일을 설정하지 않으면, 웹 skill을 가진 사람이 당신의 form과 Email을 보내는 데이터를 수정하여 임의의 이메일로 보낼 수 있습니다.

이 위험은 그리 높지 않을 수 있습니다. 이 위험을 감수하면서 당신의 HTML Form 내에서 메일 변수를 data-email 속성으로 설정하는 편의성을 원한다면 이 주석처리된 변수를 내버려둘 수 있습니다. 이렇게 하면 2-6단계를 거치지 않고도 HTML form에서 이메일을 보낼 주소를 쉽게 변경할 수 있습니다. 이 기능을 사용하려면 제공된 .js 파일을 Part2, 10단계에서 사용해야 합니다.

만약 이 잠재적인 위험을 원하지 않으면, TO_ADDRESS의 주석을 제거하세요. 그리고 form태그에서 submit할 때 데이터를 받을 이메일을 변수의 값으로 넣으세요.

3-script-editor-showing-script

4. 스크립트의 새로운 버전 저장

"버전 관리 ..." 를 클릭해세요.

19 google-script-no-save-new-version

그리고 새로운 버전을 만듭니다. 이름은 원하는대로 지정하세요.

20 google-script-save-new-version

5. 업데이트된 스크립트를 웹 앱으로 배포

20 a-publish

배포 할 최신 프로젝트 버전을 선택합니다.

⚠️ 참고: '웹에 액세스할 수 있는 사용자' 드롭다운에서 누구나, 익명 사용자 포함 옵션을 선택해야 합니다. 다른걸 선택하면 form 응답이 스프레드시트에 추가되지 않을 것입니다. ⚠️

21 deploy-new-version

6. 이메일을 보내기 위해 스크립트를 인증합니다.

5 auth-required

5-allow-sending-emails

웹 앱 URL을 클립보드 혹은 메모장에 복사하시고 "확인"버튼을 누르세요.

22 1-deploy-as-web-app

7. 기본 HTML Form 만들기

이 레포지토리의 index.html 템플릿을 사용하여, 기본 form 형식을 가진 html 파일을 만드세요.

⚠️ 만약 이 레포지토리의 예제가 아닌 직접 작성한 form을 벌써 사용하려고 한다면:

  • 각각의 form 요소 name 속성은 Google 시트의 컬럼네임과 같아야 합니다.

  • form태그의 class는 gform이 되어야 합니다. 즉, <form class = "gform">

    • 나중에 이걸 변경하려고 한다면, form-submission-handler.js의 고유버전을 만들고 id를 고쳐야 됩니다.

Form태그의 action 속성을 전 단계에서 복사해놓은 URL로 고쳐야 함을 잊지 마세요.

7-html-form

8. 브라우저에서 HTML Form (페이지) 열기

HTML Form에서 테스트 데이터를 채우세요:

html form

Submit 하세요. 보내졌으면 아래와 같이 확인할 수 있습니다: (실패하면 "result":"error"가 됩니다.) form sent

9. 아까 설정했던 메일주소로 들어가 받은편지함을 확인해 보세요.

(위의Step 3에서 설정했던 이메일 계정의 받은편지함을 열어보세요.

email received

. 이게 전부입니다. HTML form 태그만을 이용해 이메일 보내기에 성공했습니다.

파트 2 - 이쁘게 하고싶어..

우리 스타일에 순수 CSS를 사용해 이 Super Lean 을 유지할 겁니다 (step 8의 "못생긴" HTML Form태그를 고쳐요). 그리고 독자분의 페이지/사이트에 사용자를 유지하기 위해 Form태그 양식을 submit할 때 JQuery "AJAX" 를 사용하겠습니다 ("구린" 응답페이지는 빼구요).

10. JavaScript 와 "AJAX" 를 사용한 양식 제출 + 11. 양식이 제출될 때 나오는 메시지 커스터마이징하기

페이지가 JSON 응답/결과로 변경되지 않도록 하려면 ***AJAX***를 사용하여 양식을 제출해야 합니다.

파일 끝 (*</body> 태그 닫기 전)에 다음 JavaScript 파일을 포함하도록 index.html을 업데이트합시다.

<script data-cfasync="false" type="text/javascript"
src="https://cdn.rawgit.com/dwyl/html-form-send-email-via-google-script-without-server/master/form-submission-handler.js"></script>

경고: 위의 3단계에서 TO_ADDRESS 변수를 설정하지 않은 경우, 메인 form 요소에 data-email="example@email.net"를 포함시켜야 됩니다. 자세한 내용은 아래 양식을 확인하세요. 설정하셨다면 이 속성은 필요하지 않습니다.

thankyou_message div를 만들어 직접 메시지를 만드세요: 해당 div의 위치는 <form> 태그의 안에 속하게 하세요. 

<div style="display:none" class="thankyou_message">
 <!-- You can customize the thankyou message by editing the code below -->
 <h2><em>Thanks</em> for contacting us! We will get back to you soon!
 </h2>
</div>

이제 양식이 제출되면 "Thank You" 메시지가 띄워집니다:

thankyou message

사용자를 새로고침 없이 같은 페이지에 유지시키세요. 

해당 기능을 위해 <form>태그 안의 제출 버튼에서 type="submit" 속성이 없어야 합니다. 

https://github.com/dwyl/learn-to-send-email-via-google-script-html-no-server/blob/master/index.html 파일을 참고하세요.

12. CSS를 사용해 Form을 멋지게 만들기

이번 예제에서는 순수 CSS : http://purecss.io/start/ 를 사용하고 있습니다. 적은 용량 (4.0KB 축소 및 압축된)과 현재 "문제"(보기에 구린)를 해결하기 때문입니다.

PureCSS-Logo-Intro

PureCSS-module-sizes

이 작업에 너무 많은 시간을 들이지 않고도 양식을 훨씬 멋지게 만들 수 있습니다:

contact form with pure css

13. 이메일도 멋지게 만드세요!

기본적으로 보낸 이메일의 본문에는 양식의 key-value 쌍이 포함되며, key는 <h4>이고 value는 <div>입니다. 이것은 베이직하지만, 데이터를 보기엔 어색합니다.

아마 대충 이런 형식의 메일을 받았을 겁니다:

Nicely formatted email

이 과정은 진행 중이며 잠재적으로 기대한 이메일보다 더 많은 메일을 받을 수 있음을 명심하세요. form으로 보내진 모든 데이터에 대해 이메일 내용이 반복되므로 봇이나 악의적인 사용자가 보내기를 결정하면 요청 이상의 메일이 쌓일 겁니다. 현재는 주의하여 사용하세요. 현재 개선사항을 준비중입니다.

스크립트 편집기를 통해 이를 수정할 수 있습니다. 이 부분입니다:

result += "<h4 style='text-transform: capitalize; margin-bottom: 0'>" + key + "</h4><div>" + obj[key] + "</div>";

이게 우리에게 필요한 전부이며, 마크업을 독자분에게 맞게 조정할 수 있습니다. 우리는 <h4>태그를 메일에 가장 적합한 크기로 선택했기 때문에, 대소문자(key들은 JavaScript 객체에서 모두 소문자입니다)와 약간의 기본 간격을 고정하기 위해 약간의 CSS를 추가했습니다. inline style은 일반적인 웹 페이지에서는 죄악이지만 우리가 이 예제에서 CSS를 수행하려면 유일한 방법입니다. 또한 우리는 value 부분에 무엇이든-단일 행이든, 여러 행이든-대응할 수 있도록 <div>를 사용했습니다(예를 들어 <p>태그는 그걸 잘라내지 않습니다).

추가로, 우리에겐 기본적으로 주석처리 되어 있는 sendEmail() 메소드에 대한 replyTo 옵션이 있습니다.

MailApp.sendEmail({
  to: TO_ADDRESS,
  subject: "Contact form submitted",
  // replyTo: String(mailData.email), // This is optional and reliant on your form actually collecting a field named `email`
  htmlBody: formatMailBody(mailData)
});

이메일에 답장 필드를 추가하려는 경우 주석처리를 제거할 수 있습니다. 스크립트의 예제는 reply-to를 양식에 제출된 메일로 설정합니다. 관심이 있다면 Google의 설명서에서 MailApp.sendEmail (예 : cc / bcc 등)에 대한 자세한 정보를 제공합니다:

https://developers.google.com/apps-script/reference/mail/mail-app

파트 3 - 스프레드시트에 제출된 Contact Form 데이터 저장하기

독자분의 메일함에 Form 데이터를 다이렉트로 보내는 것도 좋은 첫번째 단계지만, 우리는 더 잘할 수 있습니다. 또한 위에 언급한 것처럼, Google은 하루에 보낼 수 있는 이메일 수에 제한이 있습니다. 따라서 데이터를 스프레드시트에 저장하는 것이 안전하며 데이터 손실을 줄일 수 있습니다.

14. Google Apps 스크립트에 record_data 기능 추가하기

record_data example

이렇게 하면 POST로 받은 데이터가 스프레드시트의 *행(row)*으로 기록됩니다. 참고: 다음 파일을 이용해 full code를 복붙할 수도 있습니다. google-apps-script.js

15. 새로운 버전 저장하고 재배포하기

새로운 버전을 저장하고 스크립트를 재배포 하기 위해 위의 4, 5 단계 & 6 단계를 다시 따라하세요.

16. 양식 재검사하기

submit the form

17 데이터가 스프레드 시트에 삽입되었는지 확인

17-confirm-data-inserted

라이브 서버 (당신의 localhost)

Because we are loading external .js files, our web browser 외부 *.js 파일들을 로드하고 있기 때문에 우리의 웹브라우저는 로컬 디렉토리에서 index.html을 열지 않습니다. (파일로 실행시켜 단순 웹브라우저로 테스트하지 마세요.)

터미널을 열고 다음 커맨드를 실행해 node 모듈을 설치하고 live 서버* 를 시작하세요:

npm install live-server --save-dev && node_modules/.bin/live-server --port=8000

설치하는데 1분 정도 걸리고, 완료되면 당신의 live-server가 시작됩니다.

포트 8080에서 node.js HTTP 서버가 시작되고 방금 만들었던 양식이 기본 브라우저에서 열립니다. style.css의 form style 혹은 form-submission-handler.js의 클라이언트 측 자바스크립트를 업데이트하려면, GitHub가 아닌 로컬로 해당 자원을 로드하도록 index.html을 편집하세요.

참고: 이건 절대적인 초보자를 위한 Node.js의 맛보기 입니다. 이 양식을 "배포"하기 위해 node.js가 무조건 필요한 것은 아니며, HTML / CSS / JavaScript를 제공하는 모든 웹 서버에서 실행할 수 있습니다. 이전에 Node.js를 사용한 적이 없다면 http://nodeguide.com/beginner.html을 참조하세요. 하지만 이 연습 (서버가 없는 양식 제출) 을 위해 node.js 또는 live-server는 필요하지 않습니다. 그러나 IDE에서 편집기에서 변경 사항을 적용 할 때 페이지를 자동으로 다시 로드하기 때문에 있으면 좋아요.

참고: VS Code 혹은 Bracket 을 사용하신다면 Live Server 와 같은 플러그인을 통해 실행하는 것이 간편합니다.

Want more?

이 튜토리얼보다 더 많은 것을 알고 싶다면, 알려주세요!

독자분의 편의를 위해 GitHub Pages에서 데모페이지를 호스트해 두었습니다. 코드를 확인하고 작동 방식을 확인하세요 :https://dwyl.github.io/html-form-send-email-via-google-script-without-server/

당신만의 필드를 추가하세요!

Henry Beary의 요청에 따라 form 처리기를 제네릭으로 만들어 원하는 필드를 추가할 수 있도록 했습니다..

또한 모든 종류의 form input 요소를 사용하는 test.html도 만들었으므로 원하는대로 요소를 복붙할 수 있습니다. 요소의 name과 id 속성들만 업데이트하면 됩니다. 이 테스트 양식의 작동예제는 이곳에서 확인할 수 있습니다:https://dwyl.github.io/html-form-send-email-via-google-script-without-server/test.html

class가 gform 인 form태그 내에 필드를 포함시키고 양식 요소의 이름이 스프레드 시트의 새로운 열 제목과 일치하는지 확인하세요! 즉 :

<fieldset class="pure-group">
  <label for="color">Favourite Color: </label>
  <input id="color" name="color" placeholder="green" />
</fieldset>

위 코드는 사용자가 선호하는 색을 받아볼 수 있게 해줍니다. 즉: new-field-contains-data

질문이 더 있으면 알려주세요!

스팸 방지

스팸으로 분류되는 것을 피하고 Google Apps 사용 할당량을 채우기 위해, 우리는 Honeypot이라고 하는 간단한 스팸방지 기술을 구현할 겁니다. 이 기술은 필수적으로 숨겨진(hidden) textfield를 만드며, 이 textfield가 채워지면 스팸 봇으로 간주하여 양식을 차단합니다.

<form action="https://script.google.com/macros/s/..." method="post">
  <!--input 태그의 id는 honeypot 등 실제 작동하지 않는 id여야 합니다-->
  <label class="sr-only">Keep this field blank</label>
  <input id="honeypot" type="text" name="honeypot" value="" />
  <!--나머지 form태그 요소들-->
</form>
#honeypot {
  display: none; /*일반적인 사용자에게 보이지 않도록 숨기세요*/
}
/* form-submission-handler.js */
/* 이 if문에서 주석을 제거하세요 */

if (validateHuman(data.honeypot)) {  //이 부분이 채워져 있으면, 제출되지 않습니다.
  return false;
}

자주 묻는 질문들 (FAQ's)

  1. 이 자습서를 사용할 때 도움을 받으려면 어떻게 하나요?
  • 어떤 단계를 거쳤으며 어떤 단계가 효과적이지 않은지 상세하게 설명하는 문제를 게시하세요. 온라인으로 겪으신 문제를 재현하는 예제가 가장 이상적입니다 (예 : GitHub Pages 또는 CodePen의 호스트). 예를 들어 콘솔 오류를 제공하면 도움이 되는 응답을 받을 가능성이 높아집니다.
  1. 예제 스프레드시트에 대한 수정권한을 얻을 수 있을까요?
  • 아니요. 다른 사람이 복사 할 수있는 작업 예제를 보여주기 위해 사용되고 있으며 편집 가능한 버전은 실수로 또는 악의적으로 모든 사용자가 손상시킬 수 있습니다.
  1. 제출(submit)을 클릭하면 웹 페이지 포워딩이 여러 텍스트로 전송되는 이유는 무엇입니까?
  • AJAX를 통해 데이터를 제출하는 데 필요한 자바 스크립트를 제대로 로드하지 않았거나 브라우저가 AJAX를 지원하지 않습니다. 파트2에서 오류를 발견 할 경우를 대비하여 콘솔 로그를 확인하세요.
  1. 웹페이지에서 양식을 성공적으로 제출되지 않는 이유가 뭘까요?
  • Javascript 콘솔 로그를 확인하세요. 우리가 제공한 Javascript를 읽는 동안 오류가 있을 수 있습니다. 또는 양식을 제출하는 동안 오류가 있을 수 있습니다. Google Script 파일 내에 TO_ADDRESS 변수를 설정하지 않은 경우 form태그의 class가 gform이어야하며 데이터 이메일 속성이 필요합니다. 또한 제공되는 Javascript 코드는 확인을 위해 사용하는 전자 메일 양식 요소, 부적절한 전자 메일을 제출할 때 해당 요소에 대한 경고 메시지를 보고 다음 양식이 표시된 thank-you div도 볼 것으로 예상되므로 이러한 HTML 요소가 모두 양식에 있는지 확인하세요. 복사하여 붙여 넣을 수 있는 코드는 샘플 파일을 참조하시고 이 모든 요소와 적절한 양식이 설정되면 제출할 때 Javascript 콘솔에 오류 메시지가 표시되지 않아야 합니다.
  1. 제 웹 페이지에선 데이터가 제출되었다고 뜨는데 데이터가 스프레드시트에 저장되거나 메일로 전송되지 않아요.
  • 스프레드 시트를 복사하고 Google Script를 게시 할 때 권한을 "누구나(익명 사용자 포함)"으로 설정하셨나요? 이것은 인터넷에 있는 사용자 누구나 자신의 데이터를 보내기 위해 보내기를 누를 수 있기 때문에 필요합니다. 변경 사항을 적용할 때 적절한 버전의 스크립트를 배포하고 "비전 기록"을 사용했는지 확인하세요.
  1. 파일은 어떻게 업로드 할 수 있나요?
  • 현재 이 기능은 현재 지원되지 않습니다. 업로드된 파일을 저장하려면 Google 스크립트를 통해 Google 드라이브 API를 사용할 수 있습니다. 우리는 이 문제를 어떻게 해결했는지에 대한 예제를 게시하거나 PR할 수 있는 사람이라면 누구든 환영합니다.
  1. 이거 안전한가요? 민감한 데이터에 사용할 수 있나요?
  • 아니요. POST를 통해 전송되는 데이터는 더 안전하게 보호될 수 있지만 제3자나 중개인이 정보를 쉽게 가로 챌 수 있으며 Google은 Google 스프레드시트의 데이터에 대한 완전한 액세스 권한을 갖습니다. 또한 이메일은 기본적으로 매우 안전한 통신 매체가 아닙니다. 보안이 필요한 경우 데이터를 저장하기 위한 안전한 플랫폼과 서버에 투자하기를 추천합니다.

참고문서


  • 이전 댓글 더보기
  • 질문있습니다! 2019.08.19 00:20 댓글주소 수정/삭제 댓글쓰기

    위와 같은 방법으로 메일 샌드를 한다면 따로 로그인은 필요 없는건지 궁금합니다!

  • 해결 2019.10.12 22:52 댓글주소 수정/삭제 댓글쓰기

    먼저 좋은 정보 감사드립니다.

    form태그의 id는 gform이 되어야 합니다. 즉, <form id = "gform">
    이 부분이 원문 페이지에는 class="gform"으로 하라고 되어있습니다. 바뀐건지는 모르겠으나 id로 해놓고 한참을 헤매다가 해결했네요 ㅠㅎㅎ

  • kenneth 2019.10.24 11:24 댓글주소 수정/삭제 댓글쓰기

    <form id="gform" method="POST" class="pure-form pure-form-stacked" data-email="example@email.net"
    action="https://script.google.com/macros/s/AKfycby1qm2NUv3nBj9qgWVaqeJ5fvQV_GVcn9JZYeLQmvwuf4dP5GJ_/exec">
    <!-- change the form action to your script url -->

    <fieldset class="pure-group">
    <label for="name">성함 : </label>
    <input id="name" name="name" required placeholder="성함을 입력해 주세요." />
    </fieldset>

    <fieldset class="pure-group">
    <label for="telephone">연락처 : </label>
    <input id="telephone" name="telephone" required placeholder="연락처를 입력해 주세요." />
    </fieldset>

    <fieldset class="pure-group">
    <label for="email">이메일 :</label>
    <input id="email" name="email" type="email" value="" required placeholder="이메일 양식에 맞게 작성해 주세요."/>
    <span id="email-invalid" style="display:none"></span>
    </fieldset>
    </br></br>

    <input type="radio" name="radio" id="r1" value="1" checked>기존 전환 문의
    &nbsp;&nbsp;&nbsp;&nbsp;
    <input type="radio" name="radio" id="r2" value="0">신규가맹문의
    </br></br>

    <fieldset class="pure-group">
    <div id="shop">
    <label for="shop">기존 상호 : </label>
    <input id="shop" name="shop" placeholder="기존 상호명" />
    </div>
    </fieldset>

    <!-- Customise the Thankyou Message People See when they submit the form: -->
    <div style="display:none;" id="thankyou_message">
    <h2> 확인 후 바로 연락 드리겠습니다.</h2>
    </div>

    <button class="button-success pure-button button-xlarge">
    <i class="fa fa-paper-plane"></i>&nbsp;전송</button>
    </br></br>
    </form>

    <!-- END -->

    <!-- Submit the Form to Google Using "AJAX" -->
    <script data-cfasync="false" type="text/javascript"
    src="https://cdn.rawgit.com/dwyl/html-form-send-email-via-google-script-without-server/master/form-submission-handler.js"></script>
    </body>


    1. 스크립트 102라인에 위에서 알려주신 코드를 넣어도 타임스템프가 8시간 이전으로 저장됩니다. 스크립트를 업데이트 하고 저장 후 버전도 업데이트 해야하나요?
    row[0].setUTCHours(row[0].getUTCHours()+8);

    2. 전송 후 result 만 나오고 thankyou_message가 안보입니다.

    코드 확인 부탁드립니다.

    • 1. 네. 같이 업데이트 하세요.
      2. 패치가 되었네요. <div style="display:none;" id="thankyou_message"> 를 <div style="display:none;" class="thankyou_message"> 로 변경하세요. 글도 수정해 두었습니다. 감사합니다.

  • 성은 2020.01.14 13:11 댓글주소 수정/삭제 댓글쓰기

    왜 메일이 2개씩 보내질까요ㅠㅠ
    제 메일로 했을땐 되더니 다른 메일로 똑같이 생성했는데 거기서는 메일이 두개씩 오네요

    • 성은 2020.01.14 13:23 댓글주소 수정/삭제

      <div class="row" style="margin-left:1rem;margin-right:1rem;">
      <div class="col-md-1"></div>

      <div class="col-md-10">
      <form id="gform" class="gform" method="post"
      action="https://script.google.com/macros/s/AKfycbwIK_rW3WbZdl8JifjlJbV3GmaeZb_lSjfmL2YX/exec">
      <div class="form-elements">
      <label for="name">Title: </label>
      <input type="text" class="form-control" name="title" id="title" placeholder="제목을 입력해주세요"/><br />

      <label for="email">Email Address:</label>
      <input type="text" class="form-control" name="email" id="email" placeholder="이메일을 입력해주세요"/><br />

      <label for="email">Contents:</label>
      <textarea class="form-control" name="contents" id ="contents" placeholder="내용을 입력해주세요" style="height:170px;"></textarea><br/>
      <div style="font-size:3vmax;text-align: center;">
      <button class="btn btn-dark" style="font-size: 1.7vmax;margin-bottom:5%;margin-top: -2rem;">
      메시지 보내기</button></div>
      </div>
      <div class="thankyou_message" style="display:none;">
      <!-- <h2><em>Thanks</em> for contacting us!<br>
      We will get back to you soon!</h2> -->
      <h2><em>감사합니다.</em><br>
      곧 답장을 하겠습니다!</h2>
      </div>

      <script data-cfasync="false" type="text/javascript"
      src="https://cdn.rawgit.com/dwyl/html-form-send-email-via-google-script-without-server/master/form-submission-handler.js">
      </script>

      </form>

      </div>
      <div class="col-md-1"></div>
      </div>

    • 딱히 문제는 없어보이는데요~
      해당 github issue에 올려보세요.

  • 그대로 따라 했더니 잘됩니다~!!! 근데 인풋에 아무것도 적지 않아도 submit이 되는데 이걸 막을 수 있는 방법은 없을까요??
    이름/메세지/메일주소 항목 중 메일주소만 필수입력 항목으로 하는 방법 알려주시면 감사하겠습니다ㅠ

  • 혹시 위 작업하는데 시간은 얼마나 걸리는 작업일까요??

  • 입문자인 저에게도 유익한 글 감사히 잘 읽었습니다. 원문 중 파일업로드 기능은 지원되지 않는다고 나와있는데, 시간이 지난 현재는 파일 업로드 기능이 구현되었나요? 또는 해결방법이 있을까요?

    • 파일을 주고받는건 서버가 필요하겠죠? 원척적으로 불가능합니다. 첨부시킬때 따로 구글 드라이브같은 클라우드를 사용하고 메일에는 다운로드링크만 보낸다던지 하는 꼼수가 필요할 것 같습니다.

  • 답변 감사합니다. 말씀해주신 부분으로 서칭해서 해보도록 하겠습니다!!

  • erer 2020.05.06 10:38 댓글주소 수정/삭제 댓글쓰기

    위의 예시를 보면 이메일 항목란을 채우지않으면 send 클릭 시 필수입력하라고 창이 나옵니다. 다른 항목들도 그렇게 만들 수 있을까요?

  • erer 2020.05.06 10:47 댓글주소 수정/삭제 댓글쓰기

    아하 빠른답변 감사합니다! 좋은 하루 되시길 바랍니다!~

  • ddony 2020.05.14 11:46 댓글주소 수정/삭제 댓글쓰기

    안녕하세요. 방금전까지 메일이 잘 보내졌는데.. 갑자기 안보내지네요 ㅠㅠ
    혹시 용량의 문제가 있나요? 스프레드시트에는 데이터가 잘 들어갑니다.

    • 지메일은 하루 발송량 제한이 있어요.
      본인이 배포한 스크립트 계정으로 메일을 보내는 방식이기 때문에 피해갈 수 없어요.
      You can send emails to a maximum of 500 recipients per day through the Gmail website. If you are a Google Apps for Work user, your daily limit is 10000 email recipients per day.

    • ddony 2020.05.14 13:27 댓글주소 수정/삭제

      그렇군요! 감사합니다.
      질문하나만 더 드리고자 합니다.
      수신메일의 형태가 @gmail.com 일 경우만 사용이 가능한가요?ㅠㅠ
      저희 회사가 @회사명.com 으로 gmail 연동하여 사용하는데, 회사명으로 입력할 경우 메일이 오지 않아서요ㅠㅠ

    • 수신은 상관없어요. 네이버도 되고, 저는 회사 계정으로 받아봤는데 잘 됩니다.
      회사 메일서버에서 걸러지는거 아닐까요?

    • ddony 2020.05.14 15:54 댓글주소 수정/삭제

      다시 try해보겠습니다! 감사합니다:)

  • 감사합니다 2020.05.15 18:36 댓글주소 수정/삭제 댓글쓰기

    메일이 전송은 되는데 데이터는 전송이 안되는 이유가 뭘까요?

  • 푸른 2020.05.22 16:44 댓글주소 수정/삭제 댓글쓰기

    안녕하세요~ 결과적으로는 성공했는데 submit 버튼을 누를경우 페이지 이동하면서..
    ->
    {"result":"success".....}

    이 페이지로 넘어가지알고 alert으로 "제출되었습니다." 이렇게 넘기는 건 불가한가요?? 계속 찾아보는데 못찾아서 이렇게 댓글로 여쭤뵙니다!!

  • 라이언일병 2020.06.11 14:55 댓글주소 수정/삭제 댓글쓰기

    보내기 클릭시 "Google 드라이브를 사용하여 작업하세요." 로 넘어가는데 무슨경우인가요?

  • 도리도리 2020.06.14 16:04 댓글주소 수정/삭제 댓글쓰기

    안녕하세요! submit 기능 같은 경우에는 required를 input에 설정해놓으면 입력하지 않았을 때, 다 입력하라고 창이 뜨면서 안 넘어가지는데.. button에는 어떻게 기능을 구현해야 할지 잘 모르겠습니다. 추가로 다뤄주실 수 있나요?

  • 너무좋은정보에요 2020.10.25 03:46 댓글주소 수정/삭제 댓글쓰기

    시트에는 데이터가 잘 전송되는데 메일이 안와요.ㅠㅠ 깃허브 파일연동했고 메일 변수에 제 구글 메일을 넣었는데 메일은 안오네요.

  • 너무좋은정보에요 2020.10.25 04:05 댓글주소 수정/삭제 댓글쓰기

    아. 누구나 익명으로 접근가능하게 하면 되네요. 메일도 잘오고 시트에 저장도 잘되네요. 너무 좋은 정보 다시 한번 감사드립니다. 이렇게 쉽게 구현할 수 있어 너무 좋네요.

  • 신입웹디 2021.01.19 16:11 댓글주소 수정/삭제 댓글쓰기

    구글에서 도구-앱시트-앱만들기 했는데 로딩만 주구장창 계속하네요ㅜ?

  • 덕분에 도움이 많이 되고 있습니다.

    한가지,
    스팸방지용으로 적으신걸 넣었는데,

    if (validateHuman(data.honeypot)) { //이 부분이 채워져 있으면, 제출되지 않습니다.
    return false;
    }
    콘솔창에는 validateHuman 이 정의되지 않았다고 오류 뜨던데(작동은 하지만),
    뭐가 제가 놓치고 있을까요?

  • kknd 2021.11.19 17:19 댓글주소 수정/삭제 댓글쓰기

    안녕하십니까?
    덕분에 좋은 방법 알게 되어서 감사합니다.
    질문이 있는데,

    전송버튼 누르면 오류가 발생하는데 혹시 해결 방법이 있을까요?

    xhr.send(encoded);

    만약스크립트 등록없이 보내면 구글시트에도 잘들어가집니다만,
    화면 변화를 없애고 싶은데,, 도움좀 부탁드립니다.