Google Apps脚本用于查找正文中的网址并将其格式化为超链接

时间:2016-10-07 23:04:11

标签: javascript google-apps-script google-docs

我有一个从命令行脚本生成的文本块,它会旋转许多虚拟机。文本输出包含有关如何访问虚拟机上的Web应用程序的说明,如下所示:

TrainingMachine01
Username: [user] 
Password: [pass] 
iPython: http://ip/ 
RStudio: http://ip:8787/

我将此文本转储到Google Doc中,该文档与许多人共享(我们在Python和R中运行课程,并为每个与会者启动VM)。

我希望能够将输出格式化为超链接,以便与会者只需点击URL而不是将其复制并粘贴到浏览器中(firstworldproblems)。

在调查将文字粘贴到Google文档中的方法后,我认为这不是一个比Google Apps脚本更简单的解决方案,它只会找到与网址匹配的模式,并使其成为超链接。

这是我到目前为止所做的事情,主要基于this answer对另一个问题:

function updateLinks() {
  // Open active doc
  var body = DocumentApp.getActiveDocument().getBody();
  // Find URLs
  var link = body.findText("http:\/\/.*\/");

  // Loop through
  while (link != null) {
    // Get the link as an object
    var foundLink = link.getElement().asText();

    // Get the positions of start and end
    var start = link.getStartOffset();
    var end =link.getEndOffsetInclusive();

    // Format link
    foundLink.setLinkUrl(start, end, foundLink);

    // Find next
    link = body.findText("http:\/\/.*\/", link);
  }
}

我的模式和循环工作正常,但如果我在格式链接部分使用http://text,或foundLink,则写入超链接的网址为http://rangeelement如果我使用link var。

如何让脚本将URL设置为文本本身?

(Javascript新手,并且一直在使用这样的练习来学习它和Google Apps脚本)

更新: a-change的评论向我指出了文本元素上的getText()方法,因此相关行变为foundLink.setLinkUrl(start, end, foundLink.getText());。但是,这仍然不能正常工作,并且正在插入指向about:blank的链接。有关如何清理从findText()中提取的文本的任何想法吗?

2 个答案:

答案 0 :(得分:2)

更详细地研究它。 如果您记录foundLink.getText()的值,则会看到它实际上包含该行上找到的所有字符串,即RStudio: http://ip:8787/而不是http://ip:8787/。这可能是因为link.getElement()返回包含找到的文本的范围的整个元素。

你可以在不同的行上写下你所有的链接,这个功能可以很好地工作但是文档本身看起来不太好。

所以你需要做的是另外从foundLink.getText()字符串中切出链接。这是稍微修改过的初始函数:

 function updateLinks() {
  // Open active doc
  var body = DocumentApp.getActiveDocument().getBody();
  // Find URLs
  //Logger.log(body.findText("http").getElement().asText().getText());
  var link = body.findText("http:\/\/.*\/");
  // Loop through
  while (link != null) {
    // Get the link as an object
    var foundLink = link.getElement().asText();
    // Get the positions of start and end
    var start = link.getStartOffset();
    var end = link.getEndOffsetInclusive();
    //check the value of foundLink if needed
    //Logger.log(foundLink.getText());
    //slice only the link out of it
    var correctLink = foundLink.getText().slice(start, end);
    // Format link
    foundLink.setLinkUrl(start, end, correctLink);
    // Find next
    link = body.findText("http:\/\/.*\/", link);
  }
}

答案 1 :(得分:0)

我在其他地方和其他地方都尝试过其他正则表达式示例,但在重现结果时遇到了麻烦-我怀疑是由于Google Apps脚本不是完整的JS。

这对我有用,可以检测到带有尾随空格的http和https链接。我已经测试了在行/段末尾开始/结束的链接,以及前行和尾随测试(由空格分隔),它们都可以正常工作。

function makeLinks() {
  var linkRegex = "https?:\/\/[^\\s]*";

  // Open active doc
  var body = DocumentApp.getActiveDocument().getBody();
  // Find URLs
  //Logger.log(body.findText("http").getElement().asText().getText());
  var link = body.findText(linkRegex);

  // Loop through the body finding texts matching the search pattern
  while (link != null) {
    // Get the link as an object
    var linkElement = link.getElement().asText();
    // Get the positions of start and end
    var start = link.getStartOffset();
    var end = link.getEndOffsetInclusive();

    //slice only the link out of it
    var correctLink = linkElement.getText().slice(start, end);
//    Logger.log("correctLink " + correctLink);

    // Format link
    linkElement.setLinkUrl(start, end, correctLink);
    // Find next
    link = body.findText(linkRegex, link);
  }
}

我希望它可以帮助其他人