GAS是否可以立即替换getActiveDocument()。getSelection()?

时间:2014-02-06 18:35:17

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

我的用户在他的Gdoc中有以下选择。

enter image description here

现在他从边栏上想要替换他在文件上做出的选择。
GAS的问题是,是否可以立即这样做,例如:      var selection = DocumentApp.getActiveDocument().getSelection()        selection.replace("newtext")
或者我是否必须遍历selection.getRangeElements()才能删除它们(或替换它们),而不是将新文本放在那个位置?

1 个答案:

答案 0 :(得分:2)

不是,这是不可能的(好吧,如果是的话,它没有记录)。

你必须遍历所选的元素,主要是因为选择可能会占用部分段落,迫使你管理它。即仅删除所选部分。对于已完成的选定元素,您可以完全删除它们(如图像)。

以下是关于如何执行此操作的实现(由我修改的Kaylan翻译脚本的一部分,以正确替换图像和部分选定的段落。

function replaceSelection(newText) {
  var selection = DocumentApp.getActiveDocument().getSelection();
  if (selection) {
    var elements = selection.getRangeElements();
    var replace = true;
    for (var i = 0; i < elements.length; i++) {
      if (elements[i].isPartial()) {
        var element = elements[i].getElement().asText();
        var startIndex = elements[i].getStartOffset();
        var endIndex = elements[i].getEndOffsetInclusive();
        var text = element.getText().substring(startIndex, endIndex + 1);
        element.deleteText(startIndex, endIndex);
        if( replace ) {
          element.insertText(startIndex, newText);
          replace = false;
        }
      } else {
        var element = elements[i].getElement();
        if( replace && element.editAsText ) {
          element.clear().asText().setText(newText);
          replace = false;
        } else {
          if( replace && i === elements.length -1 ) {
            var parent = element.getParent();
            parent[parent.insertText ? 'insertText' : 'insertParagraph'](parent.getChildIndex(element), newText);
            replace = false; //not really necessary since it's the last one
          }
          element.removeFromParent();
        }
      }
    }
  } else
    throw "Hey, select something so I can replace!";
}