在 google 个工作表中自动化命名范围函数
Automating named Range function in google sheets
上下文
所以我有一个 spreadsheet 有 11+ sheets,但稍后会添加更多。我想使用命名范围动态命名列。我创建了一个宏脚本并一直在使用它。唯一的问题是每个 sheet,我必须转到脚本并更改命名范围的名称:
function NamedRanges() {
var spreadsheet = SpreadsheetApp.getActive();
spreadsheet.setNamedRange('TrainlineDate', spreadsheet.getRange('A:A'));
spreadsheet.setNamedRange('TrainlinePrice', spreadsheet.getRange('B:B'));
spreadsheet.setNamedRange('TrainlineReturns', spreadsheet.getRange('C:C'));
spreadsheet.setNamedRange('TrainlineGrossReturns', spreadsheet.getRange('D:D'));
spreadsheet.setNamedRange('TrainlineGeometricReturns', spreadsheet.getRange('E:E'));
spreadsheet.setNamedRange('TrainlineRisk', spreadsheet.getRange('F:F'));
spreadsheet.setNamedRange('TrainlineNegativeReturns', spreadsheet.getRange('G:G'));
spreadsheet.setNamedRange('TrainlinePositiveReturns', spreadsheet.getRange('H:H'));
spreadsheet.setNamedRange('TrainlineTimeValueMoney', spreadsheet.getRange('I:I'));
};
例如,对于下一个选项卡,我必须将 Trainline 更改为 Softcat。
我尝试将列创建为数组,然后使用 for 循环根据单元格 B2
中的名称 + headers 中的名称创建命名范围(第 3 个每列的行)。我也将在未来添加新的专栏。但是,当我尝试在单元格 B2
中记录值时,它失败了。长话短说,我被困住了。这是我到目前为止想出的;
function NamedRange() {
const ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var col = ss.getLastColumn(); //Get all the columns in the sheet with data (there will be no gaps/spaces)
var stockName = ss.getRange("B1"); // name in cell B1 (column 2, row 1)
var headerCell = ss.getRange(3, col); // in row 3 of all columns
var rangeName = ss.getValue(stockName);
Logger.log(rangeName) // test to see if the value of stockname is picked up by Appscript
// For every column, get the values in 'stockName and headerCell' and create a named range from them.
An exception is for the second column, instead of 'Close' name, call it 'Stockname' + 'Price'.
};
这里是传播sheet格式的例子。此脚本将适用于 Aveva Group 选项卡。
问题
通常,传播的格式sheet都是相同的。唯一的区别是股票的名称。我希望能够为每个 tab/sheet 自动设置现有列和新列的所有列的命名范围,并使用自定义菜单触发它(这部分我可以自己整理)。有没有更好的方法来完成这项工作?
解释:
创建一个包含您希望参与此过程的所有 sheet 个名称的数组。
ForEach sheet 名称,通过将 sheet 名称与 namerange
名称连接,根据该名称设置名称范围。
解决方案:
function NamedRanges() {
var spreadsheet = SpreadsheetApp.getActive();
//put all the sheets here you want to include
var sheetNames = ["Trainline","Softcat","Avast"];
var namerng=['Date','Price','Returns','GrossReturns','GeometricReturns',
'Risk','NegativeReturns','PositiveReturns','TimeValueMoney'];
sheetNames.forEach(sh=>{
sheet = spreadsheet.getSheetByName(sh);
namerng.forEach((nr,i)=>{
spreadsheet.setNamedRange(sh+nr, sheet.getRange(1,i+1,sheet.getMaxRows(),1));
});
});
};
也将这段代码保存到您的脚本编辑器中,它将在 spreadsheet 文件的顶部菜单中创建一个菜单按钮,该按钮将执行 NamedRanges
:
function onOpen() {
SpreadsheetApp.getUi()
.createMenu('Custom Menu')
.addItem('Name Ranges', 'NamedRanges')
.addToUi();
}
上下文
所以我有一个 spreadsheet 有 11+ sheets,但稍后会添加更多。我想使用命名范围动态命名列。我创建了一个宏脚本并一直在使用它。唯一的问题是每个 sheet,我必须转到脚本并更改命名范围的名称:
function NamedRanges() {
var spreadsheet = SpreadsheetApp.getActive();
spreadsheet.setNamedRange('TrainlineDate', spreadsheet.getRange('A:A'));
spreadsheet.setNamedRange('TrainlinePrice', spreadsheet.getRange('B:B'));
spreadsheet.setNamedRange('TrainlineReturns', spreadsheet.getRange('C:C'));
spreadsheet.setNamedRange('TrainlineGrossReturns', spreadsheet.getRange('D:D'));
spreadsheet.setNamedRange('TrainlineGeometricReturns', spreadsheet.getRange('E:E'));
spreadsheet.setNamedRange('TrainlineRisk', spreadsheet.getRange('F:F'));
spreadsheet.setNamedRange('TrainlineNegativeReturns', spreadsheet.getRange('G:G'));
spreadsheet.setNamedRange('TrainlinePositiveReturns', spreadsheet.getRange('H:H'));
spreadsheet.setNamedRange('TrainlineTimeValueMoney', spreadsheet.getRange('I:I'));
};
例如,对于下一个选项卡,我必须将 Trainline 更改为 Softcat。
我尝试将列创建为数组,然后使用 for 循环根据单元格 B2
中的名称 + headers 中的名称创建命名范围(第 3 个每列的行)。我也将在未来添加新的专栏。但是,当我尝试在单元格 B2
中记录值时,它失败了。长话短说,我被困住了。这是我到目前为止想出的;
function NamedRange() {
const ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var col = ss.getLastColumn(); //Get all the columns in the sheet with data (there will be no gaps/spaces)
var stockName = ss.getRange("B1"); // name in cell B1 (column 2, row 1)
var headerCell = ss.getRange(3, col); // in row 3 of all columns
var rangeName = ss.getValue(stockName);
Logger.log(rangeName) // test to see if the value of stockname is picked up by Appscript
// For every column, get the values in 'stockName and headerCell' and create a named range from them.
An exception is for the second column, instead of 'Close' name, call it 'Stockname' + 'Price'.
};
这里是传播sheet格式的例子。此脚本将适用于 Aveva Group 选项卡。
问题
通常,传播的格式sheet都是相同的。唯一的区别是股票的名称。我希望能够为每个 tab/sheet 自动设置现有列和新列的所有列的命名范围,并使用自定义菜单触发它(这部分我可以自己整理)。有没有更好的方法来完成这项工作?
解释:
创建一个包含您希望参与此过程的所有 sheet 个名称的数组。
ForEach sheet 名称,通过将 sheet 名称与
namerange
名称连接,根据该名称设置名称范围。
解决方案:
function NamedRanges() {
var spreadsheet = SpreadsheetApp.getActive();
//put all the sheets here you want to include
var sheetNames = ["Trainline","Softcat","Avast"];
var namerng=['Date','Price','Returns','GrossReturns','GeometricReturns',
'Risk','NegativeReturns','PositiveReturns','TimeValueMoney'];
sheetNames.forEach(sh=>{
sheet = spreadsheet.getSheetByName(sh);
namerng.forEach((nr,i)=>{
spreadsheet.setNamedRange(sh+nr, sheet.getRange(1,i+1,sheet.getMaxRows(),1));
});
});
};
也将这段代码保存到您的脚本编辑器中,它将在 spreadsheet 文件的顶部菜单中创建一个菜单按钮,该按钮将执行 NamedRanges
:
function onOpen() {
SpreadsheetApp.getUi()
.createMenu('Custom Menu')
.addItem('Name Ranges', 'NamedRanges')
.addToUi();
}