Скрипт Google App для переименования нескольких диапазонов имен в соответствии со значениями ячеек - PullRequest
1 голос
/ 01 мая 2020

Я новичок в программировании 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'));

}

Имя диапазона будет из первой ячейки данного столбца. Диапазон диапазона имен будет от 2-й строки до конечной строки для указанных столбцов.

Мне нужна помощь в запуске этого кода на al oop для nNum столбцов, так как нужно создать более 20 диапазонов имен.

Заранее спасибо

1 Ответ

1 голос
/ 02 мая 2020

Я считаю, что ваша цель заключается в следующем.

  • 1-й ряд - это имя для использования именованного диапазона.
  • Вы хотите переименовать именованный диапазон с новым именем. Диапазон находится после строки 2 в столбце.
  • Вы хотите выбрать столбцы на листе DATA VALIDATION.
  • Вы хотите переименовать именованные диапазоны в каждый столбец выбранных столбцов. давая имя, полученное из 1-й строки.

Для этого, как насчет этого ответа?

Поток:

Порядок выполнения этого примера сценария следующий .

  1. Извлечение листа.
  2. Извлечение значений 1-й строки.
  3. Извлечение именованных диапазонов в листе и создание объекта.
  4. Извлечение выделение.
  5. Извлечение каждого диапазона и переименование существующего именованного диапазона с использованием имени.

Пример сценария 1:

В этом примере сценария существует существующий именованный диапазон переименован для выбранных столбцов. Перед запуском скрипта, пожалуйста, выберите столбцы на листе DATA VALIDATION. А затем, пожалуйста, запустите скрипт. Таким образом, именованный диапазон устанавливается для каждого столбца с использованием имени, полученного в 1-й строке.

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. А затем, пожалуйста, запустите скрипт. Таким образом, именованный диапазон устанавливается для каждого столбца с использованием имени, полученного в 1-й строке.

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.

Ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...