如何通过Google Apps Script将表格内容及格式同步到幻灯片?
问题概述
我在Google表格的「Monthly Report」工作表中存储了占位符文本及其关联值,这些占位符同样存在于Google幻灯片模板中。目前使用replaceAllText函数仅能替换幻灯片中的文本内容,无法同步表格中值的颜色等格式。
现有代码
// Google Sheets var masterSheet = SpreadsheetApp.getActiveSpreadsheet(); var sheet = masterSheet.getSheetByName('Monthly Report'); //gets the data from the active pubfile var range = sheet.getRange('S1:T110'); var data = range.getValues(); var titleName = sheet.getRange('AA14:AA14').getValues().toString(); data.shift(); //removes the headers in the sheets // Creating the new slide var spreadsheetID = SpreadsheetApp.getActiveSpreadsheet().getId(); //Ensure Code is applied to active Pubfile var spreadsheetFolder = DriveApp.getFileById(spreadsheetID); var parentFolder = spreadsheetFolder.getParents(); var folderID = parentFolder.next().getId(); var reportTemplate = DriveApp.getFileById('SLIDE ID'); // Gets the report Template var copiedTemplate = reportTemplate.makeCopy(titleName, DriveApp.getFolderById(folderID)); //Makes a copy of the orginal and saves it in the specified folder var newPresoID = copiedTemplate.getId(); var skeleton = SlidesApp.openById(newPresoID); //opens the new template presentation var slides = skeleton.getSlides(); //calls the new slides return newSlide1(); function newSlide1() { var slide1new = slides[0]; // defining the location of the new slide 1 data.forEach(function (row) { var templateVariable = row[0]; // First column contains variable names var templateValue = row[1]; // Second column contains values slide1new.replaceAllText(templateVariable, templateValue); //replaces all the text that matches the placeholders slide1new. }); }
修复方案
要同步表格中的格式,不能直接依赖replaceAllText,需要先提取单元格的格式信息,再逐个匹配占位符并应用格式。以下是修改后的完整代码:
// Google Sheets var masterSheet = SpreadsheetApp.getActiveSpreadsheet(); var sheet = masterSheet.getSheetByName('Monthly Report'); var range = sheet.getRange('S1:T110'); var data = range.getValues(); var textStyles = range.getTextStyles(); // 获取单元格文本格式(颜色、字号、粗斜体等) var titleName = sheet.getRange('AA14:AA14').getValues().toString(); data.shift(); textStyles.shift(); // 移除表头对应的格式数据 // 创建新幻灯片副本 var spreadsheetID = SpreadsheetApp.getActiveSpreadsheet().getId(); var spreadsheetFolder = DriveApp.getFileById(spreadsheetID); var parentFolder = spreadsheetFolder.getParents(); var folderID = parentFolder.next().getId(); var reportTemplate = DriveApp.getFileById('SLIDE ID'); var copiedTemplate = reportTemplate.makeCopy(titleName, DriveApp.getFolderById(folderID)); var newPresoID = copiedTemplate.getId(); var skeleton = SlidesApp.openById(newPresoID); var slides = skeleton.getSlides(); newSlide1(); function newSlide1() { var slide1new = slides[0]; data.forEach(function(row, index) { var templateVariable = row[0]; var templateValue = row[1]; if (!templateVariable || !templateValue) return; // 跳过空占位符或空值 // 获取表格中对应值的文本样式 var cellStyle = textStyles[index][1]; // 取T列(值所在列)的格式 // 遍历幻灯片中所有匹配的占位符文本 var textRanges = slide1new.findText(templateVariable); while (textRanges.hasNext()) { var range = textRanges.next(); var textElement = range.getElement().asText(); // 替换占位符文本内容 textElement.replaceText(templateVariable, templateValue); // 应用表格中的格式 textElement.setFontColor(cellStyle.getForegroundColor()); textElement.setFontSize(cellStyle.getFontSize()); textElement.setBold(cellStyle.isBold()); textElement.setItalic(cellStyle.isItalic()); // 如需同步单元格背景色,可添加:textElement.setBackgroundColor(cellStyle.getBackgroundColor()) } }); skeleton.saveAndClose(); // 保存修改并关闭幻灯片 }
关键修改说明
- 通过
getTextStyles()获取表格单元格的完整文本格式,包括字体颜色、大小、粗体/斜体状态 - 用
findText()遍历幻灯片中所有匹配的占位符,实现精准替换而非批量替换 - 对每个匹配到的文本元素,先替换内容再逐个应用表格中的格式属性
- 新增
saveAndClose()确保所有修改保存到幻灯片文件中
内容的提问来源于stack exchange,提问作者hypedoom187
相关产品推荐
相关产品推荐

