如何将命名范围加载到数组中?

How to load Named Ranges into array?

我在我的 sheet 中定义了几个命名范围,遵循命名模式 fieldName1、fieldName2、fieldName3 等。它们位于我的 sheet 中的不同位置。

我正在尝试将这些字段名加载到一个数组中,但是我遇到了一个问题,因为 getRange("fieldName1").getValue() 期待 fieldName 的“String” 而不是 getRange(fieldName[c]).getValue() 代码。

这是我目前的情况:

  const noFields = wsS.getRange("noFields").getValue()
  var fieldName = []
    for (var c = 1; c <= noFields; ++c) {
    fieldName[c] = wsS.getRange(fieldName[c]).getValue()
  }

noFields 是我必须加载多少个 fieldNameX 命名范围的变量,因为我还没有想到更好的方法来加载它们。

请帮忙,谢谢。

将所有命名范围放入一个数组

SpreadsheetApp.getActive().getNamedRanges();

Class namedRanges

function namedRangesInAnArray() {
  const ss = SpreadsheetApp.getActive();
  const names = ['r1','r2'.....];//array of names to get
  return SpreadsheetApp.getActive().getNamedRanges().filter(r => ~names.indexOf(r.getName()));
}

所以您想要所有以“fieldName”开头的命名范围,并希望将它们的所有值作为数组获取。

您可以使用 .getActive() 从电子表格中获取所有命名范围。但是,它们不会按预期排序。

如果您只是想要一个包含命名范围内所有值的数组,请执行:

var ss = SpreadsheetApp.getActive()
var values = ss.getNamedRanges()
    .map(namedRange => namedRange.getRange().getValue())

如果您只想要那些范围内遵循命名模式的值,请执行:

const PREFIX = "fieldName" // case sensitive
var values = ss.getNamedRanges()
    .filter(namedRange => namedRange.getName().startsWith(PREFIX))
    .map(namedRange => namedRange.getRange().getValue())

您可能还想按“fieldName”后的数字对命名范围进行排序,以防它们以不同的顺序输入,对吧?但这让事情变得有点复杂,因为名称是字符串。

对数组进行排序的一种方法是使用范围名称构造一个关联数组:

const PREFIX = "fieldName" // case sensitive
var ss = SpreadsheetApp.getActive()
var namedRanges = ss.getNamedRanges()
    .filter(namedRange => namedRange.getName().startsWith(PREFIX))
var associativeArray = []
for (var namedRange of namedRanges) {
  associativeArray[namedRange.getName().substring(PREFIX.length)] =
      namedRange.getRange().getValue()
}
var values = associativeArray.flat()

或使用自定义比较器:

const PREFIX = "fieldName" // case sensitive
var ss = SpreadsheetApp.getActive()
var values = ss.getNamedRanges()
    .filter(namedRange => namedRange.getName().startsWith(PREFIX))
    .map(namedRange => [
        Number(namedRange.getName().substring(PREFIX.length)),
        namedRange.getRange().getValue() ])
    .sort((itemA,itemB) => itemA[0] - itemB[0])
    .map(item => item[1])

无论如何,您最终都会得到一个可以使用的值数组。