Google Slides脚本replaceAllText丢失文本自动收缩属性的解决办法
解决Google Slides替换文本后丢失“溢出时缩小文本”属性的问题
问题出在replaceAllText方法上——它会重置文本框的文本属性(包括溢出行为),哪怕模板里已经配置好规则。要保留原属性,得直接操作文本框内的文本范围,而非全局替换。
以下是修改后的代码:
const copy = googleSlideTemplate.makeCopy(`${row[0]}, ${row[1]} Card`, destiionFolder); const slide = SlidesApp.openById(copy.getId()); const targetSlide = slide.getSlides()[0]; // 定位目标幻灯片 const image = targetSlide.getImages()[0]; // 统一管理占位符与对应值 const placeholderMap = { '{{cardname}}': row[0], '{{cardtype}}': row[1], '{{cardstaminatype}}': row[2], '{{cardstaminacost}}': row[3], '{{cardfluff}}': row[4], '{{cardabilitylist}}': row[5], '{{cardstaminaatribute}}': row[6], '{{cardattackatribute}}': row[7], '{{cardprotectionatribute}}': row[8], '{{cardpacksymbol}}': row[9] }; // 遍历幻灯片内所有元素,精准替换文本 targetSlide.getPageElements().forEach(element => { const shape = element.asShape(); if (shape && shape.getText()) { const textRange = shape.getText(); Object.entries(placeholderMap).forEach(([placeholder, value]) => { const foundText = textRange.find(placeholder); if (foundText.length > 0) { // 仅替换文本内容,保留原属性 foundText[0].setText(value); } }); } }); image.replace(row[10], true); slide.saveAndClose();
核心逻辑说明:
- 放弃全局替换,改用遍历文本元素+精准定位文本范围的方式:通过
getPageElements()筛选出文本框(形状元素),用find()定位占位符所在的文本片段,再用setText()替换内容。这种操作只会修改文本内容,不会改动文本框的溢出规则、字体、对齐等原有属性。 - 用
placeholderMap整合占位符和对应值,让代码更简洁易维护。 - 若需处理多张幻灯片,可将遍历范围调整为
slide.getSlides(),循环处理每一页。
调试验证(可选):
替换后可通过以下代码确认溢出属性是否保留:
targetSlide.getPageElements().forEach(element => { const shape = element.asShape(); if (shape) { console.log(`文本框溢出规则:${shape.getTextAutofit()}`); // 输出为AUTOFIT_SHRINK_TO_FIT则表示规则已保留 } });
内容的提问来源于stack exchange,提问作者James Armstrong
相关产品推荐
相关产品推荐

