Вопрос по – Как использовать метод replaceText (searchPattern, replace) в документах Service / text Class

1

Мне нужно заменить уникальную строку в текстовом документе (ну на самом деле много строк, но каждая уникальна), поэтому я попыталсяdoc.editAsText().replaceText(old$,new$); но без удачи ... Вот код, который я использую, он копирует шаблон, который содержит строки, которые должны быть заменены в цикле.

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

Регистратор показывает содержимое документа без изменений. Что мне не хватает?

РЕДАКТИРОВАТЬ: Для информации, после ответа Энрике вот рабочий код:

    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
    } 

Ваш Ответ

1   ответ
7

Проблема в том, чтоDocument.replaceText Функция создаст регулярное выражение, даже если вы передадите ему строку (которая на самом деле находится вдокументы пример :). ИString.replace функция в вашем тесте не будет. Вот разница:

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

И с тех пор$ является специальным символом в регулярном выражении, он портит вашу замену. Кстати, это означает конец текста, и попытка сопоставить любой текст после конца никогда не сработает, поэтому в основном поиск и замена ничего не делают, никогда.

Чтобы исправить это, вы должны избежать$ во всех ваших строках, например '\ $ sample' или не использовать этот символ в качестве разделителя полей, это такой плохой выбор! Используйте # или любой другой символ, который не имеет специального значения в регулярных выражениях.

Кстати, даже в вашемold$ а такжеnew$ Переменные это выглядит некрасиво. Но это, наверное, только я :)

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Serge insas

Похожие вопросы