使用 Appscript 将每列的最后一行替换为 G-Slides
Replace Last row from each column into G-Slides Using Appscript
我有一个 g-sheet,其中最后一行是每一列行的总和。
希望实现:我现在想填充模板Google幻灯片,使用每列的最后一个值到占位符。
Template slide structure is like this
到目前为止,我在编写应用脚本函数时所做的努力是:
function replace_template_with_text_charts() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
// sheet for handlebar placeholders = dataSheetName
var rows = sheet.getDataRange().getDisplayValues();
// Append column for link to generated slide decks at the end of the row
var resultColumn = sheet.getLastColumn() + 1;
sheet.getRange(1, resultColumn).setValue("Generated slide deck");
// Make name2index store a mapping from column names to indexes.
var name2index = {};
var header = rows[0];
for (var i = 0; i < header.length; i++) {
name2index[header[i]] = i;
}
Logger.log(name2index);
Logger.log(rows[sheet.getRange(sheet.getLastRow(), name2index['A'])])
// Get the presentation template file name based on id that was indicated in set up
var p1 = SlidesApp.openById('1X3tAszOcjo-QkrRNj3TWFm-_--GKPxdLaoJYp6oHJ7M')
for (var i = 1; i < rows.length; ++i) {
var row = rows[i];
sheet.getRange(i+1, resultColumn).setValue(SlidesApp.openById('1X3tAszOcjo-QkrRNj3TWFm-_--GKPxdLaoJYp6oHJ7M').getUrl());
// Logger.log(i+1, resultColumn)
// Create the text merge (replaceAllText) requests for this presentation (does not make changes yet).
var requests = [];
for (var colName in name2index) {
requests.push({
replaceAllText: {
containsText: {
text: '{{' + colName + '}}',
matchCase: true
},
replaceText: row[sheet.getRange(sheet.getLastRow(), name2index[colName])]
}
});
}
// Execute the requests for this presentation.
var result = Slides.Presentations.batchUpdate({
requests: requests
}, '1X3tAszOcjo-QkrRNj3TWFm-_--GKPxdLaoJYp6oHJ7M');
}
不幸的是,它为每一列抛出 NULL。
感谢任何帮助。
修改点:
- 在您的问题中,您似乎想使用“Sheet1”最后一行的值。但是在您的脚本中,您似乎想要使用包括最后一行在内的所有行。
- 来自
Wish to Achieve : I want to now populate a template Google slide using the last values of each column into placeholders.
,我相信你想使用“Sheet1”最后一行的值。
- 当你的目标是使用“Sheet1”最后一行的值,并用这些值替换幻灯片中的
{{A}},{{B}},{{C}},{{D}},{{E}}
时,我认为你的for循环需要修改。在当前循环中,使用所有行,并在循环中使用Slides.Presentations.batchUpdate
。
- 在你的情况下,我认为 Class 幻灯片的
replaceAllText
方法而不是幻灯片 API 的 Slides.Presentations.batchUpdate
方法。
为了达到你的目的,我想提出以下修改脚本。
修改后的脚本:
function replace_template_with_text_charts() {
// 1. Retrieve values of header row and last row from Spreadsheet.
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
var [header, ...rows] = sheet.getDataRange().getDisplayValues();
var lastRow = rows.pop();
// 2. Put the values of "Generated slide deck" and URL of Slides.
var resultColumn = sheet.getLastColumn() + 1;
sheet.getRange(1, resultColumn).setValue("Generated slide deck");
var slide = SlidesApp.openById('1X3tAszOcjo-QkrRNj3TWFm-_--GKPxdLaoJYp6oHJ7M');
sheet.getRange(sheet.getLastRow(), resultColumn).setValue(slide.getUrl());
// 3. Replace `{{A}},{{B}},{{C}},{{D}},{{E}}` with the values of last row of Spreadsheet.
header.forEach((e, i) => slide.replaceAllText(`{{${e}}}`, lastRow[i]));
}
注:
- 请在启用 V8 运行时的情况下使用上述脚本。
参考:
我有一个 g-sheet,其中最后一行是每一列行的总和。
希望实现:我现在想填充模板Google幻灯片,使用每列的最后一个值到占位符。
Template slide structure is like this
到目前为止,我在编写应用脚本函数时所做的努力是:
function replace_template_with_text_charts() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
// sheet for handlebar placeholders = dataSheetName
var rows = sheet.getDataRange().getDisplayValues();
// Append column for link to generated slide decks at the end of the row
var resultColumn = sheet.getLastColumn() + 1;
sheet.getRange(1, resultColumn).setValue("Generated slide deck");
// Make name2index store a mapping from column names to indexes.
var name2index = {};
var header = rows[0];
for (var i = 0; i < header.length; i++) {
name2index[header[i]] = i;
}
Logger.log(name2index);
Logger.log(rows[sheet.getRange(sheet.getLastRow(), name2index['A'])])
// Get the presentation template file name based on id that was indicated in set up
var p1 = SlidesApp.openById('1X3tAszOcjo-QkrRNj3TWFm-_--GKPxdLaoJYp6oHJ7M')
for (var i = 1; i < rows.length; ++i) {
var row = rows[i];
sheet.getRange(i+1, resultColumn).setValue(SlidesApp.openById('1X3tAszOcjo-QkrRNj3TWFm-_--GKPxdLaoJYp6oHJ7M').getUrl());
// Logger.log(i+1, resultColumn)
// Create the text merge (replaceAllText) requests for this presentation (does not make changes yet).
var requests = [];
for (var colName in name2index) {
requests.push({
replaceAllText: {
containsText: {
text: '{{' + colName + '}}',
matchCase: true
},
replaceText: row[sheet.getRange(sheet.getLastRow(), name2index[colName])]
}
});
}
// Execute the requests for this presentation.
var result = Slides.Presentations.batchUpdate({
requests: requests
}, '1X3tAszOcjo-QkrRNj3TWFm-_--GKPxdLaoJYp6oHJ7M');
}
不幸的是,它为每一列抛出 NULL。
感谢任何帮助。
修改点:
- 在您的问题中,您似乎想使用“Sheet1”最后一行的值。但是在您的脚本中,您似乎想要使用包括最后一行在内的所有行。
- 来自
Wish to Achieve : I want to now populate a template Google slide using the last values of each column into placeholders.
,我相信你想使用“Sheet1”最后一行的值。
- 来自
- 当你的目标是使用“Sheet1”最后一行的值,并用这些值替换幻灯片中的
{{A}},{{B}},{{C}},{{D}},{{E}}
时,我认为你的for循环需要修改。在当前循环中,使用所有行,并在循环中使用Slides.Presentations.batchUpdate
。 - 在你的情况下,我认为 Class 幻灯片的
replaceAllText
方法而不是幻灯片 API 的Slides.Presentations.batchUpdate
方法。
为了达到你的目的,我想提出以下修改脚本。
修改后的脚本:
function replace_template_with_text_charts() {
// 1. Retrieve values of header row and last row from Spreadsheet.
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
var [header, ...rows] = sheet.getDataRange().getDisplayValues();
var lastRow = rows.pop();
// 2. Put the values of "Generated slide deck" and URL of Slides.
var resultColumn = sheet.getLastColumn() + 1;
sheet.getRange(1, resultColumn).setValue("Generated slide deck");
var slide = SlidesApp.openById('1X3tAszOcjo-QkrRNj3TWFm-_--GKPxdLaoJYp6oHJ7M');
sheet.getRange(sheet.getLastRow(), resultColumn).setValue(slide.getUrl());
// 3. Replace `{{A}},{{B}},{{C}},{{D}},{{E}}` with the values of last row of Spreadsheet.
header.forEach((e, i) => slide.replaceAllText(`{{${e}}}`, lastRow[i]));
}
注:
- 请在启用 V8 运行时的情况下使用上述脚本。