【问题标题】:Automating named Range function in google sheets在谷歌表格中自动化命名范围函数
【发布时间】:2021-01-16 01:38:28
【问题描述】:

上下文

所以我有一个包含 11 多张工作表的电子表格,不过稍后会添加更多。我想使用命名范围动态命名列。我创建了一个宏脚本并一直在使用它。唯一的问题是对于每张纸,我必须转到脚本并更改命名范围的名称:

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 中的名称 + 标题中的名称(每列的第 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'.
    };

这是电子表格格式的示例。此脚本将适用于 Aveva Group 选项卡以后。

问题

通常,电子表格的格式都相同。唯一的区别是股票的名称。我希望能够为每个选项卡/工作表的现有列和新列自动设置所有列的 namedRange,并使用自定义菜单触发它(这部分我可以自己整理)。有没有更好的方法来完成这项工作?

【问题讨论】:

    标签: javascript google-apps-script google-sheets named-ranges


    【解决方案1】:

    解释:

    • 创建一个包含您希望参与此过程的所有工作表名称的数组。

    • ForEach 工作表名称,通过将工作表名称与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));
              });
          });
    };
    

    将此代码也保存到您的脚本编辑器中,它将在电子表格文件的顶部菜单中创建一个菜单按钮,该按钮将执行NamedRanges

    function onOpen() {
      SpreadsheetApp.getUi()
      .createMenu('Custom Menu')
      .addItem('Name Ranges', 'NamedRanges')
      .addToUi();
    }
    

    【讨论】:

    • 感谢您的回复:)。我尝试了代码并感谢自定义菜单,这很方便。我现在收到此错误TypeError: sheet.setNamedRange is not a function (anonymous) @ macros.gs:8 NamedRanges@ macros.gs:6
    • @Desmond 抱歉,错字。再次检查我的答案。
    • 太棒了!不过,我有一个快速的问题。我必须继续在列中输入吗?是否可以识别新列或使用getLastColumnsgetMaxColumns 函数,然后创建命名范围,还是不可能?
    • @Desmond 请尝试我更新的答案。更快更小。确保namerng 元素与列的顺序相同(从列A 开始)
    • 谢谢,效果很好!再次感谢您的帮助! :)
    猜你喜欢
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多