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

时间:2020-07-31 13:42:39

标签: google-apps-script google-sheets google-slides

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

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

我想使用Google应用脚本将表格中的数据连接到幻灯片。我是Java脚本的新手,并遵循tutorial online来实现这一目标,但是没有运气。

我的2个文件设置如下enter image description here

slides I am working on can be found here

A copy of the data can also be found here

The tutorial I am following is found in this link

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

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();
 
}

1 个答案:

答案 0 :(得分:2)

我相信您的目标如下。

  • 您要将表格从Google Spreadsheet转换为Google Slides。

    • 作为示例情况,您想要实现以下目标。这是你的问题。

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

修改点:

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

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

用法:

1。分组Google幻灯片的每一行模板。

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

enter image description here

2。示例脚本。

为了用Google幻灯片的每一行的占位符替换从Google Spreadsheet检索到的值,我如下修改了脚本。

and

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

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

3。结果。

将修改后的脚本用于示例Google Spreadsheet和示例Google Slides(将每行分组)时,将获得以下结果。在这种情况下,将使用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]); }); } }); }

enter image description here

注意:

  • 在脚本中,使用templateSlide.remove();从Google Spreadsheet检索值。在这种情况下,10%为0.1。如果要使用10%,请使用getValues()而不是getDisplayValues()。在上面修改的脚本中,使用getValues()

参考文献:

已添加:

your current issue的原因是Google幻灯片和Google Spreadsheet之间的行标题不同。您的示例Google幻灯片和Google Spreadsheet中有2种不同的标题。

  • getDisplayValues()Mashal Mashal分别用于Google幻灯片和Google Spreadsheet。
    • Mashal MashalMashal MashalMashal之间的1个空格。
    • MashalMashal MashalMashal之间是2个空格。
  • MashalChelsea Great分别用于Google幻灯片和Google Spreadsheet。

对于Google幻灯片和Google电子表格,请使用相同的行标题。当行标题不同时,我修改了上面的脚本,以不替换值。所以你能确认一下吗?当以上修改的脚本用于Google幻灯片和Google电子表格时,Chelea GreatMashal Mashal的行将不会被替换。