【发布时间】:2021-09-01 07:23:48
【问题描述】:
我想从 Gsheet(this sheet 中的城市名称选项卡)中获取数据,并将这些数据直接输入到 Gslides 中的一些幻灯片中,例如 this template。
在 Gsheet 中,数据在每个选项卡上的相同范围内,具有相同的标题。唯一改变的是选项卡名称。所以 [tab name]."{aaa}" 例如,其中 "{aaa}" 总是在同一个范围内。
Gslide 模板会从 Gsheet 中“接收”这些数据,并从以下任一位置获取数据:
- [选项卡名称]之后的附加列表。“{header}”模型。
- 如果我设法按照 [tab name]."{header}" 模型创建函数,则直接不创建此附加列表。
最终产品将是一个文件,用户可以在 Gsheet 文件中添加标签,按照模板(即城市名称和相同范围内的相同数据)并通过模板提供 Gslides,他们可以在其中输入他们想要的文本,遵循 [tab name].{header} 模型。
我的问题如下:
- 哪种方法最好且资源消耗更少?
- 如果我选择列表方法,如何使用我所有选项卡中的范围从 Gsheet 中附加一个列表,然后在 Gslide 的脚本中使用该列表?
- 如何在 Gscript 中编写函数来填充我将要创建的幻灯片中的数据?
我已经开始在 stackoverflow 的帮助下编写以下代码,但我正在努力:
- 我做事的顺序
- 显然是附加列表模型/[选项卡名称]的函数。“{header}”模型
var NARRATIVE_SHEETS_URL ='xxx' // the URL of the Gsheet where the data is from
var SHEET_NAME = 'xxx' // this would be each tabs name;
function replaceMetric(pages) {
var text_vals = getAutoValue();
for (var i = 0; i < pages.length; i++) {
var page = pages[i];
replaceTextByAutoVal(page, text_vals);
}
}
function replaceSelectedSlides() {
var selection = SlidesApp.getActivePresentation().getSelection();
var selectionType = selection.getSelectionType();
if (selectionType == SlidesApp.SelectionType.PAGE) {
var pageRange = selection.getPageRange();
var pages = pageRange.getPages();
replaceMetric(pages);
}
}
function replaceTextByAutoVal(slide, text_vals) {
slide.replaceAllText("{aaa}", text_vals[0][0]);
slide.replaceAllText("{bbb}", text_vals[1][0]);
slide.replaceAllText("{ccc}", text_vals[2][0]);
slide.replaceAllText("{ddd}", text_vals[3][0]);
Logger.log("Replacement done");
} // This is the data that will always be in the same range for each tabs
function getAutoValue() {
var ss = SpreadsheetApp.openByUrl(NARRATIVE_SHEETS_URL);
var sheets = ss.getSheets() ;
var valList = [];
for (var i = 0; i < sheets.length; i++) {
var sheet = sheets[i];
Logger.log(sheet.getSheetName());
const ignoreTabs = ["Presentation", "Start", "End", "Raw Data"]; // Tab names I want to ignore.
if (ignoreTabs.includes(sheet.getSheetName())) {
// do nothing
} else {
// do something
Logger.log("found");
var range = sheet.getRange("D3:D6");
var values = range.getValues();
valList.append(values);
Logger.log(values)
return values;
}
}
}
【问题讨论】:
-
我想说你的问题太宽泛了,它应该集中在一个特定的问题上。我会专注于将文本插入幻灯片,但是您决定将其插入。从这个意义上说,您能否直观地阐明数据在幻灯片中的结构和显示方式?
-
我将有一个 Excel 数据表,每周更新一次,类似于这个,用户可以在其中添加与其城市相关的选项卡:docs.google.com/spreadsheets/d/… 根据幻灯片中显示的数据,它将是这样的,用户可以按照 [tab name].{header} 模型 docs.google.com/presentation/d/… 注入他们认为合适的数据
-
谢谢,所以在这个例子中,我们的想法是替换例如
[Paris].{aaa}和8000等等?演示文稿中的其余元素(带有文本框的幻灯片等)是否已经创建?它应该在演示文稿的每张幻灯片中查找[tab_name].{header}模型? -
非常感谢您的帮助!是的,这个想法正是如此,例如在该示例中将
[Paris].{aaa}替换为8000。我将在 Gslide 中创建模板,我想做的是用从 Gsheet 数据中找到的任何[tab_name].{header}来提供这些模板。