Google apps script 如何在GoogleApps脚本中将命名范围添加到子段落元素
我想在Google文档中实现一个“html span-like”功能,但每当我尝试向Google文档中的文本子字符串添加Google apps script 如何在GoogleApps脚本中将命名范围添加到子段落元素,google-apps-script,google-docs,named-ranges,Google Apps Script,Google Docs,Named Ranges,我想在Google文档中实现一个“html span-like”功能,但每当我尝试向Google文档中的文本子字符串添加NamedRange时,该范围就会与同一段落中的先前文本合并 结果,NamedRange应用于整个段落 下面是我的测试用例: 函数createTextNamedRange(){ //检索当前文档的正文 var doc=DocumentApp.getActiveDocument(); var docBody=doc.getBody(); //添加文本为{NotNamed}的新段落
NamedRange
时,该范围就会与同一段落中的先前文本合并
结果,NamedRange
应用于整个段落
下面是我的测试用例:
函数createTextNamedRange(){
//检索当前文档的正文
var doc=DocumentApp.getActiveDocument();
var docBody=doc.getBody();
//添加文本为{NotNamed}的新段落
var para=docBody.append段落('{NotNamed}');
//追加一些将命名的文本(.appendText()方法返回一个文本元素)
var textElem=para.appendText(“{NamedText}”);
//为文本元素构建一个范围
var range=doc.newRange().addElement(textElem.build();
//命名范围并将其附加到文档中
文件addNamedRange(“myNamedRange”,范围);
}
然后,我使用此函数中的Logger
类显示NamedRange
的内容:
函数getTextNamedRange(){
//检索命名范围
var namedRanges=DocumentApp.getActiveDocument().getNamedRanges();
//遍历名称“myNamedRange”的每个实例(只有一个)
用于(名称表中的变量编号){
var namedRange=namedRanges[nr];
//一个范围可能包含多个RangeElements,并对其进行迭代
var rangeElements=namedRange.getRange().getRangeElements();
for(范围元素中的var re){
//获取每个RangeElement的文本并将其显示在记录器中
var text=rangeElements[re].getElement().asText().getText();
Logger.log('namedRange('+namedRange.getName()+')文本:“'+Text+'”);
}
}
}
我假设将{NamedText}
作为输出,但日志窗口告诉我们:
Text with namedRange (myNamedRange) : "{NotNamed}{NamedText}"
可以看出,该范围应用于未标记文本和命名文本
我发现了,但绝对不是我喜欢的:它包括在.appendText()
调用之间添加空的内联图像。这样就不会合并文本元素
我仍在寻找更好的解决方案。以下内容仅适用于解决方案,但似乎有效 它依赖于必须命名的
文本块前后的InlineImage
插入
当应用于段落中的文本块时,这将防止命名区域
合并
函数createTextNamedRangeWorkaround(){
//解决方法:防止文本合并(从而防止NamedRange合并)
//通过使用空白内联图像分离文本元素
//导入一个空白的PNG文件
//注意:这不应该每次都提取
//但只有一次,并作为一个论点通过
var blankImage=UrlFetchApp.fetch('http://upload.wikimedia.org/wikipedia/commons/d/d2/Blank.png');
//检索当前文档的正文
var doc=DocumentApp.getActiveDocument();
var docBody=doc.getBody();
//添加文本为{NotNamed}的新段落
var para=docBody.append段落('{NotNamed}');
//解决方法:
para.appendInlineImage(blankImage.getBlob());
//附加一些文本
var textElem1=para.appendText(“{NamedText1}”);
//解决方法:
para.appendInlineImage(blankImage.getBlob());
//附加一些文本
var textElem2=para.appendText(“{NamedText2}”);
//在插入文本后生成命名范围(请参见下面的注意事项)
var range1=doc.newRange().addElement(textElem1.build();
//命名范围并将其附加到文档中
文件addNamedRange(“范围1”,范围1);
var range2=doc.newRange().addElement(textElem2.build();
//命名范围并将其附加到文档中
文件addNamedRange(“范围2”,范围2);
}
执行后,文档将附加一个新段落,其中包含三个单词,由两个空白内联PNG分隔
{NotNamed}{NamedText1}{NamedText2}
执行mygetTextNamedRange()
会显示所需的行为:
Text with namedRange (Range1) : "{NamedText1}"
Text with namedRange (Range2) : "{NamedText2}"
重要注意事项:
- 命名范围必须在最后一次插入
文本后一起应用,否则,以前的命名范围将采用新的插入和附加
- 无法使用
image.removeFromParent()
从父段落中删除InlineImages
,因为这会导致文本
元素(以及NamedRange
)再次合并
令人震惊的是,这仍然是让段落间命名范围正常工作的唯一方法。如果其他可怜的人想让它工作,你也可以使用光标函数而不是段落cursor.insertInlineImage(blob)
->cursor.insertText(“您的文本”)
->cursor.insertInlineImage(blob)
。非常感谢您写下这篇文章,这篇文章仍然没有文档记录,在找到这篇文章之前,我们花了好几个小时才想出解决方案。