在此spreadsheet中,包含工作表RemoveRecords
和KeywordsList
我想通过应用脚本在KeywordsList
列中搜索来删除ArticleLink
工作表中没有的记录。
我在想一些类似的事情作为起点(这是行不通的):
var ss = SpreadsheetApp.getActiveSpreadsheet();
var rsheet = ss.getSheetByName("RemoveRecords");
var ksheet = ss.getSheetByName("KeywordsList");
var records = rsheet.getDataRange().getValues();
var keywords = ksheet.getDataRange().getValues();
for( var i=records.length - 1; i>=0; i--){
for( var j=0; j<keywords.length; j++){
if(records[i] && (records[i][1].DoesntContain(keywords[j]))){
records.splice(i, 1);
}
}
}
如何从另一个数组中删除不包含字符串的数组?
更新 我认为这可能是一种方法,但看起来它正在寻找完全匹配的内容:
var filtered = ['ac', 'ab', 'cd', 'g'].filter(
function(e) {
return this.indexOf(e) >= 0;
},
['b','a']
);
console.log(filtered);
答案 0 :(得分:4)
关于使用https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf中的filter
和indexOf
的问题中包含的方法
indexOf()
使用strict equality(与searchElement
或三等值运算符相同的方法)将===
与数组的元素进行比较。
您可以使用RegEx.prototype.test。示例:
此示例使用Array.prototype.filter,Array.prototype.some和RegEx.prototype.test。请注意,它不会在循环上调用Spreadsheet Service,因此它应比其他在循环上调用Spreadsheet Service的解决方案更快地返回过滤后的数组。
function example(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var rsheet = ss.getSheetByName("RemoveRecords");
var ksheet = ss.getSheetByName("KeywordsList");
var records = rsheet.getDataRange().getValues();
var keywords = ksheet.getDataRange().getValues();
var filtered = containsKeyword(records, keywords);
Logger.log(filtered);
}
function containsKeyword(records, keywords){
return records.filter(function(row){
return keywords.some(function(keyword){
return new RegExp(keyword[0].replace('.','\.')).test(row[1])
});
});
}
注意:以上内容要求对关键字列表或正则表达式稍加改动,以防止包含部分匹配项,即其中一个关键字为al.com
,它与https://www.providencejournal.com/opinion/20190810/my-turn-victor-davis-hanson-another-2004-for-democrats
匹配
要删除记录,可以清除工作表并发送containsKeyword
的结果,而不是Logger.log。这将比从类表中调用deleteRow(pos)
更快。
记录在OP共享的电子表格的副本上运行上述示例的结果。
[19-08-11 17:03:14:932 CDT] [[我的回合:维克多·戴维斯·汉森(Victor Davis Hanson):民主党的另一个2004年?,https://www.providencejournal.com/opinion/20190810/my-turn-victor-davis-hanson-another-2004-for-democrats,格林尼治标准时间05年8月10日23:22:21 :00 2019,2020年民主党即将成形。...许多民主党竞争者支持所有人的医疗保险,奴隶制的赔偿...,[MedicareForAll],[拜登,桑德斯都在特朗普头上抨击特朗普-正面交锋,新民意调查发现,https://www.newsweek.com/biden-sanders-poll-trump-2020-election-1453658,2019年8月10日星期六23:00:00 GMT-05:00,诸如堕胎,LGBTQ权利和移民待遇之类的问题将一些本来保守的天主教徒推向了民主党帐篷。 https://www.foxnews.com/health/san-francisco-sees-dramatic-rise-in-fentanyl-related-deaths,{{3}},Biden and ...,LgbtqRights],[旧金山,去年与芬太尼相关的死亡人数激增150%,2019年8月10日23:00:00 GMT-05:00 ,该药造成6例死亡,该药在2016年导致22人死亡。...王牌毒品CZAR痛风针对阿片类药物危机的进展...,阿片类药物危机]]
答案 1 :(得分:1)
使用TextFinder循环保存记录
function keepRecords() {
var ss=SpreadsheetApp.getActive();
var rsh=ss.getSheetByName('RemoveRecords');
var rrg=rsh.getRange(2,1,rsh.getLastRow()-1,rsh.getLastColumn());
var lsh=ss.getSheetByName('KeywordsList');
var lrg=lsh.getRange(2,1,lsh.getLastRow()-1,1);
var lvA=lrg.getValues();
var kwlA=lvA.map(function(r){return r[0];});
var kA=[];
for(var i=0;i<kwlA.length;i++) {
if(kwlA[i]) {
var fA=rrg.createTextFinder(kwlA[i]).findAll();
if(fA.length) {
for(var j=0;j<fA.length;j++) {
kA.push(rsh.getRange(fA[j].getRow(),1,1,rsh.getLastColumn()).getValues()[0]);
//Logger.log('Pushed: Row[%s] because it contained kwlA[%s]=%s',fA[j].getRow(),i,kwlA[i]);
}
}
}
}
rrg.clearContent();
rsh.getRange(2,1,kA.length,kA[0].length).setValues(kA);
}