【问题标题】:How to filter array for only exact match in Google Apps Script/Javascript如何过滤数组以仅在 Google Apps 脚本/Javascript 中完全匹配
【发布时间】:2021-02-06 20:24:50
【问题描述】:

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

在一张纸上,我有一个信息表,其中 A 列中的项目名称,B 列中的“成分”和 C 列中的“数量”。A 列包含名为“测试”和“测试 2”的项目。当我过滤对于测试 2,我得到了测试和测试 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);

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

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

【问题讨论】:

    标签: javascript google-apps-script google-sheets


    【解决方案1】:

    解释:

    你们很亲密!

    问题与这一行有关:

    itemList = itemList.join();
    

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

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

    Test 1,Test 2
    

    因此itemList.indexOf("Test") 将返回0,这意味着您的过滤器函数将评估为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);
    }
    

    在这个解决方案中,我使用了arrow functionincludes

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-02
      • 2020-09-02
      • 2017-08-06
      • 2012-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多