ast*_*ore 2 google-sheets google-apps-script google-slides
我正在制作一张幻灯片,该幻灯片将从 Google 表格中获取动态数据。
我想使用 Google 应用程序脚本将工作表中的数据连接到幻灯片。我是 Java 脚本新手,按照在线教程实现了这一目标,但没有成功。
我正在制作的幻灯片可以在这里找到
下面是我已经实现的代码,但问题是它不起作用,并尝试创建多个页面并在每个页面上重复相同的值。我只想要一页包含从表中更新的值非常感谢您的帮助。谢谢
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)
我相信你的目标如下。
您想要将表格从 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模板每一行的值,我想建议对每一行进行分组。
请将 Google Slides 模板的每一行分组如下。红色虚线是组。在您的示例 Google 幻灯片中,创建了 9 个组。使用这些组,从 Google 电子表格检索到的值将替换为每个组的占位符。
为了将从 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)
修改后的脚本的流程如下。
当修改后的脚本用于示例 Google 电子表格和示例 Google 幻灯片并对每行进行分组时,将获得以下结果。在本例中,使用 Google 幻灯片中的第一张幻灯片。所以templateSlide.remove();不需要使用。
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不会被替换。
| 归档时间: |
|
| 查看次数: |
2051 次 |
| 最近记录: |