GAS 是否可以一次替换 getActiveDocument().getSelection() ?

Jac*_*vdb 5 sidebar google-docs google-apps-script

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

在此处输入图片说明

现在从侧边栏他想替换他在文档上所做的选择。
GAS 问题是是否可以立即执行此操作,例如: 或者我是否必须循环遍历才能删除它们(或替换它们),然后以某种方式将新文本放在该位置?
var selection = DocumentApp.getActiveDocument().getSelection() selection.replace("newtext")
selection.getRangeElements()

Hen*_*reu 6

Not, that's not possible (well, if it is, it's not documented).

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

这是有关如何执行此操作的实现(我修改了 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!";
}
Run Code Online (Sandbox Code Playgroud)