在 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();
}