Skip to content

Instantly share code, notes, and snippets.

@daovietanh190499
Last active October 25, 2023 22:52
Show Gist options
  • Save daovietanh190499/e9d722071846e15afb66054246b0cfb4 to your computer and use it in GitHub Desktop.
Save daovietanh190499/e9d722071846e15afb66054246b0cfb4 to your computer and use it in GitHub Desktop.
function emailTemplate(code){
return `
<!doctype html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Shopsmon Email</title>
<style>
@media only screen and (max-width: 620px) {
table.body h1 {
font-size: 28px !important;
margin-bottom: 10px !important;
}
table.body p,
table.body ul,
table.body ol,
table.body td,
table.body span,
table.body a {
font-size: 16px !important;
}
table.body .wrapper,
table.body .article {
padding: 10px !important;
}
table.body .content {
padding: 0 !important;
}
table.body .container {
padding: 0 !important;
width: 100% !important;
}
table.body .main {
border-left-width: 0 !important;
border-radius: 0 !important;
border-right-width: 0 !important;
}
table.body .btn table {
width: 100% !important;
}
table.body .btn a {
width: 100% !important;
}
table.body .img-responsive {
height: auto !important;
max-width: 100% !important;
width: auto !important;
}
}
@media all {
.ExternalClass {
width: 100%;
}
.ExternalClass,
.ExternalClass p,
.ExternalClass span,
.ExternalClass font,
.ExternalClass td,
.ExternalClass div {
line-height: 100%;
}
.apple-link a {
color: inherit !important;
font-family: inherit !important;
font-size: inherit !important;
font-weight: inherit !important;
line-height: inherit !important;
text-decoration: none !important;
}
#MessageViewBody a {
color: inherit;
text-decoration: none;
font-size: inherit;
font-family: inherit;
font-weight: inherit;
line-height: inherit;
}
.btn-primary table td:hover {
background-color: #34495e !important;
}
.btn-primary a:hover {
background-color: #34495e !important;
border-color: #34495e !important;
}
}
</style>
</head>
<body style="background-color: #f6f6f6; font-family: sans-serif; -webkit-font-smoothing: antialiased; font-size: 14px; line-height: 1.4; margin: 0; padding: 0; -ms-text-size-adjust: 100%; -webkit-text-size-adjust: 100%;">
<span class="preheader" style="color: transparent; display: none; height: 0; max-height: 0; max-width: 0; opacity: 0; overflow: hidden; mso-hide: all; visibility: hidden; width: 0;">This is preheader text. Some clients will show this text as a preview.</span>
<table role="presentation" border="0" cellpadding="0" cellspacing="0" class="body" style="border-collapse: separate; mso-table-lspace: 0pt; mso-table-rspace: 0pt; background-color: #f6f6f6; width: 100%;" width="100%" bgcolor="#f6f6f6">
<tr>
<td style="font-family: sans-serif; font-size: 14px; vertical-align: top;" valign="top">&nbsp;</td>
<td class="container" style="font-family: sans-serif; font-size: 14px; vertical-align: top; display: block; max-width: 580px; padding: 10px; width: 580px; margin: 0 auto;" width="580" valign="top">
<div class="content" style="box-sizing: border-box; display: block; margin: 0 auto; max-width: 580px; padding: 10px;">
<!-- START CENTERED WHITE CONTAINER -->
<table role="presentation" class="main" style="border-collapse: separate; mso-table-lspace: 0pt; mso-table-rspace: 0pt; background: #ffffff; border-radius: 3px; width: 100%;" width="100%">
<!-- START MAIN CONTENT AREA -->
<tr>
<td class="wrapper" style="font-family: sans-serif; font-size: 14px; vertical-align: top; box-sizing: border-box; padding: 20px;" valign="top">
<table role="presentation" border="0" cellpadding="0" cellspacing="0" style="border-collapse: separate; mso-table-lspace: 0pt; mso-table-rspace: 0pt; width: 100%;" width="100%">
<tr>
<td style="font-family: sans-serif; font-size: 14px; vertical-align: top;" valign="top">
<div style="width: 300px; height: 300px; display: flex; padding-left: 100px; padding-right: 100px">
<img src="https://shopsmon.com/img/logo.png" alt="Useful alt text" width=300 height=300 border="0" style="border:0; outline:none; text-decoration:none; display:block;">
</div>
<p style="font-family: sans-serif; font-size: 14px; font-weight: normal; margin: 0; margin-bottom: 15px;">Chào bạn,</p>
<p style="font-family: sans-serif; font-size: 14px; font-weight: normal; margin: 0; margin-bottom: 15px;">Bạn đã thành công tạo đơn hàng trên hệ thống Shopsmon, vui lòng kiểm tra mã đơn ${code} theo đường dẫn bên dưới</p>
<p style="font-family: sans-serif; font-size: 14px; font-weight: normal; margin: 0; margin-bottom: 15px;"><b>Mã đơn của bạn: ${code}</b></p>
<p style="font-family: sans-serif; font-size: 14px; font-weight: normal; margin: 0; margin-bottom: 15px;"><b>Đường dẫn kiểm tra: <a href="https://shopsmon.com/order/${code}">https://shopsmon.com/order/${code}</a></b></p>
<table role="presentation" border="0" cellpadding="0" cellspacing="0" class="btn btn-primary" style="border-collapse: separate; mso-table-lspace: 0pt; mso-table-rspace: 0pt; box-sizing: border-box; width: 100%;" width="100%">
<tbody>
<tr>
<td align="left" style="font-family: sans-serif; font-size: 14px; vertical-align: top; padding-bottom: 15px;" valign="top">
<table role="presentation" border="0" cellpadding="0" cellspacing="0" style="border-collapse: separate; mso-table-lspace: 0pt; mso-table-rspace: 0pt; width: auto;">
<tbody>
<tr>
<td style="font-family: sans-serif; font-size: 14px; vertical-align: top; border-radius: 5px; text-align: center; background-color: #3498db;" valign="top" align="center" bgcolor="#3498db"> <a href="https://shopsmon.com/order/${code}" target="_blank" style="border: solid 1px #3498db; border-radius: 5px; box-sizing: border-box; cursor: pointer; display: inline-block; font-size: 14px; font-weight: bold; margin: 0; padding: 12px 25px; text-decoration: none; text-transform: capitalize; background-color: #3498db; border-color: #3498db; color: #ffffff;">Đi đến Shopsmon</a> </td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
<p style="font-family: sans-serif; font-size: 14px; font-weight: normal; margin: 0; margin-bottom: 15px;">Email này thông báo về mã đơn của người sử dụng dịch vụ của Shopsmon, vui lòng liên hệ với chúng tôi để tiến hành thanh toán. Nếu có vấn đề phát sinh vui lòng liên hệ với chúng tôi.<a href="https://fb.com/cuahangshopsmon"> Tại đây </a>.</p>
<p style="font-family: sans-serif; font-size: 14px; font-weight: normal; margin: 0; margin-bottom: 15px;">Trân thành cảm ơn bạn đã sử dụng dịch vụ của chúng tôi!</p>
</td>
</tr>
</table>
</td>
</tr>
<!-- END MAIN CONTENT AREA -->
</table>
<!-- END CENTERED WHITE CONTAINER -->
<!-- START FOOTER -->
<div class="footer" style="clear: both; margin-top: 10px; text-align: center; width: 100%;">
<table role="presentation" border="0" cellpadding="0" cellspacing="0" style="border-collapse: separate; mso-table-lspace: 0pt; mso-table-rspace: 0pt; width: 100%;" width="100%">
<tr>
<td class="content-block" style="font-family: sans-serif; vertical-align: top; padding-bottom: 10px; padding-top: 10px; color: #999999; font-size: 12px; text-align: center;" valign="top" align="center">
<span class="apple-link" style="color: #999999; font-size: 12px; text-align: center;">Shopsmon, 181 Xuân Thủy, Cầu Giấy, Hà Nội</span>
<br> Don't like these emails? <a href="http://i.imgur.com/CScmqnj.gif" style="text-decoration: underline; color: #999999; font-size: 12px; text-align: center;">Unsubscribe</a>.
</td>
</tr>
<tr>
<td class="content-block powered-by" style="font-family: sans-serif; vertical-align: top; padding-bottom: 10px; padding-top: 10px; color: #999999; font-size: 12px; text-align: center;" valign="top" align="center">
Powered by <a href="https://shopsmon.com" style="color: #999999; font-size: 12px; text-align: center; text-decoration: none;">Shopsmon</a>.
</td>
</tr>
</table>
</div>
<!-- END FOOTER -->
</div>
</td>
<td style="font-family: sans-serif; font-size: 14px; vertical-align: top;" valign="top">&nbsp;</td>
</tr>
</table>
</body>
</html>`
}
function doGet(e){
return handleResponse(e);
}
function makeid(length) {
let result = '';
const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
const charactersLength = characters.length;
let counter = 0;
while (counter < length) {
result += characters.charAt(Math.floor(Math.random() * charactersLength));
counter += 1;
}
return result;
}
function getData(sheet) {
var rows = sheet.getRange(2,1,(sheet.getLastRow()-1 <= 0) ? 1 : sheet.getLastRow()-1, sheet.getLastColumn()).getValues();
return rows
}
var SHEET_NAME = "orders";
var SHEET_PRODUCT_NAME = "products";
function handleResponse(e) {
// var lock = LockService.getPublicLock();
// lock.waitLock(30000);
try {
// next set where we write the data - you could write to multiple/alternate destinations
var doc = SpreadsheetApp.openById("YOUR_GOOGLE_SHEET_ID");
var sheet = doc.getSheetByName(SHEET_NAME);
var sheet_product = doc.getSheetByName(SHEET_PRODUCT_NAME);
var productRows = getData(sheet_product)
// we'll assume header is in row 1 but you can override with header_row in GET/POST data
var headRow = e.parameter.header_row || 1;
var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
var nextRow = sheet.getLastRow()+1; // get next row
var row = [];
// loop through the header columns
var code = "";
for (header of ['name', 'phone', 'email', 'address', 'order_content']) {
if (!e.parameter[header] || e.parameter[header].trim() === "") {
return ContentService
.createTextOutput(JSON.stringify({"result":"error", "error": "Không đủ trường thông tin"}))
.setMimeType(ContentService.MimeType.JSON);
}
if (header === "order_content" && JSON.parse(e.parameter[header])["list"].length == 0) {
return ContentService
.createTextOutput(JSON.stringify({"result":"error", "error": "Không đủ trường thông tin"}))
.setMimeType(ContentService.MimeType.JSON);
}
}
for (i in headers){
if (headers[i] == "Timestamp"){ // special case if you include a 'Timestamp' column
row.push(new Date());
} else if (headers[i] == "order_id"){ // special case if you include a 'Timestamp' column
code = makeid(8);
row.push(code);
} else if (headers[i] == "order_status"){ // special case if you include a 'Timestamp' column
row.push("created");
} else if (headers[i] == "order_content"){
let content = JSON.parse(e.parameter[headers[i]])
for (j in content["list"]){
content["list"][j]["name"] = productRows[content["list"][j]["id"] - 1][0]
}
row.push(JSON.stringify(content));
} else { // else use header name to get data
row.push(e.parameter[headers[i]]);
}
}
// send mail to user
MailApp.sendEmail({to: e.parameter['email'].trim(), subject: "Shopsmon: Bạn đã đặt thành công Đơn hàng " + code, htmlBody: emailTemplate(code)});
// more efficient to set values as [][] array than individually
sheet.getRange(nextRow, 1, 1, row.length).setValues([row]);
// return json success results
return ContentService
.createTextOutput(JSON.stringify({"result":"success", "code": code}))
.setMimeType(ContentService.MimeType.JSON);
} catch(err){
// if error return this
return ContentService
.createTextOutput(JSON.stringify({"result":"error", "error": err}))
.setMimeType(ContentService.MimeType.JSON);
} finally { //release lock
// lock.releaseLock();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment