首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Google脚本;Docs;将选定元素转换为HTML

Google脚本;Docs;将选定元素转换为HTML
EN

Stack Overflow用户
提问于 2017-11-15 04:42:05
回答 3查看 2.1K关注 0票数 2

我刚开始使用Google应用程序脚本,然后按照加载项快速启动。

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

在快速启动中,您可以创建一个简单的外接程序,从文档中获取一个选择,并将其与LanguageApp服务进行转换。该示例使用以下内容获取底层文本:

代码语言:javascript
运行
复制
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.';
  }
}

它只获取文本:element.getText(),没有任何格式设置。

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

这是一个带有粗体文本的示例

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

这是一个带有粗体文本的示例。

而不是这个?

这是一个带有粗体文本的示例。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-11-15 17:07:36

有一个脚本GoogleDoc2HTML由奥马尔阿尔扎比尔。它的目的是将整个文档转换为HTML。由于您只想在所选元素中转换富文本,因此与任务相关的函数是脚本中的processText,如下所示。

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

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

脚本是没有维护的,所以把它看作是您自己代码的起点,而不是现成的库。有一些未合并的PRs可以改进转换过程,特别是内联链接。

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2019-02-06 20:52:49

最后创建了一个脚本来支持我的bold+links+italics用例:

代码语言:javascript
运行
复制
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("");
}

您可以简单地使用如下这样的方法来调用它:

代码语言:javascript
运行
复制
getHtmlOfElement(myTableCell); // returns something like "<b>Bold</b> test."
票数 0
EN

Stack Overflow用户

发布于 2021-07-07 23:55:13

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

代码语言:javascript
运行
复制
GmailApp.getDraft(draftId).getMessage().getBody().toString();

我发现这个线程试图跳过这一步,直接从Doc转到HTML,但我想我会分享。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47299478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档