我有一个从命令行脚本生成的文本块,它会旋转许多虚拟机。文本输出包含有关如何访问虚拟机上的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()
中提取的文本的任何想法吗?
答案 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);
}
}
我希望它可以帮助其他人