如何将命名范围加载到数组中?
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();
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])
无论如何,您最终都会得到一个可以使用的值数组。
我在我的 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();
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])
无论如何,您最终都会得到一个可以使用的值数组。