การสร้าง PDF จากข้อมูลใน Google Sheet ด้วยไลบรารี PdfService

เคยเป็นกันมั้ยครับ เวลาอยากจะนำข้อมูลใน 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 นะครับ

  • ในตัวเทมเพลต เราจะต้องกำหนดตำแหน่งของค่าต่างๆที่เราต้องการจะวาง โดยใช้ชื่อหัสตารางของข้อมูลนั้น ครอบด้วยปีกกา {…} ดังตัวอย่างตามภาพ
ตัวอย่างการกำหนดค่าใน template
  • ในส่วนของรูปภาพ ให้เราใส่รูปภาพอะไรก่อนก็ได้ จากนั้นคลิกขวาที่ภาพ และเลือก Alt Text และใส่ชื่อหัวตารางของภาพนั้นลงใน Alt Text และ Description ทั้งสองช่อง ในตัวอย่างชื่อหัวตารางคือ “รูปภาพประจำตัว”

4.3. กดเปิด script จาก Spreadsheet ที่เราเตรียมไว้ตอนแรก และนำไอดีนี้ เพิ่มที่ไลบรารีโลด

1iePjnglUzelAuJJb-QykRcUUWYBSKiNGUWVljnNe03G9zWzSUGIRWLXa

เพิ่ม library ให้สคริปต์

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 (อันนี้เรากำหนดเองในโค้ดนะครับ ท่านสามารถชี้เป้าไปที่โฟลเดอร์อื่นได้นะครับ)

ไฟล์ที่ได้จากการใช้ library

หรือจะมาดึที่ Spreadsheet ของเราก็จะมีลิ้งค์ของไฟล์ PDF เพิ่มเข้ามา

เรียบร้อยครับ ออกมาตามเทมเพลตเลย ข้อมูลก็ตรงตามที่กำหนดคือแถวที่ 2 ครับ ส่วนชื่อไฟล์ก็ตรงตามหัวตารางที่กำหนดไว้ แถมมีวันที่กับเวลาพ่วงมาให้อีก เยี่ยมมมม

กรณีใช้เทมเพลตเป็น Google Doc

จะต้องกำหนดค่าหัวตารางลงในตำแหน่งที่ต้องการในเทมเพลต ดังรูป

ตัวอย่างการเตรียม template Google Doc

และพิ่ม option กำหนดขนาดรูป

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: ['ชื่อ','สกุล'],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 นาทีต่อครั้ง ซึ่งหากท่านเลือกช่วงแถวจำนวนเยอะๆ อาจจะเกินเวลาได้ครับ

ขอบคุณที่อ่านมาถึงตรงนี้นะครับ หวังว่าทุกท่านจะได้ใช้งานกันอย่างมีความสุข