使用 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 运行时的情况下使用上述脚本。

参考: