Page 1 of 1

Generating slides from spreadsheet data (google apps script)

Posted: Sun Oct 18, 2020 5:18 pm
by Jancha
หัวข้อคือ ส่งข้อมูลจาก 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: 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 บรรทัดต่อไปนี้

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
  }
}

Re: Generating slides from spreadsheet data (google apps script)

Posted: Thu Oct 22, 2020 6:04 am
by snasui
:D ผมยังไม่สะดวกไล่ดูรายละเอียดลองศึกษาดูจาก Link พวกนี้ดูครับ https://www.youtube.com/results?search_ ... preadsheet

Re: Generating slides from spreadsheet data (google apps script)

Posted: Thu Oct 22, 2020 9:09 am
by Jancha
อ่อครับ ลิงค์เหล่านี้ไล่ดูตอนเขียนส่งพวก text แล้วครับ เหลือแต่ส่งรูปจาก column e เท่านั้นครับที่ยังติดอยู่

Re: Generating slides from spreadsheet data (google apps script)

Posted: Sat Oct 24, 2020 8:34 am
by snasui
:D จาก Code และไฟล์ที่แนบมาเป็นการแสดงภาพด้วยสูตรใน Google sheet แต่เท่าที่ได้ลองอ่านดูพบว่า การจะวางภาพใน Google slide ได้จะต้องมี Link ของภาพ และต้องใส่เข้าไปต่างหากดูได้จาก Link นี้ครับ https://developers.google.com/slides/how-tos/add-image

Re: Generating slides from spreadsheet data (google apps script)

Posted: Sun Oct 25, 2020 8:46 am
by Jancha
ขอบคุณครับ