我要在文档中插入文本,并且每次插入的文本都会添加到一个命名范围中,以便可以使用getNamedRanges(NAME)
和getNamedRangesById(ID)
来查找它们。
现在,我需要检查当前光标位置是否在指定的范围内,而我还没有弄清楚该怎么做。
此帖子类似: How to determine the named range from position in Google Docs through Google Apps Script
但是当光标位于命名范围cursor.getElement()
上时,将返回Text
对象,而不是命名范围。
如何确定光标当前是否位于命名范围内?
答案 0 :(得分:1)
您所引用的帖子中提出的解决方案意味着遍历感兴趣的范围并检查范围元素之一是否等于光标所在的元素。
代码应如下所示:
function myFunction() {
var doc = DocumentApp.getActiveDocument();
var cursor = doc.getCursor();
var el=cursor.getElement().asText().getText();
var range;
//specify the name of the range of interest in getNamedRanges()
doc.getNamedRanges('testy').forEach(function(rangeEntry){
(rangeEntry.getRange().getRangeElements().forEach(function(element){
var child=element.getElement().getText();
if(child==el){
Logger.log("Cursor is on named range "+rangeEntry.getName())
}
}))
})
}
答案 1 :(得分:1)
如果我的理解是正确的,那么该示例脚本如何?请认为这只是几个答案之一。
在这种解决方法中,我通过比较namedRange和游标位置的段落索引来检查是否在namedRange中包括了光标位置。
脚本的流程如下。
cursor
变成了null
。myFunction()
返回true
。
myFunction()
返回false
。在使用此脚本之前,请设置namedRange ID。
function myFunction() {
var nameRangeId = "###"; // Please set namedRange ID here.
var getIndex = function(doc, e) {
while (e.getParent().getType() != DocumentApp.ElementType.BODY_SECTION) e = e.getParent();
return doc.getBody().getChildIndex(e);
};
var doc = DocumentApp.getActiveDocument();
// For namedRange
var namedRange = doc.getNamedRangeById(nameRangeId);
if (namedRange) {
var indexOfNamedRange = namedRange.getRange().getRangeElements().map(function(e) {return getIndex(doc, e.getElement())});
} else {
throw new Error("No namedRange.");
}
var name = namedRange.getName();
// For cursor
var cursor = doc.getCursor();
if (cursor) {
var indexOfCursor = getIndex(doc, cursor.getElement());
if (~indexOfNamedRange.indexOf(indexOfCursor)) {
Logger.log("Inside of %s", name);
return true;
}
Logger.log("Outside of %s", name);
return false;
}
// For select
var select = doc.getSelection();
if (select) {
var indexOfSelect = select.getRangeElements().map(function(e) {return getIndex(doc, e.getElement())});
if (indexOfSelect.some(function(e) {return ~indexOfNamedRange.indexOf(e)})) {
Logger.log("Inside of %s", name);
return true;
}
Logger.log("Outside of %s", name);
return false;
}
throw new Error("No cursor and select.");
}
// For select
。true
。对此,请根据您的情况进行修改。如果我误解了您的问题,而这不是您想要的方向,我深表歉意。