【问题标题】:Find difference between two arrays (missing values) in Google Apps Script在 Google Apps 脚本中查找两个数组(缺失值)之间的差异
【发布时间】:2019-08-20 19:03:07
【问题描述】:

试图找到一种适用于 Google Apps 脚本的方法,以比较两个数组并找出第二个数组中缺失的值。

我尝试了几种方法,但找不到适用于 GAS 的方法。目前正在尝试使用 for() 循环和 indexOf():

var ss = SpreadsheetApp.getActiveSpreadsheet();  
var sheet = ss.setActiveSheet(ss.getSheetByName('test'));

function TEST(){
  var lastRow = sheet.getLastRow();
  var orders = sheet.getRange(2,1,lastRow,1).getValues(); //[a,b,c,d]
  var products = sheet.getRange(2, 2,lastRow,1).getValues();  //[a, b]
  var missing = [];
  for ( var i = 0 ; i < Object.keys(orders).length; i++){
    if(products.indexOf(orders[i])<0){
      missing.push(orders[i]);};
  };
  Logger.log(missing); //expect [c, d]
   }

源表有两列要比较,第三列应该存储新的“缺失”数组。

orders  products    missing
a       a           c
b       b           d
c       
d       

我尝试了其他几篇文章中的方法,但所有内容都使用了 Google Apps 脚本中不可用的功能。

【问题讨论】:

标签: javascript arrays google-apps-script


【解决方案1】:

您是否尝试过在orders 变量上使用.filter()?像这样的东西应该可以解决问题:

var orders = sheet.getRange(2,1,lastRow,1).getValues().map(firstOfArray)
var products = sheet.getRange(2, 2,lastRow,1).getValues().map(firstOfArray)
var missing = orders.filter(missing)

function firstOfArray(array) {
   return array[0]
}
function missing(order) {
    return products.indexOf(order) === -1
}

【讨论】:

  • GAS 中没有includes() 函数。我希望找到一种适用于纯 GAS 函数的方法。
  • 尝试使用 indexOf() 进行过滤,但所有值都返回 -1,因此返回整个列表而不仅仅是 [c, d]。
  • 啊, indexOf 返回 undefined 的原因可能是因为在您的范围上调用的 getValues() 方法返回一个两级数组([[a],[b],[c],[d ]])。如果你像@Cooper 所说的那样映射值,你应该有更多的运气。
【解决方案2】:

查找缺失的订单:

function findMissingOrders() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Sheet110');
  var orderA=sh.getRange(2,1,getColumnHeight(1)-1,1).getValues().map(function(r){return r[0];});
  var prodA=sh.getRange(2,2,getColumnHeight(2)-1,1).getValues().map(function(r){return r[0];});
  var missA=[];
  for(var i=0;i<orderA.length;i++) {
    var order=orderA[i];
    if(prodA.indexOf(orderA[i])==-1) {
      missA.push([orderA[i]]);
    }
  }
  if(missA.length>0) {
    sh.getRange(2,3,missA.length,1).setValues(missA);
  }
}

这里是 getColumnHeight() 函数:

function getColumnHeight(col,sh,ss){
  var ss=ss || SpreadsheetApp.getActive();
  var sh=sh || ss.getActiveSheet();
  var col=col || sh.getActiveCell().getColumn();
  var rg=sh.getRange(1,col,sh.getLastRow(),1);
  var vA=rg.getValues();
  while(vA[vA.length-1][0].length==0){
    vA.splice(vA.length-1,1);
  }
  return vA.length;
}

之前的电子表格:

电子表格之后:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    • 2018-01-07
    • 1970-01-01
    • 2019-01-20
    • 1970-01-01
    • 2019-09-04
    相关资源
    最近更新 更多