เคยเป็นกันมั้ยครับ เวลาอยากจะนำข้อมูลใน google sheet มาใส่ในแบบฟอร์ม PDF จะต้องไปใช้ส่วนเสริมในการสร้าง Pdf บางอันก็บอกว่าใช้ฟรี แต่เอาเข้าจริงฟรีแค่ไม่กี่ไฟล์ต่อเดือน และถ้าอยากเพิ่มโควต้าการสร้างไฟล์ ก็ต้องไปเสียเงินอัพเกรดส่วนเสริมอีก
ผมก็เป็นคนนึงที่เจอปัญหานี้ครับ แต่ปัญหาเหล่านั้นจะหมดไป เมื่อท่านได้รู้จักกับไลบรารี PdfService ที่ผมสร้างมันขึ้นมาเพื่อแก้ปัญหานี้โดยเฉพาะ จากความขี้งกของตัวเองนี่แหละ
เจ้า PdfService ทำอะไรได้บ้าง?
- สร้าง Pdf จากข้อมูลใน Google Sheet ทั้งแบบระบุคอลัมน์ เลือกช่วงคอลัมน์(สร้างที่เดียวหลายๆไฟล์)
- สามารถใช้ Template เป็น Google sheet หรือ Google Slide ก็ได้
การกำหนดค่า และการเรียกใช้
1. การดึงข้อมูลจากชีทเพื่อเตรียมสร้าง PDF
1.1 กรณีต้องการดึงข้อมูลเฉพาะแถวที่ต้องการ
let sheetId = 'xxxxxxxxxxxxxxxxxxxxxx'
let PdfData =PdfService.initData(sheetId, 'ชื่อชีท', 2)//เลข 2 หมายถึง แถวที่ 2 หากไม่ระบุเลขแถว PdfService จะดึงข้อมูลแถวสุดท้ายออกมา
1.2 กรณีที่ต้องการดึงข้อมูลหลายแถว
let sheetId = 'xxxxxxxxxxxxxxxxxxxxxx'
let PdfData =PdfService.initData(sheetId, 'ชื่อชีท', 2, 5)//เลข 2 หมายถึง เริ่มต้นแถวที่ 2
//เลข 5 หมายถึง สิ้นสุดแถวที่ 5
1.3 กรณีต้องการดึงข้อมูลทุกแถว
let sheetId = 'xxxxxxxxxxxxxxxxxxxxxx'
let PdfData =PdfService.initAllData(sheetId, 'ชื่อชีท')
2. การกำหนดค่าในการเรียกใช้งานไลบรารี PdfService
2.1 กรณีใช้ Template เป็น Google Slide
let option = {
pdfFolder: DriveApp.getFoldersByName('ชื่อโฟลเดอร์เก็บไฟล์').next(), templateFile: DriveApp.getFileById('xxxxxxxxxxxxxxxxx'), data: PdfData,
//ข้อมูลที่ถูกเตรียมจากข้อ 1 image_column: ['ชื่อหัวตารางที่ใส่ภาพ'],
//หากต้องการใส่หลายภาพ ['หัวตารางภาพ1','หัวตารางภาพ2',...] fileName: ['ชื่อ','สกุล'],
//ระบุหัวตารางของข้อมูลที่จะเป็นชื่อไฟล์
}// xxxxxxxxxx คือ ID ของ Template
// yyyyyyyyyy คือ ID ของ Spreadsheet
2.2 กรณีใช้ Template เป็น Google Doc
let option = {
pdfFolder: DriveApp.getFoldersByName('ชื่อโฟลเดอร์เก็บไฟล์').next(), templateFile: DriveApp.getFileById('xxxxxxxxxxxxxxxxx'), data: PdfData,
//ข้อมูลที่ถูกเตรียมจากข้อ 1 image_column: ['ชื่อหัวตารางที่ใส่ภาพ'],
//หากต้องการใส่หลายภาพ ['หัวตารางภาพ1','หัวตารางภาพ2',...] fileName: ['ชื่อ','สกุล'],
//ระบุหัวตารางของข้อมูลที่จะเป็นชื่อไฟล์ imageSize: {
['ชื่อหัวตารางภาพ1']: {width:'5cm', height:'6cm'},
//ถ้ามีหลายรูปต้องกำหนดขนาดทุกรูป
}
}// xxxxxxxxxx คือ ID ของ Template
// yyyyyyyyyy คือ ID ของ Spreadsheet
3. การเรียกใช้ไลบรารี PdfService
3.1 สร้าง PDF จาก google Slide
PdfService.createPDFFromSlide(option) //option มาจากการกำหนดในข้อ 2
3.2 สร้าง PDF จาก google Doc
PdfService.createPDFFromDoc(option) //option มาจากการกำหนดในข้อ 2
4. มาครับทุกคน มาดูตัวอย่างการใช้ตัว PdfService กันครับ
4.1 เริ่มด้วยเปิด google sheet ของเราขึ้นมา และจัดเตรียมข้อมูลกันก่อน
- ข้อมูลของเราอาจจะมาจาก Google Form หรือนำเข้ามาจาก Excel หรือคัดลอกมาจากไหนก็ได้ แล้วแต่ใจเธอเลย
- ข้อมูลจะต้องมีหัวตารางทุกคอลัมน์ ตามรูปเลยจ้าาา
4.2. สร้าง Template เพื่อที่จะนำข้อมูลไปใส่กันครับ ในตัวอย่างนี้ ผมจะใช้เทมเพลตเป็น Google Slide นะครับ
- ในตัวเทมเพลต เราจะต้องกำหนดตำแหน่งของค่าต่างๆที่เราต้องการจะวาง โดยใช้ชื่อหัสตารางของข้อมูลนั้น ครอบด้วยปีกกา {…} ดังตัวอย่างตามภาพ
- ในส่วนของรูปภาพ ให้เราใส่รูปภาพอะไรก่อนก็ได้ จากนั้นคลิกขวาที่ภาพ และเลือก Alt Text และใส่ชื่อหัวตารางของภาพนั้นลงใน Alt Text และ Description ทั้งสองช่อง ในตัวอย่างชื่อหัวตารางคือ “รูปภาพประจำตัว”
4.3. กดเปิด script จาก Spreadsheet ที่เราเตรียมไว้ตอนแรก และนำไอดีนี้ เพิ่มที่ไลบรารีโลด
1iePjnglUzelAuJJb-QykRcUUWYBSKiNGUWVljnNe03G9zWzSUGIRWLXa
4.4. ถึงเวลาเขียนโค้ดแล้วครับ อย่าไปกลัวครับ ลุยเลย
function runPDF(){ let sheetId = '1BxpVp4yA3sZBz9HJefw4aEE4polO1bPWnwijEVB7pxk'
// ไอดีชองชีท จากข้อ 1 let tmpFileId = '1K6x_geWE1UV0Wdfn7sCzYh2VmHSya59uohOfIFfzDBc'
//ไอดีของ slide จากข้อ 2 let pdfFolder = DriveApp.getFoldersByName('PDF').next() let templateFile = DriveApp.getFileById(tmpFileId) let data =PdfService.initData(sheetId, 'ข้อมูล1')
//ไม่ระบุเลขแถว เพราะต้องการสร้างไฟล์ PDF แค่แถวสุดท้าย let option = { pdfFolder: pdfFolder, templateFile: templateFile, data: data, image_column: ['รูปภาพประจำตัว'], fileName: ['ชื่อ','สกุล']} PdfService.createPDFFromSlide(option)}
เมื่อกดรันฟังก์ชันแล้วจะมีการขอ Permission ต่าง ให้กดอนุญาตให้เรียบร้อยนะครับ
5. ตรวจสอบไฟล์ที่ได้จากการใช้ PdfService
เมื่อกดรันฟังก์ชันแล้ว ให้เราเข้าไปดูทึ่ Google Drive ในโฟลเดอร์ชื่อ PDF (อันนี้เรากำหนดเองในโค้ดนะครับ ท่านสามารถชี้เป้าไปที่โฟลเดอร์อื่นได้นะครับ)
หรือจะมาดึที่ Spreadsheet ของเราก็จะมีลิ้งค์ของไฟล์ PDF เพิ่มเข้ามา
เรียบร้อยครับ ออกมาตามเทมเพลตเลย ข้อมูลก็ตรงตามที่กำหนดคือแถวที่ 2 ครับ ส่วนชื่อไฟล์ก็ตรงตามหัวตารางที่กำหนดไว้ แถมมีวันที่กับเวลาพ่วงมาให้อีก เยี่ยมมมม
กรณีใช้เทมเพลตเป็น Google Doc
จะต้องกำหนดค่าหัวตารางลงในตำแหน่งที่ต้องการในเทมเพลต ดังรูป
และเพิ่ม option กำหนดขนาดรูป
function runPDF(){let sheetId = '1BxpVp4yA3sZBz9HJefw4aEE4polO1bPWnwijEVB7pxk'
// ไอดีชองชีท จากข้อ 1let tmpFileId = '1K6x_geWE1UV0Wdfn7sCzYh2VmHSya59uohOfIFfzDBc'
//ไอดีของ slide จากข้อ 2let pdfFolder = DriveApp.getFoldersByName('PDF').next()let templateFile = DriveApp.getFileById(tmpFileId)let data =PdfService.initData(sheetId, 'ข้อมูล1')
//ไม่ระบุเลขแถว เพราะต้องการสร้างไฟล์ PDF แค่แถวสุดท้ายlet option = {pdfFolder: pdfFolder,templateFile: templateFile,data: data,image_column: ['รูปภาพประจำตัว'],fileName: ['ชื่อ','สกุล'],imageSize: {['รูปภาพประจำตัว']: {width:'5cm'}}}PdfService.createPDFFromDoc(option)}
Pdf ที่ออกมาก็จะมีภาพตามขนาดที่เราตั้งไว้
Tips
PdfService จะรีเทิร์น Url ของแต่ละไฟล์กลับมาให้เราด้วยนะครับ ดังนั้นถ้าใครต้องการจะเอา Url ไปใช้งานต่อ เช่น ส่งอีเมล์ ก็สามารถดึงได้จากค่าที่ PdfService รีเทิร์นกลับมาได้เลยนะครับ
let urls = PdfService.createPDFFromSlide(option)Logger.log(urls) //ค่าที่ได้กลับมาจะเป็น Object โดย key คือเลขแถวของข้อมูล
{
"2": "https://drive.google.com/uc?id=1hO8a0S2s4TeeKdyO_xNwTHnqz0dY5XqX&export=download",
"3": "https://drive.google.com/uc?id=1dvRva33_prS-trAXuzR3gk8iN7gDhtq-&export=download"
}
PdfService ตัวนี้จะช่วยให้การสร้างไฟล์ Pdf ของหลายๆคน ไม่เหมือนเดิมอีกต่อไปครับ อย่างน้อยๆก็ของผมแหละ เขียนโค้ดน้อย สร้างได้ไม่จำกัดไฟล์ต่อเดือน และที่สำคัญมันฟรีนี่แหละครับท่านผู้ชม
ข้อจำกัด
จะเป็นเรื่องของเวลาที่ใช้ในการประมวลผลครับ เนื่องจาก Google script จำกัดเวลาการประมวลผลอยู่ที่ประมาณ 7 นาทีต่อครั้ง ซึ่งหากท่านเลือกช่วงแถวจำนวนเยอะๆ อาจจะเกินเวลาได้ครับ
ขอบคุณที่อ่านมาถึงตรงนี้นะครับ หวังว่าทุกท่านจะได้ใช้งานกันอย่างมีความสุข
และสำหรับท่านใดที่ชื่นชอบผลงาน สามารถสนับสนุนค่ากาแฟได้ที่
3379199198
นายดรัณภพ ยิ้มแย้ม
ธนาคารกรุงศรีอยุธยา
หรือกดปุ่มนี้ได้เลยครับ