【问题标题】:bulk find and replace with a condition case match and exact match google app script,doc,sheet批量查找并替换为条件大小写匹配和完全匹配的谷歌应用脚​​本、文档、表格
【发布时间】:2021-03-25 13:51:37
【问题描述】:

提前谢谢你。

我有一张数据如下。

Find Replace condition
Page number ten Page No. 10 match case
Page number 10 Page No. 10 match case
ms Ms exact match

我想用条件查找和替换文档中的文本。 下面的代码对我来说很好,但无论何时。 Williams 替换为 WilliaMs

function replMyText() {
  var ss = SpreadsheetApp.openById('1-WblrS95VqsM5eRFkWGIHrOm_wGIPL3QnPyxN_j5cOo');
  var sh = ss.getSheetByName('find and replace');
  var doc = DocumentApp.getActiveDocument();
  var rgtxt = doc.getBody();
  var rgrep = sh.getRange('A2:B103');
  var repA = rgrep.getValues().filter(r => r.every(c => c.toString()));
  repA.forEach(e => rgtxt.replaceText(...e));
}

【问题讨论】:

    标签: google-apps-script google-sheets spreadsheet google-docs google-docs-api


    【解决方案1】:

    我们需要捕获一组正则表达式来正确捕获所有情况,而不仅仅是空格之间的单词。 (e.g. ms. “ms” ms, ms! ms? ms! ‘ms’)

    但由于replaceText 不支持捕获组,而replace 支持,我们需要在replaceText 中使用replace 派生它。

    编辑:

    代码:

    function replMyText() {
      var ss = SpreadsheetApp.openById('1-WblrS95VqsM5eRFkWGIHrOm_wGIPL3QnPyxN_j5cOo');
      var sh = ss.getSheetByName('find and replace');
      var doc = DocumentApp.getActiveDocument();
      var rgtxt = doc.getBody();
      var rgrep = sh.getRange('A2:C103');
      var repA = rgrep.getValues().filter(r => r.every(c => c.toString()));
    
      // Search per paragraph so it won't produce exponential copies per paragraph
      var paragraphs = rgtxt.getParagraphs();
      for (var i = 0; i < paragraphs.length; i++) {
        repA.forEach(function(e){
          if(e[2] == "match case") {
            DocumentApp.getActiveDocument().getBody().replaceText(e[0], e[1]);
          }
          else if (e[2] == "exact match") {
            // Only replace the string in between non [a-zA-Z0-9_]
            // Capture string including 2 \W characters around it, then pad them around the replaced string
            var replace = "(\\W)" + e[0] + "(\\W)";
            var re = new RegExp(replace, "g");
            var text = paragraphs[i].getText();
            paragraphs[i].replaceText(".*", text.replace(re, "$1" + e[1] + "$2"));
    
            // Replace the ones starting in a paragraph if present
            replace = "^" + e[0] + "(\\W)";
            re = new RegExp(replace, "g");
            text = paragraphs[i].getText();
            paragraphs[i].replaceText(".*", text.replace(re, e[1] + "$1"));
          }
        });
      }
    }
    

    最新更新测试:

    最新更新输出:

    参考资料:

    【讨论】:

    • 检查@SachinPathare
    • 请立即检查更新的代码@SachinPathare。最近修改了我之前编辑的一些内容。如果需要,请参阅上面的编辑历史记录。
    • 感谢您修改代码。现在完全匹配不起作用。
    • 我最近修改了脚本。您可能已经测试过旧版本。你能再测试一次吗? @SachinPathare
    • 非常感谢您的帮助,非常感谢。
    猜你喜欢
    • 2022-12-11
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多