Google apps script 如何根据两个要求从产品列表中筛选出产品?
我正在尝试创建一个脚本,从超过10万个产品的列表中筛选出产品。要求是过滤掉不可用的产品,以及我不希望包含的类别中的产品。 我有两张表,一张是产品清单,另一张是类别清单,其中有正确/错误的陈述,它们应该包括在内。 到目前为止,我的代码如下所示:Google apps script 如何根据两个要求从产品列表中筛选出产品?,google-apps-script,google-apps,Google Apps Script,Google Apps,我正在尝试创建一个脚本,从超过10万个产品的列表中筛选出产品。要求是过滤掉不可用的产品,以及我不希望包含的类别中的产品。 我有两张表,一张是产品清单,另一张是类别清单,其中有正确/错误的陈述,它们应该包括在内。 到目前为止,我的代码如下所示: function deleteUnavailable() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var rss = ss.getSheetByName("Kategorier")
function deleteUnavailable() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var rss = ss.getSheetByName("Kategorier");
var rRows = rss.getDataRange();
var rNumRows = rRows.getNumRows();
var rValues = rRows.getValues();
var ass = ss.getSheets()[0];
var aRows = ass.getDataRange();
var aNumRows = aRows.getNumRows();
var aValues = aRows.getValues();
var resultArray = [];
for (var i = 1; i <= aNumRows -1; i++) {
var keep = true;
for (var j = 1; j <= rNumRows -1; j++) {
if (aValues[i][3] == rValues[j][0]) {
if (rValues[j][2] && aValues[i][9] == "JA") {break ;}
else keep = false ; break ;
}
}
if (keep) {
resultArray.push(aValues[i]);
}
}
ass.clear();
ass.getRange(2, 1, resultArray.length, resultArray[0].length).setValues(resultArray);
}
奇怪的是,在我的测试表中使用这段代码但有不同的位置,但在这段代码中没有。
有谁能告诉我,为什么这段代码让一些产品保持不变,而它们的条件在我的IF语句中应该为FALSE?所以我的代码工作得很好。只是它试图处理的信息有一些不一致之处,这导致代码认为一切都很好P
如果您想减少索引要求,可以使用一些数组类方法使逻辑更加清晰:
var-rValues=rRows.getValues();
var aValues=aRows.getValues();
//创建一个pojo散列信息,我们应该避免使用右值
//如果C(2)是真的,我们关心的是匹配A(0)列中的值。
const shouldKeep=rValues.slice(1)//跳过标题行
.reduce(函数(散列,行){
如果(第[2]行){
//列C是真实的,因此存储列A中的值
哈希[行[0]]=true;
}
返回散列;
}, {});
//检查所有数据行,查看比较列D是否有
//值,如果是,则另一列J具有值“JA”。
const rowstokep=aValues.slice(1)
.过滤器(功能(行){
返回(
//第十列的值必须为“JA”。
第[9]行==“JA”
&&
//第四列的值必须在哈希中
shouldKeep.hasOwnProperty(第[3]行)
);
});
//用“Rowstokep”做点什么`
上述方法还删除了嵌套的for循环,随着rValues和aValues表的大小增加,这将大大提高脚本性能,因为您只需循环rValues一次,就可以构造哈希。Javascript数组是以0为基数的,但从索引1开始。另外,
else keep=false;中断代码>被解析为else{keep=false;}break
,这意味着只要(aValues[i][3]==rValues[j][0])
为真,就停止对rValues
的循环,并移动到下一个aValues
元素。我从1开始索引,以避免代码删除标题行。我在这一点上打破循环,只要它找到一行为真,那么没有其他行会给出这个结论。
for (var i = 1; i <= aNumRows -1; i++) {
var keep = true;
for (var j = 1; j <= rNumRows -1; j++) {
if (aValues[i][3] == rValues[j][0]) {
if (rValues[j][2] && aValues[i][9] == "JA") {break ;}
else keep = false ; break ;
}
}
if (keep) {
resultArray.push(aValues[i]);
}
}
ass.clear();
ass.getRange(2, 1, resultArray.length, resultArray[0].length).setValues(resultArray);