有没有办法在 google 脚本中将 arrayformula 与 match/index 一起使用?或者至少让它自动填充整个列?脚本是一种选择

Is there a way to use arrayformula with match/index in google script? Or at least get it to autofill the entire column? Scripts are an option

我有以下公式:=ArrayFormula(INDEX(Items!F2:F,MATCH(C2,Items!E2:E,0))) 我想扩展它,使整个 C 列运行相同的值公式。请帮忙。如果需要脚本来实现此目的,我也想探索该选项。

使用:

=ARRAYFORMULA(IFNA(VLOOKUP(C2:C, Items!E2:F, 2, 0)))

使用 Apps 脚本!

Sheet 函数(公式)效果很好(尤其是如果您是像 player0 这样的高手),但我发现在 Apps 脚本中处理比简单的 INDEX MATCH 复杂得多的事情要容易得多。如果你愿意学一些JavaScript,强烈推荐学一些

自定义函数

您可以在 Apps 脚本中编写自定义 sheet 函数,您可以使用传统的 =FUNCTION() 从单元格调用这些函数。

它的工作方式是您在 Apps 脚本中编写一个函数,return是一个二维数组,对应于它需要填充的区域。

例如,如果想要一个用 1 填充 2 x 2 块的函数,您需要将函数设为 return:

[[1,1],[1,1]]

或者你可以这样写:

[
[1, 1],
[1, 1]
]

实施索引匹配

有很多方法可以实现它,这里是一个例子。

示例传播sheet 有 2 个选项卡,“分类帐”和“项目”。

后面的函数的目标是从“项目”选项卡中获取项目的成本。

function ledgerIndexMatch(){
  // Initializing the location of data
  let ss = SpreadsheetApp.getActive();
  let ledger = ss.getSheetByName("Ledger");
  let source = ss.getSheetByName("Items");
  let ledgerRange = ledger.getDataRange();
  let sourceRange = source.getDataRange();

  // Getting the values into a 2D array
  let ledgerValues = ledgerRange.getValues();
  let sourceValues = sourceRange.getValues();

  // Discarding the first row (headers)
  ledgerValues.shift();
  sourceValues.shift();

  // Initializing the output array
  let output = [];

  // This is where the INDEX MATCH happens

  // For each row in ledger
  ledgerValues.forEach(ledgerRow => {
    // Get the second column (index 1)
    let item = ledgerRow[1];

    // Initialize the column
    let value = [];

    // For each row in the source
    sourceValues.some(sourceRow => {
      // Check if the item is there
      if (item == sourceRow[0]) {
        // if so, add to value
        value.push(sourceRow[1]);
        // stop looking for values
        return true
      // if not matched, keep looking
      } else return false
    })

    // Add the found value (or blank if not found)
    // to the output array.
    output.push(value);
  })

  return output;
}

可以这样使用:

Apps 脚本的优点在于您可以根据自己的喜好对其进行自定义。在此示例中,该函数会自动检测各个表格的高度,因此您无需 fiddle 范围。

您可能希望使用参数扩展此函数,使其更加灵活。或者,如果您没有太多版本,则可以针对不同的操作只使用它的几个版本。或者重构它……由您决定。

参考资料