2016-06-12 3 views
2

Ich versuche, einen Teil eines Add-ons für Google Text & Tabellen zu schreiben, das Zeilenumbrüche in ausgewähltem Text mit replaceText ausschließt. Das offensichtliche text.replaceText("\n",""); gibt den Fehler Invalid argument: searchPattern. Ich bekomme den gleichen Fehler mit text.replaceText("\r","");. Die folgenden Versuche machen nichts: text.replaceText("/\n/","");, text.replaceText("/\r/","");. Ich weiß nicht, warum Google App Script die Erkennung von Zeilenumbrüchen in Regex nicht zulässt.Eliminieren Sie Zeilenumbrüche in Google App-Skript mit Regex

Ich bin mir bewusst, dass es ein Add-on gibt, das dies bereits tut, aber ich möchte diese Funktion in mein Add-on integrieren.

Dieser Fehler tritt auch bei der Grund

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

Meine volle Funktion:

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.'); 
} 

}

+0

Sind diese Zeilenumbrüche nicht Wagenrücklauf? Versuchen Sie 'text.replaceText (" \ r "," ");' oder 'text.replaceText (" [\ r \ n] + "," ");' –

+0

Siehe oben "Ich bekomme den gleichen Fehler mit text.replaceText ("\ r", "") ". [\ n] oder [\ r] tun Sie einfach nichts. –

+0

Haben Sie etwas wie 'DocumntApp.getActiveDocument(). GetBody(). ReplaceText (" \ n "," ");'? –

Antwort

0

ich jetzt durch viel Versuch und Irrtum herausgefunden haben - und einige viel benötigte Hilfe von Wiktor Stribiżew (siehe andere Antwort) - dass es eine Lösung dafür gibt, aber es beruht auf der Tatsache, dass Google Script das nicht erkennt e \n oder \r in Regex-Suchen. Die Lösung ist wie folgt:

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.'); 
    } 
} 

Erläuterung

Google Text ermöglicht die vertikale Laschen (\v) Benutzer, die neue Zeilen entsprechen.

Teiltext ist ein ganz anderes Problem. Die Lösung zum Behandeln von teilweise ausgewähltem Text oben findet die Position von Zeilenumbrüchen durch Extrahieren einer Textzeichenfolge aus dem Textelement und Suchen in dieser Zeichenfolge. Es verwendet dann diese Orte, um die relevanten Zeichen zu löschen. Dies wird wiederholt, bis die Anzahl der Zeilenumbrüche im ausgewählten Text erreicht ist.

+0

Die Regex ist nicht korrekt innerhalb eines Klammerausdrucks und in der RE-Bibliothek im Allgemeinen können keine Lookarounds verwendet werden. Wenn es funktioniert hat, liegt das an dem Text, den Sie haben, aber nicht daran, dass die Regex korrekt funktioniert hat. –

+0

@ WiktorStribiżew Ich war sicher, dass die ursprüngliche Lösung funktionierte, als ich es zum ersten Mal versuchte, aber Sie haben recht, es tut es nicht. –

2

Es scheint, dass in replaceText, weich kehrt mit Shift- eingegeben zu entfernen - eingeben, können Sie \v verwenden:

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

Wenn Sie alle "other" control characters (C0, DEL and C1 control codes) entfernen möchten, können Sie verwenden

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

beachten, dass das Muster ein \v Konstrukts durch JavaScr abgestützt ist ipt Regex-Engine, und gilt als eine vertikale Registerkarte Zeichen (\013) von der RE2 regex library in den meisten Google-Produkten verwendet.

+0

Vielen Dank für Ihre Hilfe! Es gibt nicht viel Anleitung für Google Scripting (verglichen mit, sagen wir, JavaScript). –

Verwandte Themen