Frage an google-apps-script – Verwendung der Methode replaceText (searchPattern, replacement) in Dokumenten Service / Text Class

1

Ich muss eine eindeutige Zeichenfolge in einem Textdokument ersetzen (naja, eigentlich viele Zeichenfolgen, aber jede ist einzigartig), also habe ich es versuchtdoc.editAsText().replaceText(old$,new$); aber ohne glück ... hier ist der code, den ich benutze, er kopiert eine vorlage, die strings enthält, die in einer schleife ersetzt werden sollen.

  var doc = DocumentApp.openById(docId);;
  var lib=["$titre","$nom","$prénom","$rue","$code","$ville","$pays"]
    for(nn=1;nn<=selrange.length;++nn){
      for(ll=0;ll<lib.length;++ll){
        var old$ = (lib[ll]+nn).toString();
        var new$ = selrange[nn-1][ll].toString();
        var test = old$.replace(old$,new$);
Logger.log(new$+" = "+test);// this is indeed the new value
        doc.editAsText().replaceText(old$,new$);
         }
       }
Logger.log(doc.getText())
   }  

Der Logger zeigt den Inhalt des Dokuments unverändert an. Was vermisse ich ?

EDIT: Zur Information, nach Henriques Antwort ist hier der Arbeitscode:

    for(page=0;page<feuilles;++page){
      var today=Utilities.formatDate(new Date(),FUS1,"dd-MM-yyyy")+"__"+Utilities.formatDate(new Date(),FUS1,"HH:mm")
      var docname="IMPRESSION_page_"+Number(page+1)+"_"+today;
      var docId=DocsList.copy(doctemplate,docname).getId();
      var doc = DocumentApp.openById(docId);;
      var lib=["titre","nom","prénom","rue","code","ville","pays"]
        for(nn=1;nn<=16;++nn){
          for(ll=0;ll<lib.length;++ll){
            var olditem = ("#"+lib[ll]+nn+"#");
            var newitem = selrange[nn-1+page*16][ll];
              if(newitem==""){newitem="   "}
//Logger.log(olditem + "   *"+newitem+"*")
              doc.replaceText(olditem,newitem);
         }
       }
      Utilities.sleep(300); // wait a bit between each doc creation
    } 

Deine Antwort

1   die antwort
7

Das Problem ist, dass dieDocument.replaceText Funktion erzeugt einen regulären Ausdruck, auch wenn Sie einen String übergeben (das ist eigentlich indocs Beispiel :). Und dasString.replace Funktion in deinem Test nicht. Hier ist der Unterschied:

var doc = DocumentApp.openById(docID);
var old$ = '$sample';
var new$ = '$replaced';
var test = 'foo $sample bar';
Logger.log(test.replace(old$, new$)); //old is treated as literal
Logger.log(test.replace(new RegExp(old$), new$)); //this is what replaceText does
doc.replaceText(old$,new$);
Logger.log(doc.getText());

Und seit$ ist ein Sonderzeichen in einem regulären Ausdruck, das Ihre Ersetzung durcheinander bringt. Übrigens bedeutet dies, dass das Ende des Texts und der Versuch, einen beliebigen Text nach dem Ende abzugleichen, niemals funktioniert. Im Grunde genommen führt das Suchen und Ersetzen also zu nichts.

Um dieses Problem zu beheben, müssen Sie entweder den$ in all deinen Saiten, z. '\ $ sample' oder benutze dieses Zeichen nicht als Feldbegrenzer, es ist so eine schlechte Wahl! Verwenden Sie # oder ein anderes Zeichen, das in regulären Ausdrücken keine besondere Bedeutung hat.

Übrigens auch in deinemold$ undnew$ Variablen sieht es hässlich aus. Aber das bin wahrscheinlich nur ich :)

Ha! Nicht einmal das Syntax-Highlight von Stackoverflow mochte das $ nach der neuen Variablen! Es geht also nicht nur um mich: D Henrique G. Abreu
Henrique, ich wünschte ich wüsste nur ein Zehntel von dem was du weißt und mein Leben wäre so einfacher !! Wie auch immer, dank Ihrer Hilfe habe ich es geschafft, alles gut zum Laufen zu bringen. Prost, Serge Serge insas
Danke Serge, aber du weißt sicherlich noch viel mehr. Ich habe wahrscheinlich mehr Freizeit, um damit zu spielen. Bitte überprüfen Sie meine Antwort als "akzeptiert". Prost, Henrique Henrique G. Abreu

Verwandte Fragen