我正在制作一张幻灯片,该幻灯片将从Google表格中获取动态数据。
我想使用Google应用脚本将表格中的数据连接到幻灯片。我是Java脚本的新手,并遵循tutorial online来实现这一目标,但是没有运气。
和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();
}
答案 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幻灯片模板的每一行的值,我建议对每一行进行分组。
请按以下方式将Google幻灯片的模板的每一行分组。红色虚线是组。在您的示例Google幻灯片中,创建了9个组。使用这些组,将从Google Spreadsheet检索到的值替换为每个组的占位符。
为了用Google幻灯片的每一行的占位符替换从Google Spreadsheet检索到的值,我如下修改了脚本。
and
此修改后的脚本的流程如下。
将修改后的脚本用于示例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]);
});
}
});
}
。
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 Mashal
是Mashal Mashal
和Mashal
之间的1个空格。Mashal
在Mashal Mashal
和Mashal
之间是2个空格。Mashal
和Chelsea Great
分别用于Google幻灯片和Google Spreadsheet。对于Google幻灯片和Google电子表格,请使用相同的行标题。当行标题不同时,我修改了上面的脚本,以不替换值。所以你能确认一下吗?当以上修改的脚本用于Google幻灯片和Google电子表格时,Chelea Great
和Mashal Mashal
的行将不会被替换。