url - 谷歌脚本:搜索和替换文档中链接文本的 url(不是工作表)
问题描述
我正在尝试将链接文本从旧网址搜索并替换为新网址。
它不工作,我花了好几个小时。如果我删除“如果(找到)”,它会给我“TypeError:无法读取 null 的属性'getElement'”,即使我的文件有链接到这个 old_url 的文本。
请帮我。
function myFunction() {
var old_url ="http://hurlx1.com";
var new_url ="http://urlxa.com";
var files = DriveApp.getFolderById("my folder id").getFilesByType(MimeType.GOOGLE_DOCS);
while (files.hasNext()) {
var file = files.next();
var doc = DocumentApp.openById(file.getId());
found=doc.getBody().findText(old_url);
if (found) {
var link_element = found.getElement().asText();
var start = found.getStartOffset();
var end = found.getEndOffsetInclusive();
var correct_link = link_element.getText().slice(start, end);
link_element.setLinkUrl(start, end, correct_link);
}
}
}
解决方案
我相信你的情况和目标如下。
- 在您的 Google 文档中,
- 文本和超链接与 相同
old_url
。 - 超链接是
old_url
. 但文字与old_url
.
- 文本和超链接与 相同
- 您想使用 Google Apps 脚本进行
old_url
更新new_url
。
为此,这个答案怎么样?
修改点:
- 关于您的错误消息,当
old_url
在 Google 文档中找不到的文本时found=doc.getBody().findText(old_url);
,即使设置为超链接也会found
变为。因为搜索文档正文上的文本,并且无法搜索设置为文本的超链接。我认为这是您的问题的原因。null
old_url
findText
- 在您的脚本中,
var new_url ="http://urlxa.com";
使用了。但是在设置链接时,correct_link
使用link_element.setLinkUrl(start, end, correct_link);
. 由此,new_url
不设置。 - 当您要更新
http://hurlx1.com
tonew_url
of的文本时var new_url ="http://urlxa.com";
,还需要修改文本。 - 在您的脚本中,只有第一个
old_url
被更新。如果 Document 中有多个 的值old_url
,则需要使用循环更新它们。
修改脚本规范:
此修改后的脚本可用于以下模式。
- 文本和超链接与 相同
old_url
。- 在这种情况下, 的文本值
old_url
也更新为old_url
。
- 在这种情况下, 的文本值
- 超链接是
old_url
. 但文字与old_url
.- 在这种情况下,仅
old_url
更新 的超链接。
- 在这种情况下,仅
old_url
Google 文档中有几个带有超链接的文本。
修改后的脚本:
function myFunction() {
var old_url ="http://hurlx1.com";
var new_url ="http://urlxa.com";
var files = DriveApp.getFolderById("my folder id").getFilesByType(MimeType.GOOGLE_DOCS);
while (files.hasNext()) {
var file = files.next();
var doc = DocumentApp.openById(file.getId());
var body = doc.getBody();
// The following script is used for the situation that the text and hyperlink are the same with `old_url`.
var found = body.findText(old_url);
while (found) {
var link_element = found.getElement().asText();
var start = found.getStartOffset();
var end = found.getEndOffsetInclusive();
var correct_link = link_element.getText().slice(start, end);
link_element.setLinkUrl(start, end, new_url).replaceText(old_url, new_url);
found = body.findText(old_url, found);
}
// The following script is used for the situation that although the hyperlink is `old_url`, the text is different from `old_url`.
var text = body.editAsText();
for (var i = 0; i < text.getText().length; i++) {
if (text.getLinkUrl(i) == old_url) {
text.setLinkUrl(i, i + 1, new_url);
}
}
}
}
参考:
推荐阅读
- javascript - 我无法解决的 JavaScript 挑战
- android - 在 android 中使用存储访问框架时需要 READ_EXTERNAL_STORAGE 权限
- android - getSupportFragmentManager:不兼容的类型
- c++ - C++ 重载括号 [] 运算符获取和设置不同的返回类型
- r - 将 abline 添加到图例
- python - 从 db 解析 pypyodbc 数据
- javascript - 轮询页面后 Javascript 停止运行
- hangfire - Hangfire 不使用配置的 Logger 记录异常
- html - 如何在css中以直线在单个图像之间给出相等的间距?
- objective-c - Objective-C - 如何用 NSInteger 初始化枚举?