
😍直接複製使用,記得將試算表 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, '開啟獎狀');
}
趕快來驗收成果吧~~




沒有留言:
張貼留言
歡迎大家一起留言討論!