Google Apps Script在body中查找url并将其格式化为超链接
Google Apps Script to find URLs in body and format them as hyperlinks
我有一个从命令行脚本生成的文本块,该脚本启动了许多虚拟机。文本输出包含如何在虚拟机上访问web应用程序的说明,例如:
TrainingMachine01
Username: [user]
Password: [pass]
iPython: http://ip/
RStudio: http://ip:8787/
我把这篇文章转储到谷歌文档中,与许多人共享(我们运行Python和R课程,并为每个参与者启动一个虚拟机)。
我希望能够将我的输出格式为超链接,这样与会者只需要点击URL,而不是将其复制并粘贴到浏览器中(firstworldproblems)。
在研究了将文本粘贴到Google Docs中的方法之后,我认为没有比Google Apps脚本更简单的解决方案了,它可以简单地找到与URL匹配的模式,并将它们变成超链接。
到目前为止,我所得到的大部分是基于对另一个问题的回答:
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);
}
}
我的模式和循环工作良好,除了被写入超链接的URL是http://text
,如果我在格式链接部分使用foundLink
,或http://rangeelement
,如果我使用link
变量。
我怎么能有脚本设置URL作为文本本身?
(Javascript新手,一直在使用这样的练习来学习它和Google Apps Script)
Update: a-change的注释让我注意到文本元素的getText()
方法,因此相关行变为foundLink.setLinkUrl(start, end, foundLink.getText());
。然而,这仍然不完全工作,并插入指向about:blank
的链接。
findText()
中提取的文本?看得更详细。如果你记录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);
}
}
我在上面和其他地方尝试了其他正则表达式示例,并且在再现结果时遇到了麻烦-我怀疑是由于Google Apps Script不是完整的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);
}
}
我希望它能帮助到别人
- 制作一个不带HTML a标记但在动画播放完毕后指向其他页面的超链接
- 单击超链接时,如何使用Google Maps API v3缩放地图
- 用超链接替换URLS
- 使用JavaScript从超链接加载时的默认下拉值
- Hammer.js阻止在Android Webview中点击超链接
- 将超链接添加到“;标题“;标记文本
- 文本建议的超链接
- 用Javascript按钮替换Javascript超链接
- 删除默认的ui超链接行为
- 谷歌将广告超链接映射到国家标记
- 如何在点击超链接时调用fullcalendar回调
- 单击“禁用其他超链接”
- 为Angularjs制作超链接
- 指向的超链接刚刚赢得'不起作用
- 如何将超链接添加到通过传单创建的传单多段线.Draw
- 如何禁用鼠标中键单击超链接以在新选项卡或新窗口中打开
- 如何在每个动态创建的ImageButton周围包装超链接?Visual Studio
- 将数据库中的超链接添加到查询结果
- 从JSON对象创建具有超链接的HTML表
- Highcharts柱状图与下钻,删除超链接,如格式化从x轴标签