1

我整天都在尝试使用简单的查询(A1:B;“select A where A<>B”)或=filter()过滤包含文本值的2列,所以我尝试了脚本,但我也遗漏了一些东西。通过这种方式,我想在另一个数组中找到一个公共值时对填充的第一个数组进行切片。有人可以帮忙吗?这是代码:

function filterAll(){
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('temp1');
  var lastRow = sheet.getLastRow();

  var data1 = sheet.getRange(1, 4, lastRow).getValues();
  var tab1 = [];
  tab1.push(data1[0]);

  var data2 = sheet.getRange(1, 3, lastRow).getValues();
  var tab2 = [];
  tab2.push(data2[0]);

  // var subarray = []; // for subarray = tab2.slice(1,n)

  for (var n = 1; n < data1.length; n++) {
    if (tab1.join().indexOf(data1[n].join()) == -1) { 
      tab1.push(data1[n])  
    };
  }
  sheet.getRange(1, 2, tab1.length, tab1[0].length).setValues(tab1);

  for (var n = 1; n < data2.length; n++){
    if (tab2.join().indexOf(data2[n].join()) == -1) {
      for (var z = 1; z < data1.length; z++){ 
        if (data2[n] === data1[z]){ 
          break;  
        } else { 
          tab2.push(data2[n]); 
        } 
      }
    }
  }
  sheet.getRange(1, 1, tab2.length, tab2[0].length).setValues(tab2);
}
4

2 回答 2

1

如果你需要一个公式,你可以试试

=FILTER(
  A2:A,
  ISNA(MATCH(A2:A,B2:B4,0)),
  ROW(A2:A)<MIN(ARRAYFORMULA(IFERROR(MATCH(B2:B4,A:A,0))))
)

在此处输入图像描述

如果您需要脚本,可以使用主要方法

/**
*
* @param {Array.<Array.<object>>} arr data
* @param {Array.<object>} list the list for comparing
* @param {number} colIndex The column of the data for comparing
*/
function filterUntilAnyOfList_(arr, list, colIndex) {
  var res = [];
  arr.some(function(row) {    
    if(list.indexOf(row[colIndex]) === -1){
      res.push(row);
      return false;
    }
    return true;
  });
  return res.length ? res : '';
}

对于您项目中的功能,它将是

/**
* Action
*/
function userAction() {
  var data = SpreadsheetApp.getActive()
  .getRange('Filter!A2:A')
  .getValues();
  var list = SpreadsheetApp.getActive()
  .getRange('Filter!B2:B3')
  .getValues()
  .map(function(row) {
    return row[0];
  });
  Logger.log(filterUntilAnyOfList_(data, list, 0));
}

对于自定义公式,它也可以使用

/**
* @customformula
*/
function INLIST(data, list, col) {
  data = Array.isArray(data) ? data : [[data]];
  list = (Array.isArray(list) ? list : [[list]]).map(function(row) {
    return row[0];
  });
  return filterUntilAnyOfList_(data, list, col - 1);
}

在此处输入图像描述

我的样品

得到你的选择!

于 2020-02-04T04:09:48.793 回答
0

根据我对您的问题的理解,我建议:

  • 如果您只想保留在第二个数组中找到的值:

    =filter(A1:A,match(A1:A,B1:B,0))

  • 如果您只想保留在第二个数组中找不到的值:

    =filter(A1:A,isna(match(A1:A,B1:B,0)))

如果我误解了您的要求,如果您可以分享您的工作表示例并用具体示例描述给定输入的预期结果(已在对原始帖子的评论中要求),这可能会很有用。

于 2020-02-04T13:00:05.877 回答