0

我有一个绑定到 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
      }
    }
  };
}
4

0 回答 0