如何使用谷歌脚本在电子表格中查找和替换字符串列表

时间:2014-02-11 22:50:38

标签: replace google-apps-script

我拥有的物品: 列A(未排序)

中的大字符串列表A.
name1 pattern1 pattern4
name5 pattern2
name4 pattern4
name2 pattern3 pattern1
name4 pattern4

我要从A列中的字符串中删除的不同字符串模式的大型列表B(包括标点符号和特殊字符)

pattern1
pattern2
pattern3

一旦我将B中的每个模式与A中的字符串进行比较,它应该输出:

name1 pattern4
name5
name4 pattern4
name2
name4 pattern4

现在我有两个困难。我有一个非常简单的测试代码,假设列表中只有1个模式,程序执行没有错误,但我的谷歌电子表格没有任何反应,我无法解释原因

function removeS(){
    var sheet = SpreadsheetApp.getActiveSheet();
    var range = sheet.getRange("A1:A");
    var data = range.getValues();
    for(i in data){
        data[i].toString().replace(pattern,"");
    }
}

另外,无论如何我可以完成我的任务而不进行嵌套循环? (一个循环遍历A列中的所有内容,另一个循环遍历模式列表)在处理大数据时似乎效率低下。在Excel宏中,你可以这样做:

With ActiveSheet.UsedRange
.Replace pattern1, ""
.Replace pattern2, ""

并且需要使用嵌套循环,尽管需要手动工作来添加模式。

1 个答案:

答案 0 :(得分:0)

这是一个选项。虽然我不确定比嵌套循环更有说服力的方法,但不将返回的电子表格值从2d转换为1d数组。

我为patterns列的最后一行设置了一个常量,假设它是两列中的一个(请参阅代码中的注释为理性)。

function cleanMe(){
    var sheet = SpreadsheetApp.getActiveSheet();
    var range = sheet.getRange("A1:A" + sheet.getLastRow());
    var data = range.getValues();

// get the array of patterns (all ranges returned as 2d array)
// because .getLastRow() or .getDataRange returns the last row in the spreadsheet with data
// not the last row of the range with data
// hardcoded the last row in column be so as not to 
// have to use conditions to check if values exist in range
    var patternLastRow = 3;
    var patterns = sheet.getRange("B1:B" + patternLastRow).getValues();

// 2d array to replace data in row A using range.setValues(newRange)
    var newRange = []; 

    for(var i = 0; i < data.length; i++){
    // use encodeURIComponent to contend with special charactes that would need escaping
     var newValue =  encodeURIComponent(data[i][0].toString());
      for(var p = 0; p < patterns.length; p++){
        var pattern = encodeURIComponent(patterns[p][0]);
        var index = newValue.indexOf(pattern);
        if(index >=0){
         newValue = newValue.replace(pattern,'');
         }
      }
      newRange.push([decodeURIComponent(newValue)]);
    }

    range.setValues(newRange);
}