Pergunta sobre google-apps-script – Como usar o método replaceText (searchPattern, replacement) nos documentos Service / text Class

1

Eu preciso substituir uma seqüência única em um documento de texto (bem, na verdade, um monte de seqüências de caracteres, mas cada um é único), então eu tenteidoc.editAsText().replaceText(old$,new$); mas sem sorte ... aqui está o código que eu uso, ele copia um template que contém strings que devem ser substituídas em um loop.

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

o Logger mostra o conteúdo do documento inalterado. O que estou perdendo ?

EDIT: Para obter informações, após a resposta de Henrique aqui é o código de trabalho:

    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
    } 

Sua resposta

1   a resposta
7

O problema é que oDocument.replaceText função irá criar um regex mesmo se você passar uma string para ele (que é realmente emdocs exemplo :). E aString.replace função em seu teste não vai. Aqui está a diferença:

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

E desde$ é um caractere especial em um regex, está bagunçando sua substituição. By the way, isso significa o fim do texto, e tentar corresponder a qualquer texto após o fim nunca funcionará, então basicamente sua pesquisa e substituição não faz nada, nunca.

Para consertar isso você tem que fugir do$ em todas as suas strings, por exemplo '\ $ sample', ou não use esse caractere como delimitador de campo, é uma escolha tão ruim! Use # ou qualquer outro caractere que não tenha um significado especial em expressões regulares.

By the way, mesmo em seuold$ enew$ variáveis ​​parece feio. Mas isso é provavelmente só eu :)

ha! nem mesmo o destaque da sintaxe do Stackoverflow gostou do $ após a nova variável! Então, não sou só eu: D Henrique G. Abreu
Henrique, gostaria de saber apenas um décimo do que você sabe e minha vida seria tão simples! De qualquer forma, graças à sua ajuda, consegui que tudo funcionasse bem. Felicidades, Serge Serge insas
Obrigado Serge, mas você certamente sabe muito mais do que isso. Eu provavelmente só tenho mais tempo livre para brincar com isso. By the way, por favor, verifique minha resposta como "aceito". Felicidades, Henrique Henrique G. Abreu

Perguntas relacionadas