Google(Docs)Apps脚本-无法检查光标是否位于命名范围内

时间:2019-07-09 11:29:47

标签: google-apps-script google-docs google-apps-script-addon

我要在文档中插入文本,并且每次插入的文本都会添加到一个命名范围中,以便可以使用getNamedRanges(NAME)getNamedRangesById(ID)来查找它们。

现在,我需要检查当前光标位置是否在指定的范围内,而我还没有弄清楚该怎么做。

此帖子类似: How to determine the named range from position in Google Docs through Google Apps Script

但是当光标位于命名范围cursor.getElement()上时,将返回Text对象,而不是命名范围。

如何确定光标当前是否位于命名范围内?

2 个答案:

答案 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)

  • 您要确认当前光标位置是否在Google文档的namedRange中。
  • 您想使用Google Apps脚本实现这一目标。

如果我的理解是正确的,那么该示例脚本如何?请认为这只是几个答案之一。

解决方法:

在这种解决方法中,我通过比较namedRange和游标位置的段落索引来检查是否在namedRange中包括了光标位置。

流量:

脚本的流程如下。

  1. 检索namedRange的段落的索引。
    • 此示例脚本是根据您的问题使用的namedRange ID。
    • 在这种情况下,可能会有多个段落,包括表格,列表等。因此,将检索namedRange中的所有索引。
  2. 检索光标位置的段落的索引。
  3. 检索所选范围的段落索引。
    • 此示例脚本还检查所选范围是否在namedRange中。因为选择文本后,cursor变成了null
  4. 如果光标或所选范围停留在namedRange中,则myFunction()返回true
    • 如果光标或所选范围未停留在namedRange中,则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
  • 在此脚本中,namedRange中甚至只包含选定范围的一个索引,返回true。对此,请根据您的情况进行修改。
  • 在当前阶段,该脚本不假定页眉和页脚节。

参考:

如果我误解了您的问题,而这不是您想要的方向,我深表歉意。