6

我想通过 API 从 Google 幻灯片中获取演讲者备注,但我找不到演讲者备注的任何字段。

供参考:方法:presentations.pages.get

什么是这样做的好方法?

4

2 回答 2

2

Slides API v1 现在支持演讲者备注。文档在这里:https ://developers.google.com/slides/how-tos/notes

于 2017-02-22T21:11:36.670 回答
2

在没有 API 的情况下,我不建议这是一个方法。事实上,这很可怕。但在这里。如果你绝对必须这样做。它也可能有点古怪。

步骤是:

  1. 通过 Drive API 将演示文稿导出为 PowerPoint .pptx 文件
  2. 解压文件 - 它是一个 zip 文件,其中包含一个包含 XML 文件的目录结构。
  3. 识别演讲者笔记文件并根据您的要求处理它们(例如提取所有文本,或处理 XML 等)。

丑对不对?这是 Apps 脚本中的一个示例:

  1. 在脚本中的高级服务中启用Drive API (资源 > 高级 Google 服务)。

    function example() {
      // Print out the speaker notes
      Logger.log(getNotes('123abc......asd'));
    }
    
    // Returns an array of strings, one string per slide
    // representing the speaker notes.
    function getNotes(presentationId) {
      //DriveApp.createFile();
      var notesRegex = /ppt\/notesSlides\/notesSlide\d+\.xml/;
    
      var url = 'https://www.googleapis.com/drive/v2/files/' + presentationId +
        '/export?mimeType=application%2Fvnd.openxmlformats-officedocument.presentationml.presentation';
      var options = {
        headers: {
          Authorization : 'Bearer ' + ScriptApp.getOAuthToken()
        }
      };
      var response = UrlFetchApp.fetch(url, options);
    
      var zipBlob = Utilities.newBlob(response.getContent(), 'application/zip');
      var data = Utilities.unzip(zipBlob);
    
      var notes = [];
      for (var i = 0; i < data.length; i++) {
        if (notesRegex.test(data[i].getName())) {
    
          // Example simply extracts text from speaker notes
          // You could do something more complex.
          notes.push(extractTextFromXml(data[i].getDataAsString()));
        }
      }
      return notes;
    }
    
    function extractTextFromXml(xml) {
      var doc = XmlService.parse(xml);
      var root = doc.getRootElement();
      var ns = root.getNamespace('a');
    
      var text = [];
    
      function walkNode(node) {
        if (node.getText()) {
          text.push(node.getText());
        }
        var children = node.getChildren();
        if (children.length) {
          children.forEach(function(child) {
            walkNode(child);
          });
        }
      }
      walkNode(root);
      return text.join('\n');
    }
    
于 2016-11-29T13:56:53.297 回答