【问题标题】:How to filter an array using the filtered index of another array?如何使用另一个数组的过滤索引过滤数组?
【发布时间】:2019-07-19 20:15:27
【问题描述】:

我当前的代码将值、注释和背景颜色的相同数据范围的值抓取到 3 个单独的数组中。然后它通过嵌套数组中的第一项过滤 Values 数组,仅返回与定义的statArray 数组项匹配的项。现在我希望其他两个数组过滤器(Notes,Background)通过过滤后的 Value 数组中返回的项目的索引进行过滤。这样,当我设置 Backgrounds 和 Notes 数组时,它们会正确重叠到值上。

function moveAllNew() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var activeSheet = SpreadsheetApp.getActiveSheet();
  var activeSheetName = activeSheet.getName();
  var lastRow = activeSheet.getLastRow();
  var lastColumn = activeSheet.getLastColumn();
  var statArray = ["Captures Sent ????","QA In Progress ????","Bagging in Progress 01 ????","Bagging in Progress 02 ????","Bag Sent ????","Bag Rejected ❌","Bag Accepted ✅","Captured ????",""];
  var rowHeaderCount = 3;
  var rowStart = 4;
  var columnFormulaB = 2;
  var columnFormulaS = 19;
  var columnFormulaAC = 29;
// gets the range of the current sheet
  var activeRange = activeSheet.getRange(rowStart,1,lastColumn-rowHeaderCount,lastColumn);
  var activeRangeFormulaB = activeSheet.getRange(rowStart,columnFormulaB,lastRow-rowHeaderCount);
  var activeRangeFormulaS = activeSheet.getRange(rowStart,columnFormulaS,lastRow-rowHeaderCount);
  var activeRangeFormulaAC = activeSheet.getRange(rowStart,columnFormulaAC,lastRow-rowHeaderCount);
// creates array of the active sheet (values, notes, backgrounds, and formula columns (B, S, AC))
  var activeRangeValues = activeRange.getValues();
  var activeRangeNotes = activeRange.getNotes();
  var activeRangeBackgrounds = activeRange.getBackgrounds();
  var activeRangeFormulaB = activeRangeFormulaB.getFormulasR1C1();
  var activeRangeFormulaS = activeRangeFormulaS.getFormulasR1C1();
  var activeRangeFormulaAC = activeRangeFormulaAC.getFormulasR1C1();
// filtered QA arrays
  var qaSheet = ss.getSheetByName("QA ????");
  var qaRangeValues = activeRangeValues.filter(function(item){return item[0] === statArray[0] || item[0] === statArray[1];});
  var qaRangeNotes = activeRangeNotes.filter(function(item){return item[0] === statArray[0] || item[0] === statArray[1];});
  var qaRangeBackgrounds = activeRangeBackgrounds.filter(function(item){return item[0] === statArray[0] || item[0] === statArray[1];});
  Logger.log(qaRangeValues);
  Logger.log(qaRangeNotes);
  Logger.log(qaRangeBackgrounds);

目前qaRangeValuesqaRangeNotes 数组将返回为空,因为statArray 项既不是颜色也不是音符值。

【问题讨论】:

    标签: javascript arrays google-apps-script filter


    【解决方案1】:

    在确定activeRange 时,您可能打算使用lastRow 而不是lastColumn

    无论如何,您需要执行一些操作以允许您访问当前索引,并且在您拥有索引的同时,还可以对其他大小相等的数组进行操作。

    一个例子:

    var qaData = {values: [], notes: [], bgs: [] };
    activeRangeValues.forEach(function (row, idx) {
      if (row[i] === statArray[0] || row[i] === statArray[1]) {
        qaData.values.push(row);
        qaData.notes.push(activeRangeNotes[idx]);
        ...
    });
    // Use the qaData object
    

    【讨论】:

    • 感谢您用 lastRow 和 lastColumn 发现我的错字。这个例子很有帮助。我还在学习基础知识,你让我看到了对象字面量语法的用处。
    猜你喜欢
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 2015-03-03
    • 1970-01-01
    • 2018-11-12
    • 1970-01-01
    相关资源
    最近更新 更多