Google Apps脚本;文档;将所选元素转换为HTML

时间:2017-11-15 04:42:05

标签: google-apps-script google-docs google-docs-api google-apps-script-editor

我刚开始使用Google Apps脚本并遵循加载项快速入门

https://developers.google.com/apps-script/quickstart/docs

在快速入门中,您可以创建一个简单的插件来从文档中进行选择,并使用LanguageApp服务进行翻译。该示例使用以下方法获取基础文本:

public static void main(String args[]) {
    //your code...

    while (true) {

        System.out.println("press enter to exit...");
        String keyPressed = sc.nextLine();
        sc.nextLine();

        if (keyPressed.isEmpty()) break;
    }
}

它仅获取文本:function getSelectedText() { var selection = DocumentApp.getActiveDocument().getSelection(); if (selection) { var text = []; var elements = selection.getSelectedElements(); for (var i = 0; i < elements.length; i++) { if (elements[i].isPartial()) { var element = elements[i].getElement().asText(); var startIndex = elements[i].getStartOffset(); var endIndex = elements[i].getEndOffsetInclusive(); text.push(element.getText().substring(startIndex, endIndex + 1)); } else { var element = elements[i].getElement(); // Only translate elements that can be edited as text; skip images and // other non-text elements. if (element.editAsText) { var elementText = element.asText().getText(); // This check is necessary to exclude images, which return a blank // text element. if (elementText != '') { text.push(elementText); } } } } if (text.length == 0) { throw 'Please select some text.'; } return text; } else { throw 'Please select some text.'; } } ,没有任何格式。

我知道底层对象不是html,但有没有办法将选择转换为HTML字符串?例如,如果选择具有混合格式,例如粗体:

  

这是一个带有粗体文字

的示例

那么是否有任何方法,扩展,库等,如element.getText() - 可以返回这个?

  

这是&lt; b&gt;粗体&lt; / b&gt;的样本文本

而不是这个?

  

这是带有粗体文字的示例

3 个答案:

答案 0 :(得分:1)

Omar AL Zabir有一个脚本GoogleDoc2HTML。其目的是将整个文档转换为HTML。由于您只想转换所选元素中的富文本,因此与您的任务相关的函数为processText,如下所示。

方法getTextAttributeIndices为文本属性的每次更改提供起始偏移,例如从正常到粗体或后退。如果只有一个更改,那就是整个元素的属性(通常是段落),这将在if语句的第一部分中处理。

第二部分讨论一般情况,循环索引并插入与属性对应的HTML标记。

脚本未经过维护,因此请将其视为您自己代码的起点,而不是现成的库。有一些未合并的PR可以改善转换过程,特别是对于内联链接。

function processText(item, output) {
  var text = item.getText();
  var indices = item.getTextAttributeIndices();

  if (indices.length <= 1) {
    // Assuming that a whole para fully italic is a quote
    if(item.isBold()) {
      output.push('<b>' + text + '</b>');
    }
    else if(item.isItalic()) {
      output.push('<blockquote>' + text + '</blockquote>');
    }
    else if (text.trim().indexOf('http://') == 0) {
      output.push('<a href="' + text + '" rel="nofollow">' + text + '</a>');
    }
    else {
      output.push(text);
    }
  }
  else {

    for (var i=0; i < indices.length; i ++) {
      var partAtts = item.getAttributes(indices[i]);
      var startPos = indices[i];
      var endPos = i+1 < indices.length ? indices[i+1]: text.length;
      var partText = text.substring(startPos, endPos);

      Logger.log(partText);

      if (partAtts.ITALIC) {
        output.push('<i>');
      }
      if (partAtts.BOLD) {
        output.push('<b>');
      }
      if (partAtts.UNDERLINE) {
        output.push('<u>');
      }

      // If someone has written [xxx] and made this whole text some special font, like superscript
      // then treat it as a reference and make it superscript.
      // Unfortunately in Google Docs, there's no way to detect superscript
      if (partText.indexOf('[')==0 && partText[partText.length-1] == ']') {
        output.push('<sup>' + partText + '</sup>');
      }
      else if (partText.trim().indexOf('http://') == 0) {
        output.push('<a href="' + partText + '" rel="nofollow">' + partText + '</a>');
      }
      else {
        output.push(partText);
      }

      if (partAtts.ITALIC) {
        output.push('</i>');
      }
      if (partAtts.BOLD) {
        output.push('</b>');
      }
      if (partAtts.UNDERLINE) {
        output.push('</u>');
      }

    }
  }
}

答案 1 :(得分:0)

最终制作了一个脚本来支持我的粗体+链接+斜体用例:

function getHtmlOfElement(element) {
  var text = element.editAsText();
  var string = text.getText();
  var indices = text.getTextAttributeIndices();
  var output = [];

  for (var i = 0; i < indices.length; i++) {
    var offset = indices[i];
    var startPos = offset;
    var endPos = i+1 < indices.length ? indices[i+1]: string.length;
    var partText = string.substring(startPos, endPos);

    var isBold = text.isBold(offset);
    var isItalic = text.isItalic(offset);
    var linkUrl = text.getLinkUrl(offset);

    if (isBold) {
      output.push('<b>');
    }
    if (isItalic) {
      output.push('<i>');
    }
    if (linkUrl) {
      output.push('<a href="' + linkUrl + '">');
    }

    output.push(partText);

    if (isBold) {
      output.push('</b>');
    }
    if (isItalic) {
      output.push('</i>');
    }
    if (linkUrl) {
      output.push('</a>');
    }
  }

  return output.join("");
}

您可以简单地使用类似这样的名称来调用它:

getHtmlOfElement(myTableCell); // returns something like "<b>Bold</b> test."

答案 2 :(得分:0)

这显然是一种解决方法,但您可以将 Google 文档复制/粘贴到 Gmail 中的草稿中,然后可以使用

将该草稿转换为 HTML
GmailApp.getDraft(draftId).getMessage().getBody().toString();

我发现这个帖子试图通过直接从文档到 HTML 来跳过这一步,但我想我会分享。