Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 如何根据两个要求从产品列表中筛选出产品?_Google Apps Script_Google Apps - Fatal编程技术网

Google apps script 如何根据两个要求从产品列表中筛选出产品?

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")

我正在尝试创建一个脚本,从超过10万个产品的列表中筛选出产品。要求是过滤掉不可用的产品,以及我不希望包含的类别中的产品。 我有两张表,一张是产品清单,另一张是类别清单,其中有正确/错误的陈述,它们应该包括在内。 到目前为止,我的代码如下所示:

  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);