主要问题是将findText 的结果视为一个单词。
这很棘手,因为您无法获得“单词”元素。你必须:
- 获取
findText 返回的整个段落元素。这包含搜索结果。
- 获取找到的单词的开头和结尾的索引值。
- 获取该索引处的超链接
- 删除这些索引之间的文本
- 插入新文本,然后为超链接分配新索引。
例如:
foundText.insertText(0, findtext)
在结果所在元素的开始处插入您要查找的文本,即“搜索”。
这个:
var hyperlink = foundText.getLinkUrl(0)
这只会获取在段落开头找到的超链接,例如,这意味着如果段落的第一个单词有超链接,这就是它将返回的内容。在getLinkUrl() 中应该使用搜索结果的起始索引。
解决方案
此代码将替换文本并保留超链接(如果有)。
function replaceTextKeepHyperlink(textToReplace, ReplacementText) {
var body = DocumentApp.getActiveDocument().getBody();
var searchResult = body.findText(textToReplace);
while (searchResult != null) {
// Getting info about result
var foundText = searchResult.getElement().asText();
var start = searchResult.getStartOffset();
var end = searchResult.getEndOffsetInclusive();
var hyperlink = searchResult.getElement().getLinkUrl(start);
// Modifying text
foundText.deleteText(start, end)
foundText.insertText(start, ReplacementText)
foundText.setLinkUrl(start, start + ReplacementText.length - 1, hyperlink)
// Moving to next search result
searchResult = body.findText(textToReplace, searchResult);
}
}
但它不会保留任何其他格式,因此您需要在代码的“获取信息”和“修改”部分添加一些行。
参考
更新
mshcruz 发现如果你用这样的参数调用函数:
replaceTextKeepHyperlink("Search", "PrefixedSearch")
该函数陷入无限循环,因为它在刚刚替换的文本中找到它正在寻找的文本,替换该部分,等等。
他提供了包含在下面的尝试块的修复,以避免在文档末尾找到 textToReplace 时产生的错误:
function replaceTextKeepHyperlink(textToReplace, ReplacementText) {
var body = DocumentApp.getActiveDocument().getBody();
var searchResult = body.findText(textToReplace);
while (searchResult != null) {
var foundText = searchResult.getElement().asText();
var start = searchResult.getStartOffset();
var end = searchResult.getEndOffsetInclusive();
var hyperlink = searchResult.getElement().getLinkUrl(start);
foundText.deleteText(start, end)
foundText.insertText(start, ReplacementText)
foundText.setLinkUrl(start, start + ReplacementText.length - 1, hyperlink)
try {
let rangeBuilder = DocumentApp.getActiveDocument().newRange();
rangeBuilder.addElement(searchResult.getElement(), start, end+ReplacementText.length - 1);
searchResult = rangeBuilder.getRangeElements()[0];
} catch (e){
Logger.log("End of Document")
return null
}
searchResult = body.findText(textToReplace, searchResult);
}
}