如何使用 Google 应用脚本将工作表中的值复制到幻灯片

ast*_*ore 2 google-sheets google-apps-script google-slides

我正在制作一张幻灯片,该幻灯片将从 Google 表格中获取动态数据。

  1. 我想保留幻灯片模板
  2. 实时更新幻灯片值

我想使用 Google 应用程序脚本将工作表中的数据连接到幻灯片。我是 Java 脚本新手,按照在线教程实现了这一目标,但没有成功。

我的2个文件设置如下在此输入图像描述

我正在制作的幻灯片可以在这里找到

也可以在此处找到数据的副本

我正在关注的教程可以在此链接中找到

下面是我已经实现的代码,但问题是它不起作用,并尝试创建多个页面并在每个页面上重复相同的值。我只想要一页包含从表中更新的值非常感谢您的帮助。谢谢

function generateLandingPagesReport() {
  var dataSpreadsheetUrl = "https://docs.google.com/spreadsheets/d/1UccsFtqKKsXhlus4-02dXfJP0ECcCsBUmLNZajJnS_4/edit"; //make sure this includes the '/edit at the end
  var ss = SpreadsheetApp.openByUrl(dataSpreadsheetUrl);
  var deck = SlidesApp.getActivePresentation();
  var sheet = ss.getSheetByName('metrics'); // sheet name
  var values = sheet.getRange('C4:L12').getValues(); // range for values
  var slides = deck.getSlides();
  var templateSlide = slides[0];
  var presLength = slides.length;
 
  values.forEach(function(page){
  if(page[0]){
   
   var Current = page[2];
   var Target = page[3];
   var Emea = page[5];
   var Depac = page[7];
   var Emma = page[9];
   var Comment = page[11];
   
 
   templateSlide.duplicate(); //duplicate the template page
   slides = deck.getSlides(); //update the slides array for indexes and length
   newSlide = slides[2]; // declare the new page to update
   
   
   var shapes = (newSlide.getShapes());
       shapes.forEach(function(shape){
       shape.getText().replaceAllText('{{Current}}',Current);
       shape.getText().replaceAllText('{{Target}}',Target);
       shape.getText().replaceAllText('{{Emea}}',Emea);
       shape.getText().replaceAllText('{{Depac}}',Depac)
       shape.getText().replaceAllText('{{Emma}}',Emma);
       shape.getText().replaceAllText('{{Comment}}',Comment);
       
    });
   presLength = slides.length;
   newSlide.move(presLength);
  } // end our conditional statement
  }); //close our loop of values

//Remove the template slide
templateSlide.remove();
 
}
Run Code Online (Sandbox Code Playgroud)

Tan*_*ike 5

我相信你的目标如下。

  • 您想要将表格从 Google 电子表格转换为 Google 幻灯片。

    • 作为示例情况,您希望实现如下。这是来自你的问题。

  • 当我看到你的示例情况时,我可以确认 Google Slides 中有 2 个值Samuel Tuffuor。在这种情况下,您希望使用 的行标题将值放入 Google 幻灯片中METRIC

修改要点:

  • 在您当前的脚本中,
    • duplicate()在循环中使用。这样,每个循环都会插入新的幻灯片。我认为这是您问题的几个原因之一。
    • 在 的第一个循环中values.forEach(),所有值都被替换。因为在您的 Google 幻灯片模板中,{{current}}{ {{Target}}, {Emea}} , {{Depac}} , {{Emma}} and{{Comment}}of each row is replaced by each replaceAllText`。
    • 这种情况下,需要区分每一行的{{current}}, {{Target}}, {{Emea}} , {{Depac}} , {{Emma}} and{{Comment}}`。

为了区分Google Slides模板每一行的值,我想建议对每一行进行分组。

用法:

1. 对 Google Slides 的每一行模板进行分组。

请将 Google Slides 模板的每一行分组如下。红色虚线是组。在您的示例 Google 幻灯片中,创建了 9 个组。使用这些组,从 Google 电子表格检索到的值将替换为每个组的占位符。

在此输入图像描述

2. 示例脚本。

为了将从 Google 电子表格中检索到的值替换为 Google 幻灯片每行的占位符,我修改了您的脚本如下。

function generateLandingPagesReport() {
  var dataSpreadsheetUrl = "https://docs.google.com/spreadsheets/d/1UccsFtqKKsXhlus4-02dXfJP0ECcCsBUmLNZajJnS_4/edit";
  var ss = SpreadsheetApp.openByUrl(dataSpreadsheetUrl);
  var deck = SlidesApp.getActivePresentation();
  
  // 1. Retrieve values from Google Spreadsheet.
  var sheet = ss.getSheetByName('metrics');
  var values = sheet.getRange('A4:L12').getDisplayValues(); // or .getValues();
  
  // 2. Create an object for using replacing the values.
  var obj = values.reduce((o, [a,,c,d,,f,,h,,j,,l]) => Object.assign(o, {[a.trim()]: {"{{current}}": c, "{{Target}}": d, "{{Emea}}": f, "{{Depac}}": h, "{{Emma}}": j, "{{Comment}}": l}}), {});

  // 3. Replace values for each group.
  var slides = deck.getSlides();
  var templateSlide = slides[0];
  var groups = templateSlide.getGroups();
  groups.forEach(g => {
    var c = g.getChildren();
    var key = "";
    var r = new RegExp(/{{\w.+}}/);
    for (var i = 0; i < c.length; i++) {
      var t = c[i].asShape().getText().asString().trim();
      if (!r.test(t)) {
        key = t;
        break;
      }
    }

    // I modified below script as the additional modification.
    if (obj[key]) {
      c.forEach(h => {
        var t = h.asShape().getText().asString().trim();
        if (r.test(t)) h.asShape().getText().setText(obj[key][t]);
      });
    }
  });
}
Run Code Online (Sandbox Code Playgroud)

修改后的脚本的流程如下。

  1. 从 Google 电子表格中检索值。
  2. 创建一个用于替换值的对象。
  3. 替换每个组的值。

3.结果。

当修改后的脚本用于示例 Google 电子表格和示例 Google 幻灯片并对每行进行分组时,将获得以下结果。在本例中,使用 Google 幻灯片中的第一张幻灯片。所以templateSlide.remove();不需要使用。

在此输入图像描述

笔记:

  • 在您的脚本中,使用 . 从 Google 电子表格中检索值getValues()。在这种情况下,10% 就是 0.1。如果您想使用 10%,请使用getDisplayValues()代替getValues()。在上面修改的脚本中,getDisplayValues()使用了。

参考:

添加:

您当前问题的原因是 Google 幻灯片和 Google 电子表格之间的行标题不同。您的示例 Google 幻灯片和 Google 电子表格中有 2 个不同的标题。

  • Mashal Mashal以及Mashal Mashal分别用于 Google 幻灯片和 Google 电子表格。
    • Mashal MashalMashal和之间有 1 个空格Mashal
    • Mashal MashalMashal和之间有 2 个空格Mashal
  • Chelsea Great以及Chelea Great分别用于 Google 幻灯片和 Google 电子表格。

请对 Google 幻灯片和 Google 电子表格使用相同的行标题。当行标题不同时,我修改了上面的脚本以不替换值。那么可以请您确认一下吗?当上述修改后的脚本用于您的 Google 幻灯片和 Google 电子表格时,Mashal Mashal和 的行Chelsea Great不会被替换。