比较两个数组,获取行号

时间:2018-10-19 21:59:06

标签: google-apps-script google-sheets

我正在尝试将我想分开的地方分解为较小的步骤和问题,以便我可以更好地理解。我将两列(每个列包含电子邮件地址,每个来自不同的工作表)转换为两个一维数组(answered here),现在我想比较它们是否匹配。我想知道“ emailsPaidArray”中的哪个值也位于“ emailsAllArray”中。更确切地说,我需要来自“ sheetAll”中匹配项的行号(作为一维数组,例如“ rowsYesMatch”)以及不匹配项的行号(也作为一维数组,例如“ rowsNotMatch”)。

必须通过脚本而不是公式来完成。我认为这将是某种循环,但这对我来说是全新的。我没有编码技能,非常感谢您的帮助和简单的答案。

function paymentStatus() {

  // Variables

  var id = "ID";
  var spreadSheet = SpreadsheetApp.openById(id);
  var sheetAll = spreadSheet.getSheetByName("sheetAll");
  var sheetPaid = spreadSheet.getSheetByName("sheetPaid");
  var sheetOutput = spreadSheet.getSheetByName("sheetOutput");
  var allLR = sheetAll.getLastRow();
  var paidLR = sheetPaid.getLastRow();

  // get tow 1D arrays

  var emailsAll = sheetAll.getRange(2, 3, allLR).getValues();
  var emailsPaid = sheetPaid.getRange(2, 1, paidLR).getValues();

  var emailsAllArray = emailsAll.map(function(e) {return e[0];} );
  // Logger.log(emailsAllArray);

  var emailsPaidArray = emailsPaid.map(function(e) {return e[0];} );
  // Logger.log(emailsPaidArray);

  // compare two arrays

  // get rows

看起来像这样: sheetAll sheetPaid

1 个答案:

答案 0 :(得分:2)

这个脚本怎么样?我注意到我误解了你的问题。所以我更新了。

var res = emailsAllArray.map(function(e, i) {return emailsPaidArray.some(function(f) {return e == f}) ? i + 2 : ""}).filter(Number);
// [2,3,5,6]

您也可以使用此脚本。

var res = emailsAllArray.reduce(function(ar, e, i) {
  if (emailsPaidArray.some(function(f) {return e == f})) ar.push(i + 2);
  return ar;
},[]);
// [2,3,5,6]

参考文献:

编辑:

如果要检索差异值的行号,请使用它。

var res = emailsAllArray.map(function(e, i) {return emailsPaidArray.some(function(f) {return e == f}) ? "" : i + 2}).filter(Number);
// [4,7]

var res = emailsAllArray.reduce(function(ar, e, i) {
  if (!emailsPaidArray.some(function(f) {return e == f})) ar.push(i + 2);
  return ar;
},[]);
// [4,7]