๋ฐ์ํ
๐ก Google Sheets์์ ์ ํ๋ ๋ฐ์ดํฐ๋ก pdfํ์ผ์ ์์ฑ ํด ์ด๋ฉ์ผ๋ก ์ ์กํด๋ณธ๋ค.
Google Sheets ์์, ์ ํ๋ ๋ฐ์ดํฐ๋ค์ ๋ํด ๋ช ์ธ์ ์ด๋ฉ์ผ์ ์ ์กํ๋ค.
์ด๋ฉ์ผ์ ๋ณด๋ผ ๋, pdfํ์ผ๋ ์์ฑํด ๊ฐ์ด ์ฒจ๋ถํด์ ๋ณด๋ด์ค ๋ณธ๋ค.
์๋์์ ์ ๋ฆฌํ ๋ด์ฉ๋ค์ ํ์ฉํด์ ๊ฐ๋ฐ์ ์งํํด๋ณธ๋ค.
์๋์ ๊ฐ์ ํ๋ฉด์ด ์๋ค.
์งํํ ๋ด์ฉ์ ์๋์ ๊ฐ๋ค.
- A์ด์ checkbox์ ์ ํ๋ ๋ฐ์ดํฐ๋ค๋ง ๋ฉ์ผ์ ๋ณด๋ธ๋ค.
- Fํ์ ์ ๋ ฅ๋ ์ด๋ฉ์ผ ์ฃผ์๋ก ๋ฉ์ผ์ ๋ณด๋ธ๋ค.
- C, D, E, G ํ์ ๊ฐ๋ค์ ์กฐํฉํด ์ด๋ฉ์ผ ๋ด์ฉ์ ๊ตฌ์ฑํ๋ค.
- ๋ฉ์ผ์ ์ก์ ์๋ฃํ๊ณ H, I ์ ์ ์ก์ผ์์ ๋น๊ณ ๊ฐ์ ์ ๋ ฅํด์ค๋ค.
๋จผ์ checkbox๊ฐ ์ ํ ๋ ์ด์ ๋ฐ์ดํฐ๋ค๋ง ๊ฐ์ ธ์จ๋ค.
function sendInvoice() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("invoice");
const values = sheet.getRange("A2:I"+sheet.getLastRow()).getValues();
const checkCnt = countCheckboxData(values);
if ( checkCnt < 1 ) {
console.log("์ ํ๋ ๋ฐ์ดํฐ๊ฐ ์์ต๋๋ค.");
} else {
console.log(`${checkCnt}๊ฑด์ ๋ฉ์ผ์ ์ ์กํฉ๋๋ค.`);
}
values.forEach((row, idx) => {
if ( row[0] === true ) {
console.log(row);
}
});
}
/**
* ์ฒดํฌ๋ฐ์ค ์ ํ๋ ๋ฐ์ดํฐ ์ ์ถ์ถ์ถ
* @param {object} values = ๋ฐ์ดํฐ
*/
function countCheckboxData(values) {
var checkCount = values.reduce(function (a, b) {
return a + (b[0] === true ? 1 : 0);
}, 0);
return checkCount
}
function sendInvoice() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("invoice");
const values = sheet.getRange("A2:I"+sheet.getLastRow()).getValues();
// ์ฒดํฌ๋ฐ์ค ์ ํ์ฌ๋ถ์ ๋ฐ๋ฅธ ๋ถ๊ธฐ์ฒ๋ฆฌ
const checkCnt = countCheckboxData(values);
if ( checkCnt < 1 ) {
console.log("์ ํ๋ ๋ฐ์ดํฐ๊ฐ ์์ต๋๋ค.");
alertMessage("์๋ฆผ", "์ ํ๋ ๋ฐ์ดํฐ๊ฐ ์์ต๋๋ค.");
return;
} else {
const confirm = confirmMessage('ํ์ธ',`${checkCnt}๊ฑด ๋ฉ์ผ์ ์ ์กํ์๊ฒ ์ต๋๊น?`);
if (!confirm) { return; }
}
var cnt = 0;
values.forEach((row, idx) => {
if ( row[0] == true ) {
// html contents ์์ฑ
let html = `<h1>[${row[2]}] ${row[3]} ๊ณ ๊ฐ๋.</h1>`;
html += `<div>์ด๋ฒ๋ฌ๋ ์ ํฌ ์๋น์ค๋ฅผ ์ด์ฉํด ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค.</div>`;
html += `<div>์ด๋ฒ๋ฌ ๋ฉ๋ถ ๊ธ์ก์ ${row[6]} ์ ์
๋๋ค.</div>`;
html += `<div>์ ํ์ํ 110-9999-9999999 ์ผ๋ก ๋ฉ๋ถ ๋ถํ๋๋ฆฝ๋๋ค.</div>`;
html += `<div>๊ฐ์ฌํฉ๋๋ค.</div>`;
// pdf contents ์์ฑ
let pdfContents = `<h1>[${row[2]}] ${row[3]} ๊ณ ๊ฐ๋.</h1>`;
pdfContents += `<div>์๋น์ค ๋ฉ๋ถ์๊ธ ๋ช
์ธ์</div>`;
pdfContents += `<table border="1" style="border-collapse: collapse;">`;
pdfContents += ` <tr>`;
pdfContents += ` <th>๊ณ ๊ฐ๋ช
</th>`;
pdfContents += ` <th>${row[3]}</th> `;
pdfContents += ` </tr>`;
pdfContents += ` <tr>`;
pdfContents += ` <td>์ฌ์
์๋ฑ๋ก๋ฒํธ</td>`;
pdfContents += ` <td>${row[4]}</td>`;
pdfContents += ` </tr>`;
pdfContents += ` <tr>`;
pdfContents += ` <td>์ด๋ฉ์ผ</td>`;
pdfContents += ` <td>${row[5]}</td>`;
pdfContents += ` </tr>`;
pdfContents += ` <tr>`;
pdfContents += ` <td>๊ธ์ก</td>`;
pdfContents += ` <td>${row[6]}</td>`;
pdfContents += ` </tr>`;
pdfContents += `</table>`;
pdfContents += `<div>๊ฐ์ฌํฉ๋๋ค.</div>`;
const blob = Utilities.newBlob(pdfContents, MimeType.HTML);
blob.setName(`${row[3]}_${getDateTime()}.pdf`);
const email = row[5];
const subject = `${row[3]} ๋ช
์ธ์`;
// ๋ฉ์ผ ์ ์ก
MailApp.sendEmail({
htmlBody : html,
to : email,
subject : subject,
attachments : [blob.getAs(MimeType.PDF)]
});
// ๋ฉ์ผ์ ์ก ํ cell ์ํ๊ฐ update
sheet.getRange((idx+2),8).setValue(getDateTime("TS"));
sheet.getRange((idx+2),9).setValue("์ ์ก์๋ฃ");
cnt++;
}
});
console.log(`${cnt} ๊ฑด ๋ฉ์ผ์ ์ ์กํ์์ต๋๋ค.`);
alertMessage("์ฑ๊ณต", `${cnt} ๊ฑด ๋ฉ์ผ์ ์ ์กํ์์ต๋๋ค.`);
}
/**
* ์ฒดํฌ๋ฐ์ค ์ ํ๋ ๋ฐ์ดํฐ ์ ์ถ์ถ์ถ
* @param {object} values = ๋ฐ์ดํฐ
*/
function countCheckboxData(values) {
var checkCount = values.reduce(function (a, b) {
return a + (b[0] === true ? 1 : 0);
}, 0);
return checkCount
}
/**
* Alert Message for Google sheet.
* @param {string} tit = ํ์ดํ
* @param {string} msg = ๋ฉ์ธ์ง
*/
function alertMessage(tit, msg) {
var ui = SpreadsheetApp.getUi();
ui.alert(tit, msg, ui.ButtonSet.OK);
}
/**
* Confrim Message for Google sheet.
* @param {string} tit = ํ์ดํ
* @param {string} msg = ๋ฉ์ธ์ง
*/
function confirmMessage(tit, msg) {
const ui = SpreadsheetApp.getUi();
const response = ui.alert(tit, msg, ui.ButtonSet.YES_NO);
if ( response == ui.Button.YES ) {
return true;
} else {
return false;
}
}
/**
* ํ์ฌ ์๊ฐ(KST) return
* @param {string} gubun = ๊ตฌ๋ถ์ (Default / Timestamp)
*/
function getDateTime(gubun) {
const curr = new Date();
const utc = curr.getTime() + (curr.getTimezoneOffset() * 60 * 1000);
const KR_TIME_DIFF = 9 * 60 * 60 * 1000;
const today = new Date(utc + (KR_TIME_DIFF));
var dateConcat = "";
var timeConcat = "";
var allConcat = "";
if ( !isNull(gubun) && gubun.toUpperCase() == "TS" ) {
dateConcat = "-";
timeConcat = ":";
allConcat = "T";
} else {
dateConcat = "";
timeConcat = "";
allConcat = "_";
}
const date = today.getFullYear() + dateConcat + lpad((today.getMonth()+1), 2, '0') + dateConcat + lpad(today.getDate(), 2, '0');
const time = lpad(today.getHours(), 2, '0') + timeConcat + lpad(today.getMinutes(), 2, '0') + timeConcat + lpad(today.getSeconds(), 2, '0');
const result = date + allConcat + time;
return result;
}
/**
* ์ข์ธก ๋ฌธ์์ด ์ฑ์ฐ๊ธฐ
* @param {string} str = ์ ๋ฌธ์์ด
* @param {int} padLen = ์ต๋ ์ฑ์ฐ๊ณ ์ ํ๋ ๊ธธ์ด
* @param {string} padStr = ์ฑ์ฐ๊ณ ์ํ๋ ๋ฌธ์(char)
*/
function lpad(str, padLen, padStr) {
if ( padStr.length > padLen ) {
console.log("์ค๋ฅ : ์ฑ์ฐ๊ณ ์ ํ๋ ๋ฌธ์์ด์ด ์์ฒญ ๊ธธ์ด๋ณด๋ค ํฝ๋๋ค");
return str;
}
str += "";
padStr += "";
while (str.length < padLen) {
str = padStr + str;
}
str = str.length >= padLen ? str.substring(0, padLen) : str;
return str;
}
Alert ๊ณผ Confirm ๋ฉ์์ง
๋ฉ์ผ์ ์ ์กํ๋ฉด, ๋ง์ง๋ง๋ฉ์ผ์ ์ก์ผ๊ณผ ๋น๊ณ ์ ๊ฐ์ ์ ๋ ฅํด์ค๋ค.
์ค์ ์ ์ก๋ ๋ฉ์ผ ์ํ
html์ ์ ๋ค๋ฌ์ด์ฃผ๋ฉด, ์์คํ ์ฒ๋ผ ์์ด๋ณด์ด๊ฒ ๊ณ ๊ฐ๋ค์๊ฒ ๋ฉ์ผ์ ์ ์ก ํ ์ ์์๊ฒ์ด๋ค.
๋ฐ์ํ