使用 Google Apps 脚本将数据从 Google 工作表导入到 Google Slide 时出错

问题描述 投票:0回答:2

我正在尝试将 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}}"
。非常感谢任何解决此问题的指导。

google-sheets google-apps-script placeholder google-slides
2个回答
0
投票

它不起作用的原因在文章插入和排列文本、形状、图表和线条

如果您想像使用单个对象一样使用多个对象,可以将它们分组在一起。

{{C19}}
{{C20}}
{{C23}}
当前已分组并被视为单个元素,这就是该函数对它们不起作用的原因。

要解决此问题,请先取消它们的组合,然后再次运行该函数。


0
投票

修改要点:

  • 关于
    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);
}
  • 当我使用您提供的 Google 幻灯片和示例电子表格测试此脚本时,我确认所有占位符都可以替换。

参考:

© www.soinside.com 2019 - 2024. All rights reserved.