이메일 검증
이메일 검증 : [a-zA-Z0-9_\.\+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-\.]+
JavaScript
복사
전화번호 검증
전화번호 검증 : ^\d{3}-\d{3,4}-\d{4}$
JavaScript
복사
설문지 발송 자동화 마스터 코드
/* ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ */
/* ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 이 영역을 수정하세요. ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ */
const sourceSpreadsheetId = '스프레드시트ID';
const destinationFolderId = '폴더ID';
const sh_name_inv = '견적서'; // 업데이트 할 서식의 시트명
const sh_name_form = '설문지'; // 설문지와 연동된 시트명
const logo_url = '' // 빙 이미지 생성기에서 만든 이미지 URL을 작성합니다.;
// 이메일 발송에 사용할 제목과 본문입니다. HTML 본문 중, 로고 이미지는 {logo_url}로 작성합니다.
// 나머지 항목은 {client_name}과 같이 중괄호로 묶어서 작성하면, 메일을 발송할 때 고객이 입력한 정보로 변경됩니다.
const mailtitle = '[갓빠두 뷰티살롱] {client_name} 님의 견적서를 보내드립니다.';
const htmlbody = `{client_name} 님이 요청하신 견적서입니다.`;
/* ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ 이 영역을 수정하세요. ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ */
/* ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ */
// 설문지 데이터를 기반으로 문서를 생성하는 함수입니다.
function sendEmailfromForm() {
// 소스 스프레드시트를 엽니다.
var sourceSpreadsheet = SpreadsheetApp.openById(sourceSpreadsheetId);
// '설문지' 시트에서 새롭게 추가된 항목을 배열로 가져옵니다.
var sh = sourceSpreadsheet.getSheetByName(sh_name_form);
var last_row = sh.getLastRow();
var rng = sh.getDataRange();
var values = rng.getValues()[last_row - 1];
var header = rng.getValues()[0];
// 파일이름에 사용할 현재 시간을 파싱합니다.
var formattedTime = Utilities.formatDate(new Date(), 'Asia/Seoul', 'yyMMddHHmmss');
// 가져온 설문지 데이터를 파싱합니다.
var formdata = parseFormData(values, header);
// 파싱된 데이터를 콘솔에 출력합니다.
console.log(formdata)
// '견적서' 템플릿을 복사합니다.
var sh_inv = sourceSpreadsheet.getSheetByName(sh_name_inv);
var sh_copy = sh_inv.copyTo(sourceSpreadsheet);
// 복사된 시트의 데이터 범위를 참조합니다.
var new_rng = sh_copy.getDataRange();
var new_values = new_rng.getValues();
// 복사된 시트의 모든 셀을 돌아가벼 반복문을 실행합니다.
for (var i = 0; i < new_values.length; i++) {
for (var j = 0; j < new_values[i].length; j++) {
var cell = new_values[i][j];
// 셀이 문자열이고 '{'와 '}'로 시작하고 끝나는지 확인합니다.
if (typeof cell === 'string' && cell.startsWith('{') && cell.endsWith('}')) {
var key = cell.substring(1, cell.length - 1);
// 셀에 'rowID'라는 키가 있으면 마지막 행 번호로 값을 설정합니다.
if (key == 'rowID') {
sh_copy.getRange(i + 1,j + 1).setValue(last_row);
} else {
// 그렇지 않으면 해당 키에 해당하는 데이터로 값을 설정합니다.
sh_copy.getRange(i + 1,j + 1).setValue(formdata[key]);
}
}
}
}
// 스프레드시트에 대기 중인 변경사항을 적용합니다.
SpreadsheetApp.flush();
// 완성된 견적서 시트의 함수를 값으로 변경합니다.
rng = sh_copy.getDataRange();
values =rng.getValues();
rng.setValues(values);
// 새로운 스프레드시트를 생성합니다.
var newSpreadsheet = SpreadsheetApp.create('Sheet');
var newSpreadsheetId = newSpreadsheet.getId();
var sh_copied = sh_copy.copyTo(newSpreadsheet);
// 완성된 견적서를 새 스프레드시트로 옮깁니다.
sh_copied.setName(sh_name_inv);
sourceSpreadsheet.deleteSheet(sh_copy);
// 새 스프레드시트의 기본시트를 제거하고, 견적서 시트만 남깁니다.
var defaultSheet = newSpreadsheet.getSheets()[0];
newSpreadsheet.deleteSheet(defaultSheet);
// 새 스프레드시트를 지정한 폴더에 저장합니다.
var file = DriveApp.getFileById(newSpreadsheetId);
var fileName = "OPD-"+last_row.toString().padStart(5,'0')+'-'+formattedTime;
file.setName(fileName);
var folder = DriveApp.getFolderById(destinationFolderId);
file.moveTo(folder);
var fileId = SaveAsPDF(newSpreadsheetId, sh_name_inv, "A1:I34", destinationFolderId, fileName+".pdf");
var emailbody = htmlbody;
var emailtitle = mailtitle;
// 이메일 본문 중 "{}"로 작성된 값을 고객이 제출한 설문지 데이터로 변경합니다.
for (var key in formdata) {
if (formdata.hasOwnProperty(key)) {
// 정규표현식을 작성합니다.
var regex = new RegExp('{' + key + '}', 'g');
// 필드명에 date, time이 있을 경우 표시형식을 날짜, 시간 형식으로 변경합니다.
if (key.toLowerCase().includes("date")) {
var replacevalue = Utilities.formatDate(formdata[key], 'Asia/Seoul', 'yyyy-MM-dd');
} else if (key.toLowerCase().includes("time")) {
var replacevalue = Utilities.formatDate(formdata[key], 'Asia/Seoul', 'a hh:mm:ss');
} else {
var replacevalue = formdata[key];
}
// "{키}" 를 설문지 값으로 변경합니다.
emailbody = emailbody.replace(regex, replacevalue);
emailtitle = emailtitle.replace(regex, replacevalue);
}
}
// {logo_url}이 있을 경우, 실제 로고 이미지 주소로 변경합니다.
emailbody = emailbody.replace("{logo_url}",logo_url);
// 고객에게 첨부파일과 함께 이메일을 발송합니다.
sendEmailWithAttachment(formdata['client_email'], emailtitle, emailbody, fileId);
}
// 헤더와 값을 딕셔너리로 변환하는 함수입니다.
function parseFormData(values, header) {
// 비어있는 배열을 생성합니다.
var result = {};
// 항목을 하나씩 돌아가며 헤더와 값을 하나의 배열로 합칩니다.
for (var i = 0; i < values.length; i++) {
var key = header[i];
var value = values[i];
// 키에 count 라는 단어가 포함된 경우, 값에서 숫자만 남기고 '명'을 지웁니다.
if (key.toLowerCase().includes("count")) {
value = value.toString().replace("명", "");
}
result[key] = value;
}
return result;
}
// 시트를 PDF로 저장하는 함수입니다.
function SaveAsPDF(sheetId, sheetName, printRange, folderId, pdfFileName) {
// PDF로 저장할 시트를 불러옵니다.
var folder = DriveApp.getFolderById(folderId);
var spreadsheet = SpreadsheetApp.openById(sheetId);
var sheet = spreadsheet.getSheetByName(sheetName);
// 시트를 PDF로 저장하기 위한 URL을 생성합니다.
var url = spreadsheet.getUrl().replace(/edit$/, '')
+ 'export?exportFormat=pdf&format=pdf'
// Specify the range and sheet name
+ '&gid=' + sheet.getSheetId()
+ '&range=' + printRange
// Add other parameters for PDF formatting as needed
+ '&size=A4'
+ '&portrait=true'
+ '&scale=4'
+ '&sheetnames=false&printtitle=false&pagenumbers=false'
+ '&gridlines=false'
+ '&fzr=false';
// 보안 토큰을 헤더에 추가합니다.
var token = ScriptApp.getOAuthToken();
var response = UrlFetchApp.fetch(url, {
headers: {
'Authorization': 'Bearer ' + token
}
});
// 완성된 PDF를 구글 드라이브 폴더에 저장합니다.
var pdfBlob = response.getBlob().setName(pdfFileName);
var pdfFile = folder.createFile(pdfBlob);
return pdfFile.getId();
}
// PDF 첨부파일과 함께 이메일을 발송하는 함수입니다.
function sendEmailWithAttachment(emailaddress, title, body, fileId) {
var recipient = emailaddress;
var subject = title;
var htmlBody = body;
var file = DriveApp.getFileById(fileId);
GmailApp.sendEmail(recipient, subject, '', {
htmlBody: htmlBody,
attachments: [file.getAs(MimeType.PDF)]
});
}
JavaScript
복사
ChatGPT 이미지 생성 프롬프트 요청하기
dall-e3 모델을 써서 헤어&메이크업 뷰티 브랜드를 위한 로고를 만들려고해. 심플하면서도 사람들의 시선을 사로잡을 수 있는 로고가 필요해. 영어로 프롬프트를 작성해줘.
ChatGPT로 이메일 HTML 본문 만들기
난 고객에게 헤어 스타일링과 메이크업을 제공하는 사업을 운영하고 있어. 회사 이름은 "갓빠두 뷰티 살롱" 이야.
고객이 원하는 서비스 종류, 장소, 시간을 작성한 설문지를 제출하였을 때, 감사함을 표시하는 이메일을 보내려고해.
이메일에 사용할 수 있는 세련되고 멋진 html 코드를 작성해줘. 그리고 스타일은 스타일 시트를 사용하지 않고, inline-style로 작성하고,
이메일 상단에는 회사 로고가 약 60px 사이즈로 잘 보이도록 넣어줘.
로고 이미지의 크기는 일반적인 로고 사이즈로 꼭 수정해야 합니다.
로고 url : https://th.bing.com/th/id/OIG.bm2CDeo7WBMzGNhwx97L?w=1024&h=1024&rs=1&pid=ImgDetMain
브랜드 컬러 : 파랑, 남색계열
환영메시지를 포함해줘.
예약 정보 :
서비스 종류, 행사 구분, 날짜 및 시간, 인원
■■■■■■■■■■■■■■
이미지생성, HTML본문 만들기가 어려울 경우
아래 항목을 그대로 사용하세요!
HTML본문
<!DOCTYPE html>
<html>
<body style="font-family: Arial, sans-serif; background-color: #f4f4f4; color: #333; margin: 0; padding: 0;">
<div class="email-container" style="max-width: 600px; margin: 0 auto; background: white; padding: 20px;">
<div class="header" style="background-color: #f7f7f7; color: white; padding: 10px 20px; text-align: center;">
<div style="height: 60px; width: auto; margin: auto;"><img style="height: 60px;" src="{logo_url}" class="logo"></div>
<div style="font-size: 1rem; color: #333; margin-top: 10px; font-weight: bold;">갓빠두 뷰티살롱 in 강남</div>
</div>
<div class="content" style="padding: 20px;">
<h1>환영합니다!</h1>
<p>갓빠두 뷰티 살롱에 예약해주셔서 감사합니다. 고객님이 선택하신 서비스는 다음과 같습니다:</p>
<ul>
<li>서비스 종류: {service_type}</li>
<li>행사 구분: {event_type}</li>
<li>날짜: {service_date} {serice_time}</li>
<li>인원: 남자 - {male_count}명, 여자 - {female_count}명</li>
</ul>
<p>만약 변경사항이나 질문이 있으시면 언제든지 저희에게 연락해주세요.</p>
</div>
<div class="footer" style="background-color: #023e8a; color: white; text-align: center; padding: 10px 20px;">
<p>
2023 갓빠두 뷰티 살롱. All right reserved.</p>
</div>
</div>
</body>
</html>Html 코드 확인
오늘은 아래 내용을 배울 예정이에요!
(
강의 시간 : 21:00 ~ 23:00 / 120분)
*강의 종료 시간은 진행 환경에 따라 조금씩 변동될 수 있습니다.
a. 구글 시트 : 견적서 서식 만들기
-. 완성된 견적서 서식 살펴보기
-. Bing 이미지 생성기로 로고 제작하기
-. 견적서 자동 생성을 위한 필수 항목 설정하기
b. 구글 설문지 : 고객 요청 수집을 위한 설문지 제작
-. 고객 요청을 수집하는 설문지 만들기
-. 이메일, 전화번호의 유효성 검증 설정하기
-. 구글 설문지를 구글 시트에 연동하기
-. 견적서 생성에 사용될 각 필드의 머리글 변경하기
c. 앱스 스크립트 : 견적서 자동 발송 시스템 구축
-. 앱스 스크립트 실행 및 기본 사용법
-. 견적서 자동 발송 시스템을 위한 마스터 코드 살펴보기
-. 설문지 제출 후, 자동 코드 실행을 위한 트리거 설정하기
d. 이메일 만들기 : 견적서 안내 메일에 사용할 본문 작성하기
-. ChatGPT로 안내 메일의 HTML 본문 만들기
-. 설문지로 수집한 내용을 HTML 본문에 반영하기
버전 안내
- 이번 수업은 윈도우와 Mac 모든 환경에서 진행 가능합니다.
- Bing 이미지 생성기는 MS 무료 회원가입 후에 사용할 수 있습니다.
- 이번 강의에서는 구글 앱 스크립트를 사용합니다. 완성된 앱스크립트를 제공하므로, 초보자도 서식을 쉽게 완성할 수 있습니다.
- 앱 스크립트에 대한 자세한 설명이 궁금하시다면 이전에 진행한 앱스크립트 기초 완성 라이브 강의를 참고하세요.감사합니다.


