我正在尝试将 Google Sheets 中的值导入 Google Slide 中的特定占位符。这是幻灯片的模板。问题是它没有替换本幻灯片中占位符中的某些值。这是代码片段:
function createOffer() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
var slides = SlidesApp.openByUrl("https://docs.google.com/presentation/d/1bf-3ypg-lGE9_ju_vCUHeQZj0eWiuFRzxIV_9Ap4eaw/edit#slide=id.g2cece5ff8dd_0_76");
replacePlaceholdersInSlide(slides, sheet);
}
function replacePlaceholdersInSlide(slides, sheet) {
var slide = slides.getSlides()[0]; // First slide
var shapes = slide.getShapes();
var placeholderValuePairs = {
"{{C10}}": "C10","{{C19}}": "C19","{{C20}}": "C20","{{C23}}": "C23","{{D19}}": "D19",
"{{C40}}": "C40"
};
replacePlaceholdersInShapes(shapes, placeholderValuePairs, sheet);
}
function replacePlaceholdersInShapes(shapes, placeholderValuePairs, sheet) {
shapes.forEach(function(shape) {
if (shape.getText) {
var text = shape.getText();
for (var placeholder in placeholderValuePairs) {
var newValue = sheet.getRange(placeholderValuePairs[placeholder]).getDisplayValue();
text.replaceAllText(placeholder, newValue);
}
}
});
}
但是,我无法找到为什么它不替换以下值的问题: 幻灯片中的
"{{C19}}","{{C20}}","{{C23}}"
。非常感谢任何解决此问题的指导。
它不起作用的原因在文章插入和排列文本、形状、图表和线条。
如果您想像使用单个对象一样使用多个对象,可以将它们分组在一起。
{{C19}}
、{{C20}}
和{{C23}}
当前已分组并被视为单个元素,这就是该函数对它们不起作用的原因。
要解决此问题,请先取消它们的组合,然后再次运行该函数。
it does not replace the following values: "{{C19}}","{{C20}}","{{C23}}" in the slide
,当我看到您提供的Google幻灯片时,我注意到这些都包含在该组中。我认为这就是您当前问题的原因。getDisplayValue()
在循环中使用。在这种情况下,加工成本就会变高。当这些点体现在你的脚本中时,下面的修改如何?在这种情况下,我记住了我的答案。因此,在此修改中,此答案将在您的脚本中使用。
在这种情况下,为了通过一次 API 调用从多个单元格检索值,使用 Sheets API。因此,请在高级 Google 服务中启用 Sheets API。
function createOffer() {
var sheetName = "Sheet1";
var placeholderValuePairs = { "{{C10}}": "C10", "{{C19}}": "C19", "{{C20}}": "C20", "{{C23}}": "C23", "{{D19}}": "D19", "{{C40}}": "C40" };
var presentationUrl = "https://docs.google.com/presentation/d/1bf-3ypg-lGE9_ju_vCUHeQZj0eWiuFRzxIV_9Ap4eaw/edit#slide=id.g2cece5ff8dd_0_76";
// Create an array object for replacing the texts.
var ss = SpreadsheetApp.getActiveSpreadsheet();
var { keys, ranges } = Object.entries(placeholderValuePairs).reduce((o, [k, v]) => {
o.keys.push(k);
o.ranges.push(`'${sheetName}'!${v}`);
return o;
}, { keys: [], ranges: [] });
var values = Sheets.Spreadsheets.Values.batchGet(ss.getId(), { ranges, valueRenderOption: "FORMATTED_VALUE" }).valueRanges;
var obj = keys.map((k, i) => [k, values[i].values[0][0]]);
// Retirve 1st slide.
var slides = SlidesApp.openByUrl(presentationUrl);
var slide = slides.getSlides()[0]; // First slide
// Replace texts in the shapes.
const shapes = slide.getShapes();
if (shapes.length > 0) {
shapes.forEach(shape => {
const text = shape.getText();
obj.forEach(([a, b]) => text.replaceAllText(a, b));
});
}
// Replace texts in the groups.
const processGroups = g => {
g.getChildren().forEach(c => {
const type = c.getPageElementType();
if (type == SlidesApp.PageElementType.SHAPE) {
const text = c.asShape().getText();
obj.forEach(([a, b]) => text.replaceAllText(a, b));
} else if (type == SlidesApp.PageElementType.GROUP) {
processGroups(c.asGroup());
}
});
}
slide.getGroups().forEach(processGroups);
}