2024年6月4日 星期二

Google Apps Script:Google 試算表 To Google 簡報



😍直接複製使用,記得將試算表 Setting 工作表改成 👉自己的 簡報 ID  😍



👉 複製 簡報 ID 👈

https://docs.google.com/presentation/d/1Tc6-iZ_sswWb4qPg3sPP3DlE0pZ5z9TIkx3oZUcrNY4/edit?slide=id.p#slide=id.p


整簡報頁面大小 - 檔案 - 頁面設定 - 自訂


A4 紙張大小為 21公分、29.7 公分


編輯獎狀頁面主題範本 - 投影片 - 編輯主題


試算表填入的資料,文字方框記得選 預留位置





新增擴充功能 - Apps Script





// 從 Setting 工作表的 B1 儲存格獲取簡報ID
function getPresentationId() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var settingSheet = spreadsheet.getSheetByName("Setting");
 
  if (!settingSheet) {
    throw new Error("找不到名為 'Setting' 的工作表");
  }
 
  var presentationId = settingSheet.getRange("B1").getValue();
 
  if (!presentationId) {
    throw new Error("請在 Setting 工作表的 B1 儲存格中填入簡報 ID");
  }
 
  return presentationId.toString().trim();
}

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('獎狀套印')
    .addItem('生成獎狀', 'createSlidesFromSheet')
    .addItem('開啟獎狀', 'openSlides')
    .addToUi();
}

function createSlidesFromSheet() {
  // 獲取簡報ID
  var PRESENTATION_ID;
  try {
    PRESENTATION_ID = getPresentationId();
  } catch (e) {
    SpreadsheetApp.getUi().alert('錯誤', e.message, SpreadsheetApp.getUi().ButtonSet.OK);
    return;
  }
 
  // 開啟試算表和取得第一個工作表
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
 
  // 動態偵測有資料的欄位範圍
  var lastRow = sheet.getLastRow();
  var lastColumn = sheet.getLastColumn();
 
  // 如果沒有資料,提示使用者
  if (lastRow < 2) {
    SpreadsheetApp.getUi().alert('錯誤', '試算表中沒有找到資料(第2列開始)', SpreadsheetApp.getUi().ButtonSet.OK);
    return;
  }
 
  // 動態取得資料範圍(從第2列開始,因為第1列通常是標題)
  var dataRange = sheet.getRange(2, 1, lastRow - 1, lastColumn);
  var data = dataRange.getValues();
 
  // 創建或打開現有的 Google 簡報
  var presentation = SlidesApp.openById(PRESENTATION_ID);
 
  // 清除簡報中的所有幻燈片,但保留第一張幻燈片作為模板
  var slides = presentation.getSlides();
  var templateSlide = slides[0];
 
  // 分析模板幻燈片中的文字框數量
  var templateTextBoxes = getTextBoxes(templateSlide);
  var maxTextBoxes = templateTextBoxes.length;
 
  // 移除除了模板外的所有幻燈片
  for (var i = slides.length - 1; i > 0; i--) {
    slides[i].remove();
  }

  // 遍歷試算表中的每一列,並為每一列創建一個新幻燈片
  for (var i = 0; i < data.length; i++) {
    var rowData = data[i];
   
    // 檢查這一列是否有任何內容(排除全空白列)
    var hasContent = false;
    for (var k = 0; k < rowData.length; k++) {
      if (rowData[k] && rowData[k].toString().trim() !== '') {
        hasContent = true;
        break;
      }
    }
   
    if (hasContent) {
      // 使用模板幻燈片創建新幻燈片
      var slide = presentation.appendSlide(templateSlide.getLayout());
      var slideTextBoxes = getTextBoxes(slide);
     
      // 將資料填入文字框,取較小的數量(資料欄位數或文字框數)
      var fillCount = Math.min(rowData.length, slideTextBoxes.length, maxTextBoxes);
     
      for (var j = 0; j < fillCount; j++) {
        if (slideTextBoxes[j] && rowData[j] !== undefined) {
          // 將資料轉換為字串並填入文字框
          var textContent = rowData[j] ? rowData[j].toString() : '';
          slideTextBoxes[j].setText(textContent);
        }
      }
    }
  }
 
  // 移除模板幻燈片
  templateSlide.remove();
 
  // 顯示完成訊息
  var message = '成功生成獎狀!\n' +
                '處理欄位數:' + lastColumn + '\n' +
                '模板文字框數:' + maxTextBoxes + '\n' +
                '生成幻燈片數:' + (data.filter(function(row) {
                  return row.some(function(cell) {
                    return cell && cell.toString().trim() !== '';
                  });
                }).length);
 
  SpreadsheetApp.getUi().alert('完成', message, SpreadsheetApp.getUi().ButtonSet.OK);
}

// 輔助函數:取得幻燈片中的所有文字框
function getTextBoxes(slide) {
  var textBoxes = [];
  var pageElements = slide.getPageElements();
 
  for (var i = 0; i < pageElements.length; i++) {
    var element = pageElements[i];
    if (element.getPageElementType() == SlidesApp.PageElementType.SHAPE) {
      var shape = element.asShape();
      if (shape.getText()) {
        textBoxes.push(shape.getText());
      }
    }
  }
 
  return textBoxes;
}

function openSlides() {
  // 獲取簡報ID
  var PRESENTATION_ID;
  try {
    PRESENTATION_ID = getPresentationId();
  } catch (e) {
    SpreadsheetApp.getUi().alert('錯誤', e.message, SpreadsheetApp.getUi().ButtonSet.OK);
    return;
  }
 
  // 建立 HTML 視窗來開啟簡報
  var html = HtmlService.createHtmlOutput(
    '<script>' +
    'window.open("https://docs.google.com/presentation/d/' + PRESENTATION_ID + '/edit", "_blank");' +
    'google.script.host.close();' +
    '</script>'
  );
  html.setWidth(400).setHeight(200);
  SpreadsheetApp.getUi().showModalDialog(html, '開啟獎狀');
}



趕快來驗收成果吧~~












沒有留言:

張貼留言

歡迎大家一起留言討論!