提问者:小点点

我怎样才能创建一个函数,自动从Google Sheets获取数据并替换幻灯片模板中的标签?


总体来说,我对谷歌应用套件的脚本和编码是陌生的,不完全确定如何做到这一点。我想创建代码,允许我使用Google Sheets文档中的相关行,基于幻灯片模板创建一组新的Google幻灯片。

function generateNewSlides() {  
var wsID = "would insert worksheet URL ID here";
var ws = SpreadsheetApp.openById(wsID).getSheetByName("Data");
var data = ws.getRange(2, 1, ws.getLastRow()-1, 5).getValues();

 >the above should get the relevant table from the sheet

data.forEach(function(info){
if(info[0]){

var firstname = info[0];
var surname = info[1];
var email = info[2];
var phone = info[3];
var image = info[4];
var presName = info[5];

>the above are columns where the different pieces of data would be taken from for the placeholders in the Slides template

var slidesTemplateID = "would insert slides template URL ID here";   
var slidesTemplate = SlidesApp.openById(slidesTemplateID);
var template = slidesTemplate.getSlides();
var folderID = "would insert desired folder ID for saving in here";

>the above should get me the Slides template

template.makeCopy(presName,DriveApp.getFolderById(folderID)); **>line where error occurred**
var newPresentation = DriveApp.getFilesByName(presName).next().getUrl();
var Presentation = SlidesApp.openByUrl(newPresentation);

>the above should create a copy and then open it

var shapes = (Presentation.getShapes());
 shapes.forEach(function(shape){
   shape.getText().replaceAllText('{{firstname}}',firstname);
   shape.getText().replaceAllText('{{surname}}',surname);
   shape.getText().replaceAllText('{{email}}',email);
   shape.getText().replaceAllText('{{phone}}',phone);
   shape.getText().replaceAllText('{{presname}}', presName)

}); 
 >the above should replace all the placeholder tags in the template with the row data

} 
}); 

}

以上是我目前掌握的代码。我正在从中提取数据的工作表有几列:名字、姓氏、电子邮件地址、电话号码、图像(URL)和演示名称。当我试图运行它时,我在第37行遇到一个错误,它说template.makeCopy不是一个函数,但是我确定。makeCopy应该可以为它创建一个副本吧?

我的主要问题是:1)我应该做些什么来使它工作,为工作表中的每一行生成一个新的幻灯片集?2)我如何向它添加图像来替换我在模板的正方形(不是文本框)中添加的占位符标签?

提前感谢!


共1个答案

匿名用户

makeCopy(name,destination)是类文件的一个方法,它属于Drive服务,而不属于Slides服务。在您的代码中,< code>template是一个幻灯片列表(您可以通过从演示文稿中调用getSlides()方法来检索它)。< code>makeCopy在这里无法工作。

为了制作< code >演示文稿的副本,您应该使用< code >驱动服务。您应该替换这些行:

var slidesTemplate = SlidesApp.openById(slidesTemplateID);
var template = slidesTemplate.getSlides();

有了这个:

var template = DriveApp.getFileById(slidesTemplateID);

接下来,您要循环访问演示文稿中的所有形状,并将所有占位符标签替换为所需的文本。为了做到这一点,你正在使用Presentation.getShapes(),它不能工作,因为getShapes()不是Presentation的方法,而是Slide的方法。

应首先循环访问演示文稿中的所有幻灯片,然后对于每张幻灯片,循环访问所有形状。您应该替换以下行:

var shapes = (Presentation.getShapes());
 shapes.forEach(function(shape){
   // Replacing text lines
}); 

有了这些:

Presentation.getSlides().forEach(function(slide) {
  slide.getShapes().forEach(function(shape) {          
    // Replacing text lines
  })
});

为了检索复制的演示文稿,您当前正在执行以下操作:

template.makeCopy(presName,DriveApp.getFolderById(folderID));
var newPresentation = DriveApp.getFilesByName(presName).next().getUrl();
var Presentation = SlidesApp.openByUrl(newPresentation);

无需这样做,只需检索创建模板的ID,按ID打开即可,如下所示:

var copiedTemplate = template.makeCopy(presName,DriveApp.getFolderById(folderID));
var Presentation = SlidesApp.openById(copiedTemplate.getId());
  • 幻灯片服务
  • 驱动器服务