我可以通过API从Google幻灯片中获取演讲者备注吗?

时间:2016-11-21 04:56:29

标签: google-slides-api

我希望通过API从Google幻灯片中获取发言人注释,但我找不到发言者注释的任何字段。

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

这样做的好方法是什么?

2 个答案:

答案 0 :(得分:1)

如果没有API,我不会建议这是良好的方式。事实上它是可怕的。但在这里。如果你绝对必须这样做。它也可能有点不稳定。

步骤是:

  1. 通过Drive API将演示文稿导出为PowerPoint .pptx文件
  2. 解压缩文件 - 它是一个包含XML文件的目录结构的zip文件。
  3. 识别演讲者备注文件并根据您的要求处理它们(例如,提取所有文本,或处理XML等)。
  4. 丑陋吧?以下是Apps脚本中的示例:

    1. 在您的脚本中的高级服务中启用云端硬盘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');
      }
      

答案 1 :(得分:1)

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