:D snasui.com ยินดีต้อนรับ :D
ยินดีต้อนรับสู่กระดานถามตอบ Excel and VBA และอื่น ๆ ที่เป็นมิตรกับทุกท่าน มีไฟล์แนบมหาศาล ช่วยให้ท่านค้นหาและติดตามศึกษาได้โดยง่าย :thup: สมาชิกท่านใดที่ยังไม่ได้ระบุ Version ของ Excel ที่ใช้งานจริง สามารถทำตาม Link นี้เพื่อจะได้รับคำตอบที่ตรงกับ Version ของท่านครับ :arrow: ระบุ Version ของ Excel
:!: โปรดทราบ :!:
  1. กรุณาอ่านกฎการใช้บอร์ด (Forum rules) ในตำแหน่งด้านบนของแต่ละบอร์ด
  2. การสมัครสมาชิก การ Login การกู้คืนรหัสผ่าน
    1. สมัครสมาชิกดูขั้นตอนได้ที่ :arrow: สมัครสมาชิก
    2. Login เข้าระบบโดยคลิกปุ่ม Login ตรงมุมขวาบนของหน้านี้ :roll:
    3. การ Login ผ่าน Facebook ดูวิธีที่ :arrow: Login ผ่าน Facebook
    4. ลืมรหัสผ่านสามารถรับรหัสใหม่ได้ที่ :arrow: Reset รหัสผ่าน
  3. มีปัญหาการใช้งาน แจ้งผู้ดูแลระบบได้ที่ :arrow: ติดต่อผู้ดูแลระบบ
  4. กำหนดการตั้งค่าส่วนตัว เช่นตั้งค่าภาษาเป็นไทยหรืออังกฤษดูได้ที่ :arrow: ตั้งค่าส่วนตัว
  5. การตั้งและตอบกระทู้ดูได้ที่ :arrow: วิธีการตั้งและตอบกระทู้
  6. การจัดรูปแบบตัวอักษรด้วย bbcode ในช่องแสดงความคิดเห็นดูได้ที่ :arrow: จัดรูปแบบตัวอักษร
  7. กำหนดขนาดตัวอักษรใน Browser ดูได้ที่ :arrow: กำหนดขนาดตัวอักษรใน Browser

Generating slides from spreadsheet data (google apps script)

ฟอรัมถาม-ตอบปัญหาอื่น ๆ ที่ไม่เกี่ยวกับ Excel
Forum rules
  1. ไม่อนุญาตให้ใช้ภาษาแชทในการถามและตอบปัญหา ไม่ใช้คำว่า "คับ" หรือ "อ่ะครับ" แทนคำว่า "ครับ" ไม่ใช้คำว่า "เด๋ว" แทนคำว่า "เดี๋ยว" เป็นต้น เนื่องจากเมื่อแปลเป็นภาษาต่างประเทศแล้วจะให้ความหมายผิดไปจากที่ควรจะเป็น
  2. ห้ามถามโดยระบุชื่อผู้ตอบและต้องตั้งชื่อกระทู้ให้สื่อถึงปัญหาที่จะถาม ไม่ตั้งชื่อว่า ช่วยด้วยครับ, มีปัญหามาปรึกษาครับ เป็นต้น
  3. กรุณาอธิบายปัญหาและระบุคำตอบที่ต้องการมาในกระทู้ด้วยเสมอถึงแม้จะอธิบายไว้ในไฟล์แนบแล้วก็ตาม ทั้งนี้เพื่ออำนวยความสะดวกแก่เพื่อนสมาชิกในการค้นหาข้อมูล
  4. กรุณาแนบไฟล์ตัวอย่างพร้อมแสดงคำตอบที่ถูกต้องมาในไฟล์ด้วยเพื่อให้ง่ายต่อการทำความเข้าใจและสะดวกต่อการตอบคำถาม (ขนาดไฟล์ไม่เกิน 500Kb ขนาดภาพไม่เกิน 800*600 Pixel) ไม่แนบเป็น Link มาจากแหล่งอื่นที่อาจจะถูกลบทิ้งไปโดยต้นทางในภายหลัง นอกจากนี้ไม่ควรแนบไฟล์ที่มีข้อมูลสำคัญอันก่อให้เกิดความเสียหายกับตนเองและผู้อื่น
  5. กรณีเป็นคำถามเกี่ยวกับ Programming เช่น VBA, VB.Net, C#, SQL ฯลฯ ต้องลองเขียนมาเองก่อนเสมอ ถามเฉพาะที่ติดปัญหา ระบุ Module, Procedure ที่ติดปัญหาให้ชัดเจน กรุณาโพสต์ Code ให้แสดงเป็น Code คือเปิดด้วย [code] และปิดด้วย [/code] ตัวอย่างเช่น [code]dim r as range[/code] เพื่อให้แตกต่างจากข้อความทั่วไป สะดวกในการอ่านและทดสอบ (คลิกเพื่อดูตัวอย่างเพิ่มเติม)
  6. กรุณาแจ้งผลการใช้งานเมื่อได้รับคำตอบว่าตรงกับความต้องการหรือไม่
User avatar
Jancha
Bronze
Bronze
Posts: 257
Joined: Thu Jan 26, 2017 6:19 pm
Excel Ver: 365

Generating slides from spreadsheet data (google apps script)

#1

Post 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
  }
}
You do not have the required permissions to view the files attached to this post.
User avatar
snasui
Site Admin
Site Admin
Posts: 30752
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:

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

#2

Post by snasui »

:D ผมยังไม่สะดวกไล่ดูรายละเอียดลองศึกษาดูจาก Link พวกนี้ดูครับ https://www.youtube.com/results?search_ ... preadsheet
User avatar
Jancha
Bronze
Bronze
Posts: 257
Joined: Thu Jan 26, 2017 6:19 pm
Excel Ver: 365

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

#3

Post by Jancha »

อ่อครับ ลิงค์เหล่านี้ไล่ดูตอนเขียนส่งพวก text แล้วครับ เหลือแต่ส่งรูปจาก column e เท่านั้นครับที่ยังติดอยู่
User avatar
snasui
Site Admin
Site Admin
Posts: 30752
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:

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

#4

Post by snasui »

:D จาก Code และไฟล์ที่แนบมาเป็นการแสดงภาพด้วยสูตรใน Google sheet แต่เท่าที่ได้ลองอ่านดูพบว่า การจะวางภาพใน Google slide ได้จะต้องมี Link ของภาพ และต้องใส่เข้าไปต่างหากดูได้จาก Link นี้ครับ https://developers.google.com/slides/how-tos/add-image
User avatar
Jancha
Bronze
Bronze
Posts: 257
Joined: Thu Jan 26, 2017 6:19 pm
Excel Ver: 365

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

#5

Post by Jancha »

ขอบคุณครับ
Post Reply