繁体   English   中英

如何过滤数组以仅在 Google Apps 脚本/Javascript 中完全匹配

[英]How to filter array for only exact match in Google Apps Script/Javascript

我正在尝试使用 Google Apps 脚本仅过滤完全匹配。 我见过类似的问题,但我似乎无法将它们应用于我的情况。

在一张纸上,我有一个信息表,其中 A 列中的项目名称,B 列中的“成分”和 C 列中的“数量”。 A 列包含名为 Test 和 Test 2 的项目。当我过滤 Test 2 时,我得到了 Test 和 Test 2 的结果。这是我正在使用的代码:

var costSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Cost');
var ingSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Recipe Ingredient');

// Create list of items to filter from the full list
var rows = costSheet.getLastRow();
var itemList = costSheet.getRange(2, 1, rows - 1).getValues();

// Convert itemList to array to be used in filter
itemList = itemList.join();

// Get full non-filtered data
var fullList = ingSheet.getRange('A2:C514').getValues();

// Apply filter criteria
function checkMatch(item) {
  return itemList.indexOf(item[0]) != -1;
}
filterList = fullList.filter(checkMatch);

// Clear target location, then place filtered data
costSheet.getRange('C2:E514').clearContent();
costSheet.getRange(2, 3, filterList.length, 3).setValues(filterList);

我从所有三列中获得多个项目的准确结果没有任何问题,我遇到的唯一问题是当我尝试过滤以完整列表中另一个项目的名称开头的项目时(例如过滤测试 2当我希望它只返回测试 2 时,返回测试和测试 2)。

我是使用 Google Apps Script/Javascript 的新手,因此是“业余”编码。

解释:

你很亲近!

该问题与此行有关:

itemList = itemList.join();

假设itemList = [["Test 2"],["Test 3"]]作为getValues()方法的结果。

如果您应用连接,则将上述数组转换为以下string

Test 1,Test 2

因此itemList.indexOf("Test")将返回0这意味着您的过滤器 function 将评估为true ,但您不希望这样,因为Test不是您的数组的一部分。 您错误地使用了stringsindexOf方法,而不是arraysindexOf方法。

话虽如此,您的目标是使用arraysindexOf方法。 为此, itemList需要是一个数组而不是字符串。

要将二维数组[["Test 2"],["Test 3"]]转换为一维数组[Test 1, Test 2]您可以使用flat

解决方案:

改变:

itemList = itemList.join();

至:

itemList = itemList.flat();

改进的解决方案:

加倍努力,您可以缩短代码并使其更现代JavaScript像这样:

function shorterFunction(){
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const costSheet = ss.getSheetByName('Cost');
  const ingSheet = ss.getSheetByName('Recipe Ingredient');
  const itemList = costSheet.getRange(2, 1, costSheet.getLastRow() - 1).getValues().flat();
  const fullList = ingSheet.getRange('A2:C514').getValues();
  const filterList = fullList.filter(r=>itemList.includes(r[0]))
  costSheet.getRange('C2:E514').clearContent();
  costSheet.getRange(2, 3, filterList.length, 3).setValues(filterList);
}

在此解决方案中,我使用了箭头 function包含.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM