搜索文本文档并将属性应用于结果

时间:2017-12-29 21:38:00

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

我有一个Google文档文档,其短语由“@”符号分隔。我想编写一个脚本来遍历整个文档,找到这些“@” - 分隔的短语,删除“@”符号,并使短语加下划线。任何建议将不胜感激。短语将仅为alpha,并且将是两个或更多单词。

e.g:

  @Dear Sir @,@我已经准备好帮你@@限制获得亚麻@you将需要@y。 @I可以@在5月中旬@ie @的主要数据中与你见面。那@不会太晚了吗? @Yours真正的@,

附录

这是我到目前为止尝试过的代码

function convertUnderline() {
  var body = DocumentApp.getActiveDocument().getBody();
  var foundElement;
  var foundText;

  foundElement = body.findText("@[a-zA-Z ]+[a-zA-Z]@");
  foundText = foundElement.getElement().asText().setUnderline(true);
  body.replaceText("@", "");
}

这适用于查找和强调第一场比赛。不过,我不确定如何遍历文档的其余部分。我之前并不热衷于替换所有“@”符号,但似乎是Google Apps脚本doesn't support backreferences中的正则表达式引擎(请参阅转义序列下的“\ 1”项)。

1 个答案:

答案 0 :(得分:0)

Grant,欢迎使用堆栈溢出。在这些部分中,正常的协议是放下你已经尝试过的一些代码并且没有做得那么好,然后请求你正在努力解决的问题。

也许在这种情况下,开始的好地方是apps-script documentation中的“findText()”,或使用replaceText()之类的东西。

我们也欢迎您查看我的sidebar tool,它会做一些非常相似的事情,但会突出显示文字,而不是使用“@”。

或者,下面的代码将所有单词都添加到数组中。然后基于根据数组中每个项目的长度计算的偏移坐标迭代文档文本设置下划线。使用工作示例found here.

function convertUnderline() {

  var bodyTextElement = DocumentApp.getActiveDocument().getBody().editAsText();;
  var textArr = bodyTextElement.getText().split(/(?=@)/g);  
  var cursorStartPosition = 0


  var attributes = {};
  attributes[DocumentApp.Attribute.UNDERLINE] = true;

  for (var i = 0; i <  textArr.length-1; i ++){
    var textLength = textArr[i].length;  
    if(textArr[i].indexOf('@ ') < 0){
      bodyTextElement.editAsText().setAttributes(cursorStartPosition,cursorStartPosition + textLength, attributes)
    }
    cursorStartPosition += textArr[i].length;
    bodyTextElement.replaceText("@", " ");
  }
}