Я считаю, что ваша цель заключается в следующем.
- 1-й ряд - это имя для использования именованного диапазона.
- Вы хотите переименовать именованный диапазон с новым именем. Диапазон находится после строки 2 в столбце.
- Вы хотите выбрать столбцы на листе
DATA VALIDATION
. - Вы хотите переименовать именованные диапазоны в каждый столбец выбранных столбцов. давая имя, полученное из 1-й строки.
Для этого, как насчет этого ответа?
Поток:
Порядок выполнения этого примера сценария следующий .
- Извлечение листа.
- Извлечение значений 1-й строки.
- Извлечение именованных диапазонов в листе и создание объекта.
- Извлечение выделение.
- Извлечение каждого диапазона и переименование существующего именованного диапазона с использованием имени.
Пример сценария 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.
Ссылки: