我编写了一些代码,以自动将用户名添加到模板Google幻灯片文件中。这个模板本质上是一个证书,我正在尝试为每个用户自动生成所述证书。
不幸的是,当我尝试将幻灯片文件转换为PDF时,它会转换没有用户名的幻灯片-例如基本上只导出模板文件。绝对可以输入正确的文件ID,但仍然无法正常工作。我能想到的唯一问题是,到代码从DriveApp
获取Blob数据时,演示文稿尚未保存更改。
function buildCertificate() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1'),
rows = sheet.getDataRange().getValues(),
template = DriveApp.getFileById('some file id'),
destination = DriveApp.getFolderById('some folder id'),
i = 1;
while (i < rows.length) {
if (rows[i][3] != 'Y') {
var file = template.makeCopy(rows[i][0] + ' ' + rows[i][1], destination),
id = file.getId(),
slide = SlidesApp.openById(id).getSlides()[0],
shape = slide.insertShape(SlidesApp.ShapeType.TEXT_BOX, 60, 207, 600, 110),
textRange = shape.getText(),
textStyle = textRange.getTextStyle();
textRange.setText([rows[i][0] + ' ' + rows[i][1]]);
textStyle.setFontSize(40);
textStyle.setForegroundColor('#F9B300');
var paragraphStyle = textRange.getParagraphs()[0].getRange().getParagraphStyle();
paragraphStyle.setParagraphAlignment(SlidesApp.ParagraphAlignment.CENTER);
var theBlob = DriveApp.getFileById(id).getBlob().getAs('application/pdf').setName('test'),
newFile = DriveApp.getFolderById("some folder id").createFile(theBlob);
}
sheet.getRange(i + 1, 4).setValue('Y');
i++;
}
}
答案 0 :(得分:2)
根据Apps脚本SlidesApp
文档,您可以使用saveAndClose()
关闭幻灯片,以强制对幻灯片Presentation
进行任何待处理的写入。当脚本执行结束时,将自动执行打开的演示文稿的关闭,但是对于您这样的用例,这种自动刷新发生得太晚了,无法使用:
saveAndClose()
:
保存当前的Presentation
。导致刷新和应用待处理的更新。
对于每个打开的saveAndClose()
,在脚本执行结束时会自动调用Presentation
方法,即使脚本执行因错误而终止。
封闭的Presentation
无法编辑。使用SlidesApp
上的一种打开方法重新打开给定的演示文稿以进行编辑。
您的代码使用的表示形式绑定在变量slide
中,因此在您的DriveApp
代码之前更改循环结构以将其关闭会确保Blob
数据反映最新的更改。
while (i < rows.length) {
if (rows[i][3] != 'Y') {
var file = template.makeCopy(rows[i][0] + ' ' + rows[i][1], destination),
id = file.getId(),
presentation = SlidesApp.openById(id),
slide = presentation.getSlides()[0],
shape = slide.insertShape(SlidesApp.ShapeType.TEXT_BOX, 60, 207, 600, 110),
textRange = shape.getText(),
textStyle = textRange.getTextStyle();
textRange.setText([rows[i][0] + ' ' + rows[i][1]]);
textStyle.setFontSize(40);
textStyle.setForegroundColor('#F9B300');
var paragraphStyle = textRange.getParagraphs()[0].getRange().getParagraphStyle();
paragraphStyle.setParagraphAlignment(SlidesApp.ParagraphAlignment.CENTER);
// Flush the changes we've made to the instantiated template presentation.
presentation.saveAndClose();
// Reopen the file with DriveApp -- could perhaps use the existing `file` reference, e.g.:
// var theBlob = file.getAs(MimeType.PDF).setName('test');
var theBlob = DriveApp.getFileById(id).getAs(MimeType.PDF).setName('test');
// Create the PDF in the desired Drive folder.
DriveApp.getFolderById("some folder id").createFile(theBlob);
}
sheet.getRange(i + 1, 4).setValue('Y');
i++;
}
答案 1 :(得分:1)
正如评论中所说,您所做的更改不是保存和关闭文件。
替换行:
slide = SlidesApp.openById(id).getSlides()[0],
使用
file = SlidesApp.openById(id),
slide = file.getSlides()[0],
行后
paragraphStyle.setParagraphAlignment(SlidesApp.ParagraphAlignment.CENTER);
添加行
file.saveAndClose();