google脚本在ID列中搜索匹配项,然后在搜索列中搜索不匹配项

时间:2019-01-09 19:54:29

标签: javascript arrays google-apps-script

在这里,我尝试匹配产品编号,然后搜索不匹配的功能。因此,在下面的示例中,我们在COL A-产品ID,COL B-功能,COL C-产品ID,COL D-功能中看到。我想将A-B列与C-D列进行比较。我能够匹配整个单元格,但我想获得更多的粒度并匹配单元格中的单词。因此,在下面的示例中,我想查看产品12345的结果,因为它缺少“中”功能。另外,我们会从54321获得结果,因为它缺少功能“好”。

COL A | COL B | COL C | COL D |
产品编号|功能|产品编号|功能
12345 |快中慢| 12345 |慢
12345 |快慢12345 |快速
12345 |快慢12345 |快速
54321 |努力又好12345 |辛苦
54321 |努力又好12345 |辛苦
12345 |快慢12345 |快速

电子表格示例:https://docs.google.com/spreadsheets/d/e/2PACX-1vRnVIHj8ekDOzYdFyv0PSGCynh91CPWiA5LxYV52McDH4nTsUp4faP7Iw6P44xG1HUavuwAT8wfXjaA/pubhtml?gid=0&single=true

到目前为止,我有以下具有2个函数的脚本,如果单元格的格式正确,但很多单元格却没有,它似乎会产生结果。我不需要2个功能,但这是我尝试实现的功能。

问题是:如何首先将A和C列完全匹配,然后,如果B列中有任何单词不在D列中,则将结果打印到COL E:F中

感谢任何帮助。

function checkProduct() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s=ss.getSheetByName("A Data - Formatted")
  var lr=s.getLastRow()
  var lookup = s.getRange(2,1,lr-1,5).getValues();
  var s1=ss.getSheetByName("B Data - Formatted") 
  var lr1=s1.getLastRow()
  var range = s1.getRange(2,1,lr1-1,5).getValues();
  var s3=ss.getSheetByName("Matches")
  s3.getRange("A2:F").clear();
  var lookupRange = [];
  for (var i = 0; i < lookup.length; i++) {
     for (var j = 0; j < range.length; j++) {
     var  test=lookup[i][0]
         if(lookup[i][0]==range[j][0]){
           lookupRange.push([range[j][0],range[j][1],lookup[i][0],lookup[i][1],]);
     }}}
   s3.getRange(2,1,lookupRange.length,4).setValues(lookupRange); 
}
                             
function checknoMatch() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s=ss.getSheetByName("Matches")
  var lr=s.getLastRow()
  var lookup = s.getRange(2,1,lr-1,2).getValues();
  var s1=ss.getSheetByName("Matches") 
  var lr1=s1.getLastRow()
  var range = s1.getRange(2,3,lr1-1,2).getValues();
  var s3=ss.getSheetByName("Differences")
   s3.getRange("A2:F").clear();
  var lookupRange = [];
  for (var i = 0; i < lookup.length; i++) {
     for (var j = 0; j < range.length; j++) {
     var  test=lookup[i][0]
         if(lookup[i][0] == range[j][0] && lookup[i][1] != range[j][1]){
           lookupRange.push([range[j][0],range[j][1],lookup[i][0],lookup[i][1],]);
     }}}
   s3.getRange(2,1,lookupRange.length,4).setValues(lookupRange); 
}

1 个答案:

答案 0 :(得分:1)

Matching and Non Matching

function getMatching(){
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();
  var rg=sh.getDataRange();
  var vA=rg.getValues();
  for(var i=1;i<vA.length;i++){
    if(vA[i][0]==vA[i][2]){
      vA[i][4]=vA[i][0];
      vA[i][6]=vA[i][3];
      vA[i][5]=getNonMatching({col2:vA[i][1],col4:vA[i][3]}); 
    }
  }
  sh.getRange(1,1,sh.getLastRow(),sh.getLastColumn()).setValues(vA);
}

function getNonMatching(sObj){
  if(sObj.col2 && sObj.col4){
    var vA2=sObj.col2.split(" ");
    var vA4=sObj.col4.split(" ");
    vA4.push('and');//You can push other insignificant word into vA4 to keep them out of the output string.
    var s='';
    var n=0;
    for(var i=0;i<vA2.length;i++){
      if(vA4.indexOf(vA2[i])==-1){
        if(n>0) {
          s+=' ';
        }
        s+=vA2[i];
        n++;
      }
    }
    return s;
  }else{
    return 'Error: Invalid Inputs';
  }
}

Spreadsheet Before Running:

enter image description here

Spreadsheet After Running:

enter image description here