我有一个绑定到 Google 表格的容器绑定 Google 应用程序脚本,该脚本使用幻灯片 API 从表格中提取数据并替换值,以使用自定义菜单元素对选定的 Google 幻灯片演示文稿执行“邮件合并”。
问题是,在复制工作表时,脚本功能被复制,但谷歌为脚本生成了一个新项目,该项目没有在项目 API 控制台中启用幻灯片 API。
我的目标是将“邮件合并”的参数封装到幻灯片演示文稿中,以允许没有编程经验的人复制工作表,更新幻灯片模板 ID 和目标驱动器文件夹(在工作表内)以允许用于动态生成演示文稿。除了必须手动导航以为复制的项目启用 Slides API 之外,一切都运行良好。有没有办法即时为新项目启用 API,或者将复制的容器脚本与启用控制台 API 的现有项目相关联?
function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('WF Slides')
.addItem('Make slide deck', 'makeSlideDeck')
.addToUi();
}
function makeSlideDeck() {
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var metaSheet = sheet.getSheetByName('Meta');
var replaceSheet = sheet.getSheetByName('Replace');
var fileName = metaSheet.getDataRange().getCell(2,3).getValue();
var templateId = metaSheet.getDataRange().getCell(3,3).getValue();
var driveId = metaSheet.getDataRange().getCell(4,3).getValue();
var file = DriveApp.getFileById(templateId).makeCopy(fileName,
DriveApp.getFolderById(driveId));
var newPresentationId = file.getId();
var range = replaceSheet.getDataRange();
var numRows = range.getNumRows();
var replacements = [];
var requests = [];
var i0 = 0;
for (var i = 2; i <= numRows; i++) {
var val1 = range.getCell(i,2).getValue();
var val2 = range.getCell(i,3).getValue();
var val3 = range.getCell(i,4).getValue();
replacements[i0] = [val1, val2, val3];
i0++;
}
for (var i = 0; i <= replacements.length - 1; i++) {
if(replacements[i][0] == 'text') {
requests[i] = appendRequestText(replacements[i][1], replacements[i][2]);
} else {
requests[i] = appendRequestImage(replacements[i][1], replacements[i][2]);
}
}
Slides.Presentations.batchUpdate({'requests': requests}, newPresentationId);
SpreadsheetApp.getUi()
.alert('Your presentation has been generated.');
}
function appendRequestText(find, replace) {
return {
'replaceAllText': {
'containsText': {'text': find, 'matchCase': true},
'replaceText': replace
}
};
}
function appendRequestImage(find, replace) {
return {
'replaceAllShapesWithImage': {
'imageUrl': replace,
'replaceMethod': 'CENTER_INSIDE',
'containsText': {
'text': find,
'matchCase': true
}
}
};
}