谷歌应用程序脚本,根据单元格值重命名多个名称范围。

问题描述 投票:0回答:1

我是GAS编程的新手,我需要帮助制作一个根据单元格值重命名多个名称范围的脚本。

我目前正在使用一个简单的脚本,在这个脚本中,我正在为一个选定的列创建一个名称范围,并根据单元格的值来命名这个范围。

function Group_A() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var first = ss.getSheetByName("DATA VALIDATION");
  var range = first.getRange("A1");
  var cell = range.getCell(1,1);
  var sheet = cell.getValue();

  ss.setNamedRange(sheet, ss.getRange('A2:A'));

}

范围的名称将从给定列的第一个单元格开始。命名范围的范围将从给定列的第二行到最后一行。

我需要帮助我在nNum列的循环中运行这段代码,因为有超过20个名称范围要做。

先谢谢你

google-apps-script named-ranges google-sheets-macros
1个回答
2
投票

我相信你的目标如下。

  • 第1行是使用命名范围的名称。
  • 你想用新的名字来重命名这个命名范围。该范围是在第2行之后的列。
  • 你想选择工作表上的列 DATA VALIDATION.
  • 你想通过给从第1行检索到的名称,给所选列的每一列重命名命名范围。

对此,这个答案如何?

流程。

这个示例脚本的流程如下:

  1. 检索表。
  2. 检索第1行的值。
  3. 读取工作表中的命名范围,并创建一个对象。
  4. 读取选区。
  5. 检索每个范围,并使用名称重命名现有的命名范围。

脚本示例 1:

在这个示例脚本中,现有的命名范围将被重命名为选定的列。在运行脚本之前,请先在工作表中选择列。DATA VALIDATION. 然后,请运行该脚本。这样,每一列的命名范围就会使用第一行检索到的名称来设置。

function Group_A() {
  // 1. Retrueve sheet.
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName("DATA VALIDATION");

  // 2. Retrieve the 1st row values.
  const headerRow = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];

  // 3. Retrieve the named ranges in the sheet and create an object.
  const namedRangesObj = sheet.getNamedRanges().reduce((o, e) => Object.assign(o, {[e.getRange().getColumn()]: e}), {});

  // 4. Retrieve the selection.
  const selection = sheet.getSelection();

  // 5. Retrieve each range and rename the existing named range using the name.
  selection
    .getActiveRangeList()
    .getRanges()
    .forEach(r => {
      const col = r.getColumn();
      const name = headerRow[col - 1];
      if (!name) throw new Error("No headef value.");
      if (col in namedRangesObj) {
        namedRangesObj[col].setName(name);
      }
    });
}

脚本示例 2:

在这个示例脚本中,现有的命名范围将被重新命名为选定的列。同时,当所选列不是命名范围时,它将被设置为新的命名范围,使用从第1行检索到的名称。在运行该脚本之前,请先在工作表中选择列 DATA VALIDATION. 然后,请运行该脚本。这样,每一列的命名范围就会使用第一行检索到的名称来设置。

function Group_A() {
  // Ref: https://stackoverflow.com/a/21231012/7108653
  const columnToLetter = column => {
    let temp,
      letter = "";
    while (column > 0) {
      temp = (column - 1) % 26;
      letter = String.fromCharCode(temp + 65) + letter;
      column = (column - temp - 1) / 26;
    }
    return letter;
  };

  // 1. Retrueve sheet.
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName("DATA VALIDATION");

  // 2. Retrieve the 1st row values.
  const headerRow = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];

  // 3. Retrieve the named ranges in the sheet and create an object.
  const namedRangesObj = sheet.getNamedRanges().reduce((o, e) => Object.assign(o, {[e.getRange().getColumn()]: e}), {});

  // 4. Retrieve the selection.
  const selection = sheet.getSelection();

  // 5. Retrieve each range and rename and set the named range using the name.
  selection
    .getActiveRangeList()
    .getRanges()
    .forEach(r => {
      const col = r.getColumn();
      const name = headerRow[col - 1];
      if (!name) throw new Error("No headef value.");
      if (col in namedRangesObj) {
        namedRangesObj[col].setName(name);
      } else {
        const colLetter = columnToLetter(col);
        ss.setNamedRange(name, sheet.getRange(`${colLetter}2:${colLetter}`));
      }
    });
}

注意:在这些示例脚本中,假设每个命名范围是一列。

  • 在这些示例脚本中,它假设每个命名范围是一列。请注意这一点。
  • 请在启用V8的情况下使用这个脚本。

参考文献

© www.soinside.com 2019 - 2024. All rights reserved.