Pytanie w sprawie google-apps-script – Jak korzystać z metody replaceText (searchPattern, replacement) w dokumentach Usługa / tekst Klasa

1

Muszę zastąpić unikalny ciąg w dokumencie tekstowym (a właściwie wiele ciągów, ale każdy z nich jest unikalny), więc spróbowałemdoc.editAsText().replaceText(old$,new$); ale bez powodzenia ... oto kod, którego używam, kopiuje szablon zawierający ciągi, które powinny zostać zastąpione w pętli.

  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())
   }  

Logger pokazuje zawartość dokumentu bez zmian. Czego mi brakuje ?

EDYCJA: Aby uzyskać informacje, po odpowiedzi Henrique tutaj znajduje się działający kod:

    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
    } 

Twoja odpowiedź

1   odpowiedź
7

Problem polega na tym, żeDocument.replaceText funkcja utworzy wyrażenie regularne, nawet jeśli przekażesz mu ciąg znaków (w rzeczywistości jest todocs przykład :). IString.replace funkcja w teście nie będzie. Oto różnica:

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());

I od tego czasu$ jest znakiem specjalnym w wyrażeniu regularnym, to psuje twoje zastąpienie. Nawiasem mówiąc, oznacza to koniec tekstu, a próba dopasowania dowolnego tekstu po zakończeniu nigdy nie zadziała, więc w zasadzie twoje wyszukiwanie i zastępowanie nic nie robi.

Aby to naprawić, musisz albo uciec$ we wszystkich twoich strunach, np. „próbka” lub nie używaj tego znaku jako ogranicznika pola, to taki zły wybór! Użyj # lub dowolnego innego znaku, który nie ma specjalnego znaczenia w wyrażeniach regularnych.

Przy okazji, nawet w twoimold$ inew$ zmienne wyglądają brzydko. Ale to chyba tylko ja :)

Henrique, chciałbym wiedzieć tylko jedną dziesiątą tego, co wiesz, a moje życie byłoby tak proste !! W każdym razie dzięki twojej pomocy udało mi się sprawić, żeby wszystko działało dobrze. Pozdrawiam, Serge Serge insas
Dzięki Serge, ale na pewno wiesz o wiele więcej. Prawdopodobnie mam po prostu więcej wolnego czasu na zabawę. Przy okazji, sprawdź moją odpowiedź jako „zaakceptowaną”. Pozdrawiam, Henrique Henrique G. Abreu
ha! nawet podświetlanie składni Stackoverflow nie spodobało się $ po nowej zmiennej! Więc to nie tylko ja: D Henrique G. Abreu

Powiązane pytania