Google Apps 脚本 - 循环更新基于引用的多个命名范围 Table
Google Apps Script - Loop to Update Multiple Named Ranges Based on Reference Table
首先,我意识到有一些方法可以在不使用命名范围和脚本的情况下做到这一点。可悲的是,Google 文档导入范围强烈不同意,所以我需要找到一种方法来完成这项工作。
我想我差不多已经掌握了这个脚本,但我什至缺乏 GAS 中基本循环的编码知识。我用蓝色突出显示了与脚本和 shared an example at this link:
相关的传播sheet 的相关部分
在编辑特定单元格时,我希望发生以下情况:
- 从特定分布的一系列单元格中获取命名范围列表sheet
- 从相同跨度的相邻单元格范围更新那些命名范围的范围sheet
我理解逐个使用 setNamedRange() 的概念,但不是在基于传播sheet 范围的循环中。我希望它是可扩展的,这样我就可以轻松地扩展我可以使用此脚本更新的范围数。
function updateRanges()
{
var ss = SpreadsheetApp.getActive();
//range1
var updateRangeName = ss.getRange("B14").getValue();
var updateRangeValue = ss.getRange("C14").getValue();
ss.setNamedRange(updateRangeName,ss.getRange(updateRangeValue));
//range2
var updateRangeName = ss.getRange("B15").getValue();
var updateRangeValue = ss.getRange("C15").getValue();
ss.setNamedRange(updateRangeName,ss.getRange(updateRangeValue));
//range3
var updateRangeName = ss.getRange("B16").getValue();
var updateRangeValue = ss.getRange("C16").getValue();
ss.setNamedRange(updateRangeName,ss.getRange(updateRangeValue));
//range4
var updateRangeName = ss.getRange("B17").getValue();
var updateRangeValue = ss.getRange("C17").getValue();
ss.setNamedRange(updateRangeName,ss.getRange(updateRangeValue));
//range5
var updateRangeName = ss.getRange("B18").getValue();
var updateRangeValue = ss.getRange("C18").getValue();
ss.setNamedRange(updateRangeName,ss.getRange(updateRangeValue));
}
//
function onEdit(e) {
if (e.range.getA1Notation() === 'C2')
updateRanges();
}
更新 1
感谢 Yuri,找到了可行的解决方案!这是我的最终代码。我还添加了一个调整,以便 onEdit 触发器绑定到特定的 sheet.
function updateRanges() {
var ss = SpreadsheetApp.getActive();
sheet = ss.getSheetByName("Template")
var ranges = sheet.getRange('B14:C18').getValues();
for (var r in ranges) {
var updateRangeName = ranges[r][0];
var updateRangeValue = ranges[r][1];
ss.setNamedRange(updateRangeName,ss.getRange(updateRangeValue));
}
}
function onEdit(e) {
if (e.range.getSheet().getName() != "onEditSheet") {
return
}
if (e.range.getA1Notation() === 'B1') updateRanges();
}
是这样的吗?
function updateRanges() {
var ss = SpreadsheetApp.getActiveSheet();
var ranges = ss.getRange('B14:C18').getValues();
for (var r in ranges) {
var updateRangeName = ranges[r][0];
var updateRangeValue = ranges[r][1];
ss.setNamedRange(updateRangeName,ss.getRange(updateRangeValue));
}
}
function onEdit(e) {
if (e.range.getA1Notation() === 'C2') updateRanges();
}
首先,我意识到有一些方法可以在不使用命名范围和脚本的情况下做到这一点。可悲的是,Google 文档导入范围强烈不同意,所以我需要找到一种方法来完成这项工作。
我想我差不多已经掌握了这个脚本,但我什至缺乏 GAS 中基本循环的编码知识。我用蓝色突出显示了与脚本和 shared an example at this link:
相关的传播sheet 的相关部分在编辑特定单元格时,我希望发生以下情况:
- 从特定分布的一系列单元格中获取命名范围列表sheet
- 从相同跨度的相邻单元格范围更新那些命名范围的范围sheet
我理解逐个使用 setNamedRange() 的概念,但不是在基于传播sheet 范围的循环中。我希望它是可扩展的,这样我就可以轻松地扩展我可以使用此脚本更新的范围数。
function updateRanges()
{
var ss = SpreadsheetApp.getActive();
//range1
var updateRangeName = ss.getRange("B14").getValue();
var updateRangeValue = ss.getRange("C14").getValue();
ss.setNamedRange(updateRangeName,ss.getRange(updateRangeValue));
//range2
var updateRangeName = ss.getRange("B15").getValue();
var updateRangeValue = ss.getRange("C15").getValue();
ss.setNamedRange(updateRangeName,ss.getRange(updateRangeValue));
//range3
var updateRangeName = ss.getRange("B16").getValue();
var updateRangeValue = ss.getRange("C16").getValue();
ss.setNamedRange(updateRangeName,ss.getRange(updateRangeValue));
//range4
var updateRangeName = ss.getRange("B17").getValue();
var updateRangeValue = ss.getRange("C17").getValue();
ss.setNamedRange(updateRangeName,ss.getRange(updateRangeValue));
//range5
var updateRangeName = ss.getRange("B18").getValue();
var updateRangeValue = ss.getRange("C18").getValue();
ss.setNamedRange(updateRangeName,ss.getRange(updateRangeValue));
}
//
function onEdit(e) {
if (e.range.getA1Notation() === 'C2')
updateRanges();
}
更新 1
感谢 Yuri,找到了可行的解决方案!这是我的最终代码。我还添加了一个调整,以便 onEdit 触发器绑定到特定的 sheet.
function updateRanges() {
var ss = SpreadsheetApp.getActive();
sheet = ss.getSheetByName("Template")
var ranges = sheet.getRange('B14:C18').getValues();
for (var r in ranges) {
var updateRangeName = ranges[r][0];
var updateRangeValue = ranges[r][1];
ss.setNamedRange(updateRangeName,ss.getRange(updateRangeValue));
}
}
function onEdit(e) {
if (e.range.getSheet().getName() != "onEditSheet") {
return
}
if (e.range.getA1Notation() === 'B1') updateRanges();
}
是这样的吗?
function updateRanges() {
var ss = SpreadsheetApp.getActiveSheet();
var ranges = ss.getRange('B14:C18').getValues();
for (var r in ranges) {
var updateRangeName = ranges[r][0];
var updateRangeValue = ranges[r][1];
ss.setNamedRange(updateRangeName,ss.getRange(updateRangeValue));
}
}
function onEdit(e) {
if (e.range.getA1Notation() === 'C2') updateRanges();
}