Generating slides from spreadsheet data (google apps script)
Posted: Sun Oct 18, 2020 5:18 pm
หัวข้อคือ ส่งข้อมูลจาก google sheet(spreadsheet) ไปยัง google slide ด้วยภาษา google apps script
การทำงานของ code เริ่มจากรับช่วงข้อมูลจาก cell A6:E10 ใน spreadsheet ส่งค่าเหล่านั้นไปยัง template ที่สร้างไว้ใน slide ผ่าน Google Slides API ทำการแปลงเป็น image file เก็บ slide ที่สร้างแต่ละครั้งไว้ใน folder TempsFile และส่ง report image file ผ่าน line notify ต่อไป
ปัญหาที่เกิดคือ ข้อมูลใน column E ที่เป็นลิงค์รูปภาพยังส่งออกไม่ได้ ต้องรบกวนแก้ไข code เพื่อส่งรูปภาพออกไปด้วยครับ คำถามอยู่ที่ function SpreadsheetToSlide() สามารถเปิดดู code และ edit ได้จาก spreadsheet ที่แนบมา/tool/Script editor
วิธีทดสอบว่า code ทำงานสำเร็จ เลือก function SpreadsheetToSlide() แล้วกด run จากนั้นเปิด slide ขึ้นมาตรวจสอบว่าข้อมูลถูกส่งออกไปครบถ้วนไหม
folder project >> https://drive.google.com/drive/folders/ ... sp=sharing
spreadsheet >> https://docs.google.com/spreadsheets/d/ ... sp=sharing
slide >> https://docs.google.com/presentation/d/ ... sp=sharing
การส่งข้อมูลเริ่มจาก code บรรทัดต่อไปนี้
การทำงานของ code เริ่มจากรับช่วงข้อมูลจาก cell A6:E10 ใน spreadsheet ส่งค่าเหล่านั้นไปยัง template ที่สร้างไว้ใน slide ผ่าน Google Slides API ทำการแปลงเป็น image file เก็บ slide ที่สร้างแต่ละครั้งไว้ใน folder TempsFile และส่ง report image file ผ่าน line notify ต่อไป
ปัญหาที่เกิดคือ ข้อมูลใน column E ที่เป็นลิงค์รูปภาพยังส่งออกไม่ได้ ต้องรบกวนแก้ไข code เพื่อส่งรูปภาพออกไปด้วยครับ คำถามอยู่ที่ function SpreadsheetToSlide() สามารถเปิดดู code และ edit ได้จาก spreadsheet ที่แนบมา/tool/Script editor
วิธีทดสอบว่า code ทำงานสำเร็จ เลือก function SpreadsheetToSlide() แล้วกด run จากนั้นเปิด slide ขึ้นมาตรวจสอบว่าข้อมูลถูกส่งออกไปครบถ้วนไหม
folder project >> https://drive.google.com/drive/folders/ ... sp=sharing
spreadsheet >> https://docs.google.com/spreadsheets/d/ ... sp=sharing
slide >> https://docs.google.com/presentation/d/ ... sp=sharing
Code: Select all
function SpreadsheetToSlide() { //ต้องเปิด Google Slide API เสมอ Resources/Advance Google Service/เลื่อนหา Google Slide API กด เปิด
const tempFolder= DriveApp.getFolderById("15w7L1wzknrzD769DtHfzUUTppj3UBs0A"); //ID folder ที่เก็บไฟล์ slide ในการสร้างแต่ละครั้ง
var TempCardSlide = '1pGtvMMFPsSZufXsWknERtRfbbzp0825-m-FqzaVTC3o'; //ID Slide
var CardSlide = SlidesApp.openById(TempCardSlide);
var ss=SpreadsheetApp.getActive(); //กำหนดใช้ url ของชีตใน ss
var sht1=ss.getSheetByName("Dashboard"); //กำหนดชื่อชีต
CardSlide.getSlides()[0].getShapes()[1].getText().setText(sht1.getRange(4,1).getValue()) //เลือก Slide1 ในกล่องที่ 1 เป็นข้อมูลวันที่นำมาจาก Spreadsheet row4, column1
for (var i = 0; i < 5; i++) { //วนเก็บ Row แรกจนถึงสุดท้าย
for (var j = 0; j < 5; j++) { //วนเก็บ Column แรกจนถึงสุดท้าย
var xcolrow=sht1.getRange(i+6,j+1).getValue(); //แถวที่เริ่มนับข้อมูลคือ 6 คอลัมน์ที่เริ่มนับข้อมูลคือ 1
//Logger.log(xcolrow)
var x1=CardSlide.getSlides()[0].getTables()[0].getCell(i+1,j).getText().setText(xcolrow) //ใส่ data ใน slide1 ตำแหน่ง Table1 เริ่มจาก Row 1
}
}
CardSlide.saveAndClose();
var file = DriveApp.getFileById(TempCardSlide);
var copyFile = file.makeCopy('TempSlide'+ Math.random()+ file.getName( ),tempFolder); //สำเนา
var copyId = copyFile.getId();
var copyDoc = SlidesApp.openById(copyId);
//ตรวจสอบว่า ทำงานเสร็จแล้ว
copyDoc.saveAndClose();
start(copyId);
//ลบไฟล์สำเนาต้นฉปับ
//file.setTrashed(true)
//ไฟล์ที่ถูกแทนที่
//copyFile.setTrashed(true)
//ไฟล์ pdf
//newFile.setTrashed(true)
//DriveApp.removeFile(newFile);
}
///////////////////////////////////////////////////////////////////////////////////////////
function downloadPresentation(id) {
var slideIds = getSlideIds(id);
let imagesblob = []
for (var i = 0, slideId; slideId = slideIds[i]; i++) {
imagesblob.push(downloadSlide('Trip and Journey', id, slideId)); //+ (i + 1), id, slideId));
}
return imagesblob
}
///////////////////////////////////////////////////////////////////////////////////////////
function downloadSlide(name, presentationId, slideId) {
var url = 'https://docs.google.com/presentation/d/' + presentationId +
'/export/png?id=' + presentationId + '&pageid=' + slideId;
var options = {
headers: {
Authorization: 'Bearer ' + ScriptApp.getOAuthToken()
}
};
var response = UrlFetchApp.fetch(url, options);
var image = response.getAs(MimeType.PNG);
image.setName(name);
return image
// DriveApp.createFile(image);
}
///////////////////////////////////////////////////////////////////////////////////////////
function getSlideIds(presentationId) {
var url = 'https://slides.googleapis.com/v1/presentations/' + presentationId;
var options = {
headers: {
Authorization: 'Bearer ' + ScriptApp.getOAuthToken()
}
};
var response = UrlFetchApp.fetch(url, options);
var slideData = JSON.parse(response);
return slideData.slides.map(function(slide) {
return slide.objectId;
});
}
///////////////////////////////////////////////////////////////////////////////////////////
function start(SlideFileID) {
let images = downloadPresentation(SlideFileID)
images.forEach(image=>{sendNotify(image)})
}
///////////////////////////////////////////////////////////////////////////////////////////
function sendNotify(image){
let payloadJson = {
"message": image.getName(),
"imageFile": image
};
let token = ["unrGUE9rRSPaQ0JCtBdtIgVvAX5Q4rlZjs80i6Tdjwq"]; //ใส่ access token ที่ใช้งาน
let options = {
"method": "post",
"payload": payloadJson,
"headers": {
"Authorization": "Bearer " + token
}
};
UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options);
}
Code: Select all
CardSlide.getSlides()[0].getShapes()[1].getText().setText(sht1.getRange(4,1).getValue()) //เลือก Slide1 ในกล่องที่ 1 เป็นข้อมูลวันที่นำมาจาก Spreadsheet row4, column1
for (var i = 0; i < 5; i++) { //วนเก็บ Row แรกจนถึงสุดท้าย
for (var j = 0; j < 5; j++) { //วนเก็บ Column แรกจนถึงสุดท้าย
var xcolrow=sht1.getRange(i+6,j+1).getValue(); //แถวที่เริ่มนับข้อมูลคือ 6 คอลัมน์ที่เริ่มนับข้อมูลคือ 1
//Logger.log(xcolrow)
var x1=CardSlide.getSlides()[0].getTables()[0].getCell(i+1,j).getText().setText(xcolrow) //ใส่ data ใน slide1 ตำแหน่ง Table1 เริ่มจาก Row 1
}
}