删除一段文字

Removing a paragraph of text

我构建了一个应用程序脚本来复制文档并根据我输入到 Google 电子表格中的数据对其进行编辑。

文档被复制和编辑后,我想删除某些文本段落。

我正在使用以下方法查看是否可以找到 我正在搜索的文本,但我的代码返回 Range Element.

var body = DocumentApp.openById(copyID).getBody();
var para = body.findText('X1');

Logger.log(para);

我的理想状态是为应用程序脚本提供文档中的两个位置,然后让应用程序脚本删除该范围内的所有文本。

如何生成正确的偏移量并删除文本?

I was using the following to see if I could find the position of the text I was searching for, but my code returned Range Element.

这应该会发生,这里是文档中有关范围元素的一些信息。

Class RangeElement
A wrapper around an Element with a possible start and end offset. These offsets allow a range of characters within a Text element to be represented in search results, document selections, and named ranges.
https://developers.google.com/apps-script/reference/document/range-element


My ideal state would be to provide apps script with two positions within the document, and then have Apps Script delete all the text within those ranges.

使用以下方法检索偏移量并删除文本。

var startOffset = rangeElement.getStartOffset();
var endOffset = rangeElement.getEndOffsetInclusive();
rangeElement.getElement().asText().deleteText(startOffset,endOffset);

getStartOffset()
Gets the position of the start of a partial range within the range element. If the element is a Text element and isPartial() returns true, the offset is the number of characters before the start of the range (that is, the index of the first character in the range); in any other case, this method returns -1.
https://developers.google.com/apps-script/reference/document/range-element#getStartOffset()

getEndOffsetInclusive()
Gets the position of the end of a partial range within the range element. If the element is a Text element and isPartial() returns true, the offset is the number of characters before the last character in the range (that is, the index of the last character in the range); in any other case, this method returns -1.
https://developers.google.com/apps-script/reference/document/range-element#getEndOffsetInclusive()

deleteText(startOffset, endOffsetInclusive)
Deletes a range of text.
https://developers.google.com/apps-script/reference/document/text#deleteText(Integer,Integer)


How can I generate the correct offsets and delete the text?

以下脚本将执行此操作。

var rangeElement = DocumentApp.openById(copyID).getBody().findText('X1');
if (rangeElement.isPartial()) {
     var startOffset = rangeElement.getStartOffset();
     var endOffset = rangeElement.getEndOffsetInclusive();
     rangeElement.getElement().asText().deleteText(startOffset,endOffset);
} else {
     rangeElement.getElement().removeFromParent();
}

我一直在努力解决这个问题,发现以下代码片段有效:

var start = '{testingstart}'; // Starting text
var end = '{testingend}'; // Ending text
var startPara = findThisText(body, start); // Find element that has start text
var endPara = findThisText(body, end);  // Find element that has end text
var stIndex = body.getChildIndex(startPara); // Find index number of the starting child element
var edIndex = body.getChildIndex(endPara);  // Find the index number of the ending child element

var loop = edIndex - stIndex;
for(var i = 0; i < loop; i++){
  // Keep removing the child element with index = stIndex until the loop ends.
  var removing = body.getChild(stIndex);
  body.removeChild(removing);
}

我还使用以下辅助函数来查找给定文本所需的元素:

// Helper function to locate field based on search text
function findThisText(body, text) {
    var found = body.findText(text);
    if(found) {
      return found.getElement().getParent();
    } else {
      return null;
    }
}

它的优点在于它删除了开始目标和结束目标之间的任何 ElementType。如果我在段落之间也有表格,这对我很有用。 参考:https://developers.google.com/apps-script/reference/document/body