有没有更简单的方法来实现缺少的 "getNamedRange(....)" 方法?
Is there an easier way to implement the missing "getNamedRange(....)" method?
在 Google Apps 脚本中,电子表格和表格上有一个方法 getNamedRanges(),它 returns 一个命名范围列表。但是没有 getNamedRange("Name") 哪个 returns 一个单一的命名范围。
我觉得这很奇怪。
为了解决这个问题,我使用了这个复杂的过程:
function testing()
{
var ss = SpreadsheetApp.getActiveSpreadsheet();
var nameOfNamedRange = "NameOfMyNamedRange";
var namedRanges = ss.getNamedRanges();
/* ###### THIS IS WHAT I HAVE TO DO ######### */
for (i = 0; i<namedRanges.length; ++i)
{ var nRange = namedRanges[i];
if ( nRange.getName() == nameOfNamedRange )
{
/* Process nRange
doSomething(nRange);
*/
Logger.log(nRange.getName());
}
}
/* ############ THIS IS WHAT I'D LIKE TO DO (or something similar) ##########
var nRange = ss.getNamedRange("NameOfMyNamedRange") // ...Range not ...Ranges
*/
}
有更简单的方法吗?我忍不住想我错过了一些明显的东西。
比如用getRangeByName()
的方法怎么样?
修改后的脚本:
var ss = SpreadsheetApp.getActiveSpreadsheet();
var nameOfNamedRange = "NameOfMyNamedRange";
var nRange = ss.getRangeByName(nameOfNamedRange); // Added
参考:
编辑:
当你想检索单个命名范围时,下面的示例脚本怎么样,因为没有直接检索单个命名范围的方法?命名范围的名称在电子表格中只有一个。这个可以用。请将此视为几个答案之一。
var ss = SpreadsheetApp.getActiveSpreadsheet();
var nameOfNamedRange = "NameOfMyNamedRange";
var nRange = ss.getNamedRanges().filter(function(e) {return e.getName() === nameOfNamedRange})[0]; // Added
不幸的是,return 单个 NamedRange
实例没有函数。但是您可以清理当前的解决方法并将其包装到一个实用函数中,如下所示:
(function(scope){
const Utils = scope.Utils || (scope.Utils = {});
/**
* Filter function
*/
function filterByName(namedRange) {
return this.name === namedRange.getName();
}
/**
* Gets named range by name.
*
* @param {Spreadsheet|Sheet} context - An instance of Spreadsheet or Sheet.
* @param {String} name - The name of a NamedRange.
*
* @return {NamedRange} A NamedRange or null if not found.
*/
function getNamedRangeByName(context, name) {
if (!context || !context.getNamedRanges) {
throw new Error("Invalid context object; must implement getNamedRanges()");
}
var filtered = context.getNamedRanges().filter(filterByName.bind({name:name}));
return filtered.length ? filtered[0] : null;
}
Utils.getNamedRangeByName = getNamedRangeByName;
})(this);
只需将上面的脚本添加到你的项目中,然后按如下方式调用它:
var ss = SpreadsheetApp.getActive();
var nameOfNamedRange = "[NAME_OF_NAMED_RANGE]";
var namedRange = Utils.getNamedRangeByName(ss, nameOfNamedRange);
实际上有一种方法可以获取命名范围。假设我有一个名为 "Test".
的命名范围 A1:B3
var values = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1").getRange("Test").getValues();
将 return 中的值设为 A1:B3。或者更简单。
var values = SpreadsheetApp.getActiveSpreadsheet().getRange("Test").getValues();
如果 objective 是要更改名称试试这个。
var spread = SpreadsheetApp.getActiveSpreadsheet();
var range = spread.getRange("Test");
spread.setNamedRange("Other",range);
在 Google Apps 脚本中,电子表格和表格上有一个方法 getNamedRanges(),它 returns 一个命名范围列表。但是没有 getNamedRange("Name") 哪个 returns 一个单一的命名范围。
我觉得这很奇怪。
为了解决这个问题,我使用了这个复杂的过程:
function testing()
{
var ss = SpreadsheetApp.getActiveSpreadsheet();
var nameOfNamedRange = "NameOfMyNamedRange";
var namedRanges = ss.getNamedRanges();
/* ###### THIS IS WHAT I HAVE TO DO ######### */
for (i = 0; i<namedRanges.length; ++i)
{ var nRange = namedRanges[i];
if ( nRange.getName() == nameOfNamedRange )
{
/* Process nRange
doSomething(nRange);
*/
Logger.log(nRange.getName());
}
}
/* ############ THIS IS WHAT I'D LIKE TO DO (or something similar) ##########
var nRange = ss.getNamedRange("NameOfMyNamedRange") // ...Range not ...Ranges
*/
}
有更简单的方法吗?我忍不住想我错过了一些明显的东西。
比如用getRangeByName()
的方法怎么样?
修改后的脚本:
var ss = SpreadsheetApp.getActiveSpreadsheet();
var nameOfNamedRange = "NameOfMyNamedRange";
var nRange = ss.getRangeByName(nameOfNamedRange); // Added
参考:
编辑:
当你想检索单个命名范围时,下面的示例脚本怎么样,因为没有直接检索单个命名范围的方法?命名范围的名称在电子表格中只有一个。这个可以用。请将此视为几个答案之一。
var ss = SpreadsheetApp.getActiveSpreadsheet();
var nameOfNamedRange = "NameOfMyNamedRange";
var nRange = ss.getNamedRanges().filter(function(e) {return e.getName() === nameOfNamedRange})[0]; // Added
不幸的是,return 单个 NamedRange
实例没有函数。但是您可以清理当前的解决方法并将其包装到一个实用函数中,如下所示:
(function(scope){
const Utils = scope.Utils || (scope.Utils = {});
/**
* Filter function
*/
function filterByName(namedRange) {
return this.name === namedRange.getName();
}
/**
* Gets named range by name.
*
* @param {Spreadsheet|Sheet} context - An instance of Spreadsheet or Sheet.
* @param {String} name - The name of a NamedRange.
*
* @return {NamedRange} A NamedRange or null if not found.
*/
function getNamedRangeByName(context, name) {
if (!context || !context.getNamedRanges) {
throw new Error("Invalid context object; must implement getNamedRanges()");
}
var filtered = context.getNamedRanges().filter(filterByName.bind({name:name}));
return filtered.length ? filtered[0] : null;
}
Utils.getNamedRangeByName = getNamedRangeByName;
})(this);
只需将上面的脚本添加到你的项目中,然后按如下方式调用它:
var ss = SpreadsheetApp.getActive();
var nameOfNamedRange = "[NAME_OF_NAMED_RANGE]";
var namedRange = Utils.getNamedRangeByName(ss, nameOfNamedRange);
实际上有一种方法可以获取命名范围。假设我有一个名为 "Test".
的命名范围 A1:B3var values = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1").getRange("Test").getValues();
将 return 中的值设为 A1:B3。或者更简单。
var values = SpreadsheetApp.getActiveSpreadsheet().getRange("Test").getValues();
如果 objective 是要更改名称试试这个。
var spread = SpreadsheetApp.getActiveSpreadsheet();
var range = spread.getRange("Test");
spread.setNamedRange("Other",range);