Google apps script 如何在documents Service/text类中使用方法replaceText(searchPattern,replacement)

Google apps script 如何在documents Service/text类中使用方法replaceText(searchPattern,replacement),google-apps-script,Google Apps Script,我需要替换文本文档中唯一的字符串(实际上有很多字符串,但每个字符串都是唯一的),所以我尝试了doc.editAsText().replaceText(旧$,新$)但是没有运气。。。 这是我使用的代码,它复制了一个模板,其中包含循环中应该替换的字符串 var doc = DocumentApp.openById(docId);; var lib=["$titre","$nom","$prénom","$rue","$code","$ville","$pays"] for(nn=1;

我需要替换文本文档中唯一的字符串(实际上有很多字符串,但每个字符串都是唯一的),所以我尝试了
doc.editAsText().replaceText(旧$,新$)但是没有运气。。。
这是我使用的代码,它复制了一个模板,其中包含循环中应该替换的字符串

  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())
   }  
var doc=DocumentApp.openById(docId);;
var lib=[“$titre”、“$nom”、“$prénom”、“$rue”、“$code”、“$ville”、“$pays”]

对于(nn=1;nn而言,问题在于
Document.replaceText
函数将创建一个正则表达式,即使您向它传递一个字符串(实际上是在示例中:)。而测试中的
string.replace
函数将不会。区别如下:

var doc=DocumentApp.openById(docID);
var old$=“$sample”;
var new$='$replacement';
var测试='foo$样本条';
Logger.log(test.replace(old$,new$);//old被视为文字
Logger.log(test.replace(new RegExp(old$),new$);//这就是replaceText所做的
文件替换文本(旧$,新$);
Logger.log(doc.getText());
由于
$
是正则表达式中的一个特殊字符,它会弄乱你的替换。顺便说一句,它意味着文本的结尾,在结尾后尝试匹配任何文本都不会起作用,因此基本上你的搜索和替换不会起任何作用

要解决这个问题,您必须对所有字符串中的
$
进行转义,例如“\$sample”,或者不要将此字符用作字段分隔符,这是一个非常糟糕的选择!使用#或任何其他在正则表达式中没有特殊意义的字符


顺便说一下,即使在
旧的$
新的$
变量中,它看起来也很难看。但这可能只是我:)

问题是
文档.replaceText
函数将创建一个正则表达式,即使您向它传递一个字符串(实际上在示例中:)。测试中的
String.replace
函数将不起作用。区别如下:

var doc=DocumentApp.openById(docID);
var old$=“$sample”;
var new$='$replacement';
var测试='foo$样本条';
Logger.log(test.replace(旧$,新$)//旧的被视为文字
Logger.log(test.replace(新RegExp(旧$),新$)//这就是replaceText所做的
文件替换文本(旧$,新$);
Logger.log(doc.getText());
由于
$
是正则表达式中的一个特殊字符,它会弄乱您的替换。顺便说一句,这意味着文本的结尾,在结尾后尝试匹配任何文本都不会起作用,所以基本上你的搜索和替换不会起任何作用

要解决此问题,您必须在所有字符串中转义
$
,例如“\$sample”,或者不要将此字符用作字段分隔符,这是一个非常糟糕的选择!使用#,或任何其他在正则表达式中没有特殊含义的字符


顺便说一下,即使在
旧的$
新的$
变量中,它看起来也很难看。但那可能只是我:)

ha!甚至Stackoverflow的语法高亮也不喜欢新变量后面的$!所以,不仅仅是我:德恩里克,我希望我只知道你所知道的十分之一,我的生活会更简单!!不管怎样,多亏了你的帮助,我使所有的工作都很顺利。干杯,谢尔盖谢谢谢尔盖,但你肯定知道的远不止这些。我可能只是有更多的空闲时间玩这个。顺便说一下,请检查我的回答是否为“已接受”。干杯,亨利克哈!甚至Stackoverflow的语法高亮也不喜欢新变量后面的$!所以,不仅仅是我:德恩里克,我希望我只知道你所知道的十分之一,我的生活会更简单!!不管怎样,多亏了你的帮助,我使所有的工作都很顺利。干杯,谢尔盖谢谢谢尔盖,但你肯定知道的远不止这些。我可能只是有更多的空闲时间玩这个。顺便说一下,请检查我的回答是否为“已接受”。干杯,亨里克
    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
    }