如何使用 Google 应用程序脚本将值从工作表复制到幻灯片
How to copy Values from sheets to slides using Google app scripts
我正在制作一张幻灯片,该幻灯片将从 Google sheet.
获取动态数据
- 我想保留幻灯片模板
- 实时更新幻灯片值
我想使用 Google 应用程序脚本将数据从 sheet 连接到幻灯片。我是 Java 脚本的新手,并遵循 tutorial online 来实现这一点,但没有运气。
我的2个文件设置如下
和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
下面是我已经实现的代码,但问题是它不起作用并尝试创建多个页面并在每个页面上重复相同的值。我只想要一页包含从 sheet 更新的值
非常感谢您的帮助。谢谢
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();
}
我相信你的目标如下。
您想将 table 从 Google 电子表格转换为 Google 幻灯片。
如示例情况,你要实现如下。这是来自你的问题。
看到你的示例情况,我可以确认Google幻灯片中有2个Samuel Tuffuor
的值。在这种情况下,您希望使用 METRIC
.
的行标题将值放入 Google 幻灯片
修改点:
- 在您当前的脚本中,
duplicate()
用于循环。这样,每个循环都会插入新幻灯片。我认为这是您遇到问题的几个原因之一。
- 在
values.forEach()
的第一个循环中,所有值都被替换。因为在您的 Google 幻灯片模板中,{{current}}
、{{Target}},
{{Emea}},
{{Depac}},
{{Emma}}and
{{评论}}of each row is replaced by each
replaceAllText`.
- 此时需要区分
{{current}}
,{{Target}},
{{Emea}},
{{Depac}},
{{Emma}} and
每行的{{评论}}`。
为了区分Google幻灯片模板每一行的值,建议对每一行进行分组。
用法:
1。对 Google 幻灯片的每一行模板进行分组。
请将 Google 幻灯片的每一行模板分组如下。红色虚线是组。在您的示例 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]);
});
}
});
}
修改后的脚本流程如下
- 从 Google 电子表格中检索值。
- 创建一个 object 用于替换值。
- 替换每个组的值。
3。结果。
将修改后的脚本用于示例 Google 电子表格和示例 Google 幻灯片并对每一行进行分组时,将获得以下结果。在这种情况下,使用 Google 幻灯片中的第一张幻灯片。所以templateSlide.remove();
不是必须要用的。
注:
- 在您的脚本中,使用
getValues()
从 Google 电子表格中检索值。在这种情况下,10% 为 0.1。如果要使用 10%,请使用 getDisplayValues()
而不是 getValues()
。在上面修改后的脚本中,使用了getDisplayValues()
。
参考文献:
已添加:
your current issue 的原因是 Google 幻灯片和 Google 电子表格之间的行标题不同。您的示例 Google 幻灯片和 Google 电子表格中有 2 个不同的标题。
Mashal Mashal
和 Mashal Mashal
分别用于 Google 幻灯片和 Google 电子表格。
Mashal Mashal
是 Mashal
和 Mashal
之间的 1 space。
Mashal Mashal
是 Mashal
和 Mashal
之间的 2 spaces。
Chelsea Great
和 Chelea Great
分别用于 Google 幻灯片和 Google 电子表格。
请为 Google 幻灯片和 Google 电子表格使用相同的行标题。当行标题不同时,我修改了上面的脚本以不替换值。那你能确认一下吗?当上述修改后的脚本用于您的 Google 幻灯片和 Google 电子表格时,Mashal Mashal
和 Chelsea Great
的行不会被替换。
我正在制作一张幻灯片,该幻灯片将从 Google sheet.
获取动态数据- 我想保留幻灯片模板
- 实时更新幻灯片值
我想使用 Google 应用程序脚本将数据从 sheet 连接到幻灯片。我是 Java 脚本的新手,并遵循 tutorial online 来实现这一点,但没有运气。
我的2个文件设置如下
和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
下面是我已经实现的代码,但问题是它不起作用并尝试创建多个页面并在每个页面上重复相同的值。我只想要一页包含从 sheet 更新的值 非常感谢您的帮助。谢谢
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();
}
我相信你的目标如下。
您想将 table 从 Google 电子表格转换为 Google 幻灯片。
如示例情况,你要实现如下。这是来自你的问题。
看到你的示例情况,我可以确认Google幻灯片中有2个
的行标题将值放入 Google 幻灯片Samuel Tuffuor
的值。在这种情况下,您希望使用METRIC
.
修改点:
- 在您当前的脚本中,
duplicate()
用于循环。这样,每个循环都会插入新幻灯片。我认为这是您遇到问题的几个原因之一。- 在
values.forEach()
的第一个循环中,所有值都被替换。因为在您的 Google 幻灯片模板中,{{current}}
、{{Target}},
{{Emea}},
{{Depac}},
{{Emma}}and
{{评论}}of each row is replaced by each
replaceAllText`. - 此时需要区分
{{current}}
,{{Target}},
{{Emea}},
{{Depac}},
{{Emma}}and
每行的{{评论}}`。
为了区分Google幻灯片模板每一行的值,建议对每一行进行分组。
用法:
1。对 Google 幻灯片的每一行模板进行分组。
请将 Google 幻灯片的每一行模板分组如下。红色虚线是组。在您的示例 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]);
});
}
});
}
修改后的脚本流程如下
- 从 Google 电子表格中检索值。
- 创建一个 object 用于替换值。
- 替换每个组的值。
3。结果。
将修改后的脚本用于示例 Google 电子表格和示例 Google 幻灯片并对每一行进行分组时,将获得以下结果。在这种情况下,使用 Google 幻灯片中的第一张幻灯片。所以templateSlide.remove();
不是必须要用的。
注:
- 在您的脚本中,使用
getValues()
从 Google 电子表格中检索值。在这种情况下,10% 为 0.1。如果要使用 10%,请使用getDisplayValues()
而不是getValues()
。在上面修改后的脚本中,使用了getDisplayValues()
。
参考文献:
已添加:
your current issue 的原因是 Google 幻灯片和 Google 电子表格之间的行标题不同。您的示例 Google 幻灯片和 Google 电子表格中有 2 个不同的标题。
Mashal Mashal
和Mashal Mashal
分别用于 Google 幻灯片和 Google 电子表格。Mashal Mashal
是Mashal
和Mashal
之间的 1 space。Mashal Mashal
是Mashal
和Mashal
之间的 2 spaces。
Chelsea Great
和Chelea Great
分别用于 Google 幻灯片和 Google 电子表格。
请为 Google 幻灯片和 Google 电子表格使用相同的行标题。当行标题不同时,我修改了上面的脚本以不替换值。那你能确认一下吗?当上述修改后的脚本用于您的 Google 幻灯片和 Google 电子表格时,Mashal Mashal
和 Chelsea Great
的行不会被替换。