Google App 脚本:查找和替换特定列

Jam*_*d68 3 javascript arrays google-sheets google-apps-script

这是我正在使用的查找和替换脚本的问题和逻辑。

  • 在工作表中搜索to_replace字符串。
    • 如果找到,则替换to_replacereplace_with.
    • 如果找不到,则替换to_replaceto_replace// 这是不需要的,并且会导致问题(它替换所有公式,并用字符串替换)。

我的目标:

我希望脚本仅替换匹配的单元格to_replace,并忽略所有其他单元格。

我的菜鸟解决方案:

使用此处的脚本从数组中删除 C 列,从而排除论坛中的特定列。(仅在 B 列和 D 列中查找和替换)。

这是我在“我的当前脚本”中添加的修改后的代码...

const range = sheet.getRange('B2:D'+lastRow).getValues();
range.forEach(a => a.splice(1, 1)); //removes column C.
Run Code Online (Sandbox Code Playgroud)

但我收到错误:“TypeError: var data = range.getValues(); 不是函数”

问题

您能帮我解决我的菜鸟解决方案吗,或者教我更好的方法来解决这个问题?


我当前的脚本

function findAndReplace(){
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
  var lastRow = sheet.getLastRow()
  var lastColumn = sheet.getLastColumn()
  // var range = sheet.getRange(1, 1, lastRow, lastColumn) //REMOVED - Searches all columns.

  const range = sheet.getRange('B2:D'+lastRow).getValues(); //ADDED - Searches only B & D
  range.forEach(a => a.splice(1, 1)); //ADDED - Searches only B & D
     
  var to_replace = "TextToFind";
  var replace_with = ""; //Leave blank to delete Text, or enter text in quotes to add string.
  var data  = range.getValues();
 
    var oldValue="";
    var newValue="";
    var cellsChanged = 0;
 
    for (var r=0; r<data.length; r++) {
      for (var i=0; i<data[r].length; i++) {
        oldValue = data[r][i];
        newValue = data[r][i].toString().replace(to_replace, replace_with);
        if (oldValue!=newValue)
        {
          cellsChanged++;
          data[r][i] = newValue;
        }
      }
    }
    range.setValues(data);
}
Run Code Online (Sandbox Code Playgroud)

Tan*_*ike 5

teach me a better way to solve this problem您的情况来看,我认为使用 TextFinder 时,可能可以降低处理成本。当使用 TextFinder 来实现你的目标时,它会变成如下所示。

示例脚本:

function myFunction() {
  var to_replace = "TextToFind";
  var replace_with = ""; //Leave blank to delete Text, or enter text in quotes to add string.

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
  var lastRow = sheet.getLastRow();
  var ranges = ['B2:B' + lastRow, 'D2:D' + lastRow];
  sheet.getRangeList(ranges).getRanges().forEach(r => 
    r.createTextFinder(to_replace).matchEntireCell(true).replaceAllWith(replace_with)
  );
}
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 如果要替换部分单元格值,请修改r.createTextFinder(to_replace).matchEntireCell(true).replaceAllWith(replace_with)r.createTextFinder(to_replace).replaceAllWith(replace_with)

  • 作为额外的修改,如果你的脚本修改了,下面的修改怎么样?

      function findAndReplace() {
        var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
        var lastRow = sheet.getLastRow()
        var range = sheet.getRange('B2:D' + lastRow);
        var data = range.getValues();
        var to_replace = "TextToFind";
        var replace_with = ""; //Leave blank to delete Text, or enter text in quotes to add string.
        for (var r = 0; r < data.length; r++) {
          for (var i = 0; i < data[r].length; i++) {
            var value = data[r][i].toString();
            if (i != 1 && value.includes(to_replace)) {
              data[r][i] = data[r][i].replace(to_replace, replace_with);
            }
          }
        }
        range.setValues(data);
      }
    
    Run Code Online (Sandbox Code Playgroud)

参考: