Pregunta sobre google-apps-script – Cómo utilizar el método replaceText (searchPattern, replacement) en los documentos Service / text Class

1

Necesito reemplazar una cadena única en un documento de texto (bueno, en realidad muchas cadenas, pero cada una es única), así que probédoc.editAsText().replaceText(old$,new$); pero sin suerte ... aquí está el código que uso, copia una plantilla que contiene cadenas que deben reemplazarse en un bucle.

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

el registrador muestra el contenido del documento sin cambios. Qué me estoy perdiendo ?

EDIT: Para información, después de la respuesta de Henrique aquí está el código de trabajo:

    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
    } 

Tu respuesta

1   la respuesta
7

El problema es que laDocument.replaceText La función creará una expresión regular, incluso si le pasas una cadena (eso es en realidaddocs ejemplo :). Y elString.replace La función en tu prueba no lo hará. Aquí está la diferencia:

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

Y desde$ es un carácter especial en una expresión regular, es desordenar su reemplazo. Por cierto, significa el final del texto, y tratar de hacer coincidir cualquier texto después del final nunca funcionará, así que básicamente tu búsqueda y reemplazo no hace nada, nunca.

Para arreglar esto tienes que, o escapar de la$ en todas sus cadenas por ejemplo '\ $ muestra', o no use este carácter como delimitador de campo, ¡es una mala elección! Use #, o cualquier otro char que no tenga un significado especial en las expresiones regulares.

Por cierto, incluso en suold$ ynew$ Las variables se ve fea. Pero eso es probablemente solo yo :)

Henrique, ¡ojalá supiera solo una décima parte de lo que sabes y mi vida sería tan simple! De todos modos, gracias a tu ayuda logré que todo funcionara bien. Saludos, Serge Serge insas
Gracias Serge, pero seguramente sabes mucho más que eso. Probablemente tengo más tiempo libre para jugar con esto. Por cierto, por favor verifica mi respuesta como "aceptada". Saludos, Henrique Henrique G. Abreu
¡decir ah! ¡ni siquiera a la sintaxis de Stackoverflow le gustó el $ después de la nueva variable! Entonces, no soy solo yo: D Henrique G. Abreu

Preguntas relacionadas