이메일 검증
이메일 검증 : [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
복사
그리고 스타일은 스타일 시트를 사용하지 않고, inline-style로 작성하고,
이메일 상단에는 회사 로고가 약 60px 사이즈로 잘 보이도록 넣어줘.
로고 이미지의 크기는 일반적인 로고 사이즈로 꼭 수정해야 합니다.
로고 url : https://th.bing.com/th/id/OIG.bm2CDeo7WBMzGNhwx97L?w=1024&h=1024&rs=1&pid=ImgDetMain
브랜드 컬러 : 파랑, 남색계열
환영메시지를 포함해줘.
예약 정보 :
서비스 종류, 행사 구분, 날짜 및 시간, 인원
■■■■■■■■■■■■■■
Html 코드 확인
감사합니다.