我拥有的物品: 列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, ""
并且需要使用嵌套循环,尽管需要手动工作来添加模式。
答案 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);
}