Google 根据单元格值重命名多个名称范围的应用脚本
Google App script to rename multiple name ranges according to cell values
我是 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 个。
提前致谢
我相信你的目标如下。
- 第一行是使用命名范围的名称。
- 您想用新名称重命名命名范围。范围在列中第 2 行之后。
- 您想 select sheet
DATA VALIDATION
上的列。
- 您想通过提供从第一行检索到的名称来将命名范围重命名为 selected 列的每一列。
为此,这个答案怎么样?
流量:
该示例脚本的流程如下。
- 检索sheet。
- 检索第一行值。
- 检索 sheet 中的命名范围并创建一个对象。
- 检索 select离子。
- 检索每个范围并使用名称重命名现有命名范围。
示例脚本 1:
在此示例脚本中,现有命名范围已针对 selected 列重命名。在您 运行 脚本之前,请在 sheet select 列中 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:
在此示例脚本中,现有命名范围已针对 selected 列重命名。而且,当 selected 列不是命名范围时,它会使用从第一行检索到的名称设置为新的命名范围。在您 运行 脚本之前,请在 sheet select 列中 DATA VALIDATION
。然后,请 运行 脚本。这样,使用第一行检索到的名称为每一列设置命名范围。
function Group_A() {
// Ref:
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 的情况下使用此脚本。
参考文献:
我是 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 个。
提前致谢
我相信你的目标如下。
- 第一行是使用命名范围的名称。
- 您想用新名称重命名命名范围。范围在列中第 2 行之后。
- 您想 select sheet
DATA VALIDATION
上的列。 - 您想通过提供从第一行检索到的名称来将命名范围重命名为 selected 列的每一列。
为此,这个答案怎么样?
流量:
该示例脚本的流程如下。
- 检索sheet。
- 检索第一行值。
- 检索 sheet 中的命名范围并创建一个对象。
- 检索 select离子。
- 检索每个范围并使用名称重命名现有命名范围。
示例脚本 1:
在此示例脚本中,现有命名范围已针对 selected 列重命名。在您 运行 脚本之前,请在 sheet select 列中 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:
在此示例脚本中,现有命名范围已针对 selected 列重命名。而且,当 selected 列不是命名范围时,它会使用从第一行检索到的名称设置为新的命名范围。在您 运行 脚本之前,请在 sheet select 列中 DATA VALIDATION
。然后,请 运行 脚本。这样,使用第一行检索到的名称为每一列设置命名范围。
function Group_A() {
// Ref:
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 的情况下使用此脚本。