使用正则表达式消除谷歌应用脚本中的换行符



我正在尝试为 Google 文档编写一个附加组件的一部分,该插件使用 replaceText 消除选定文本中的换行符。明显的text.replaceText("n","");给出了错误Invalid argument: searchPattern。我在text.replaceText("r","");上遇到了同样的错误.以下尝试不执行任何操作:text.replaceText("/n/","");text.replaceText("/r/",""); 。我不知道为什么Google App Script不允许在正则表达式中识别换行符。

我知道已经有一个附加组件可以做到这一点,但我想将此功能合并到我的附加组件中。

即使使用基本

DocumentApp.getActiveDocument().getBody().textReplace("n","");

我的全部功能:

function removeLineBreaks() {
var selection = DocumentApp.getActiveDocument().getSelection();
if (selection) {
    var elements = selection.getRangeElements();
    for (var i = 0; i < elements.length; i++) {
        var element = elements[i];
        // Only deal with text elements
        if (element.getElement().editAsText) {
            var text = element.getElement().editAsText();
            if (element.isPartial()) {
                text.replaceText("n","");
            }
            // Deal with fully selected text
            else {
                text.replaceText("n","");
            }
        }
    }
}
// No text selected
else {
    DocumentApp.getUi().alert('No text selected. Please select some text and try again.');
}

}

似乎在 replaceText 中,要删除使用 Shift-ENTER 输入的软返回,您可以使用 v

.replaceText("\v+", "")

如果要删除所有"其他"控制字符(C0、DEL 和 C1 控制代码),可以使用

.replaceText("\p{Cc}+", "")

请注意,v模式是JavaScript正则表达式引擎支持的结构,并且被大多数Google产品中使用的RE2正则表达式库认为与垂直制表符(≡ 13)匹配。

Google Apps Script 函数 replaceText() 仍然不接受转义字符,但我能够通过使用 getText() 来解决这个问题,然后是通用的 JavaScript replace(),然后是 setText():

var doc = DocumentApp.getActiveDocument();
var body = doc.getBody();
var bodyText = body.getText();
//DocumentApp.getUi().alert( "Does document contain \t? " + /t/.test( bodyText ) ); // n true, r false, t true
bodyText = bodyText.replace( /n/g, "" );
bodyText = bodyText.replace( /t/g, "" );
body.setText( bodyText );

这在文档中有效。不确定在工作表中是否可以进行相同的操作(而且,即使可以,您可能也必须一次运行一次单元格)。

这是我在Google Docs中消除换行符的实用解决方案,或者更准确地说,从Gmail message.getPlainBody()中删除换行符。看起来谷歌使用"\r\r"作为普通的EOL,使用"\r"作为曼努埃尔换行(Shift-Enter)。代码应该是可解释的。单独解决文档中的换行符问题可能会有所帮助。一个解决方案可能不是很优雅,但就像一个魅力:-)

function GetEmails2Doc() { 
var doc = DocumentApp.getActiveDocument(); 
var body = doc.getBody(); 
var pc = 0;  // Paragraph Counter
var label = GmailApp.getUserLabelByName("_Send2Sheet"); 
var threads = label.getThreads(); 
var i = threads.length; 
// LOOP Messages within a THREAT  
for (i=threads.length-1; i>=0; i--) { 
for (var j = 0; j < messages.length; j++) { 
var message = messages[j]; 
/* Here I do some ...
body.insertParagraph(pc++, Utilities.formatDate(message.getDate(), "GMT",
"dd.MM.yyyy (HH:mm)")).setHeading(DocumentApp.ParagraphHeading.HEADING4) 
str = message.getFrom() + ' to: ' + message.getTo(); 
if (message.getCc().length >0) str = str + ", Cc: " + message.getCc(); 
if (message.getBcc().length >0) str = str + ", Bcc: " + message.getBcc(); 
body.insertParagraph(pc++,str);
*/ 
// Body !! 
var str = processBody(message.getPlainBody()).split("pEOL"); 
Logger.log(str.length + " EOLs"); 
for (var k=0; k<str.length; k++) body.insertParagraph(pc++,str[k]);
}
}
}
function processBody(tx) {
var s = tx.split(/rnrn/g);
// it looks like message.getPlainBody() [of mail] uses rnrn as EOL
// so, I first substitute the 'EOL's with the string pattern "pEOL"
// to be replaced with body.insertParagraph in the main function 
tx = ''; 
for (k=0; k<s.length; k++) tx = tx + s[k] + "pEOL"; 
// then replace all remaining simple rn with a blank 
s = tx.split(/rn/g); 
tx = ''; 
for (k=0; k<s.length; k++) tx = tx + s[k] + " ";
return tx;
}

我现在已经通过大量的试验和错误 - 以及Wiktor Stribiżew的一些急需的帮助(见其他答案) - 发现有一个解决方案,但它依赖于谷歌脚本无法识别正则表达式搜索中的nr的事实。解决方案如下:

function removeLineBreaks() {
  var selection = DocumentApp.getActiveDocument()
    .getSelection();
  if (selection) {
    var elements = selection.getRangeElements();
    for (var i = 0; i < elements.length; i++) {
      var element = elements[i];
      // Only deal with text elements
      if (element.getElement()
        .editAsText) {
        var text = element.getElement()
          .editAsText();
        if (element.isPartial()) {
          var start = element.getStartOffset();
          var finish = element.getEndOffsetInclusive();
          var oldText = text.getText()
            .slice(start, finish);
          if (oldText.match(/r/)) {
            var number = oldText.match(/r/g)
              .length;
            for (var j = 0; j < number; j++) {
              var location = oldText.search(/r/);
              text.deleteText(start + location, start + location);
              text.insertText(start + location, ' ');
              var oldText = oldText.replace(/r/, ' ');
            }
          }
        }
        // Deal with fully selected text
        else {
          text.replaceText("\v+", " ");
        }
      }
    }
  }
  // No text selected
  else {
    DocumentApp.getUi()
      .alert('No text selected. Please select some text and try again.');
  }
}

解释

谷歌文档允许搜索垂直标签(v),它匹配换行符。

部分文本是另一个问题。处理上述部分选定文本的解决方案通过从文本元素中提取文本字符串并在该字符串中搜索来查找换行符的位置。然后,它使用这些位置删除相关字符。重复此操作,直到达到所选文本中的换行符数。

此堆栈溢出答案特别删除""。它可能会有所帮助,它确实帮助了我。

最新更新