【问题标题】:Google Apps Script - Loop to Update Multiple Named Ranges Based on Reference TableGoogle Apps 脚本 - 根据参考表循环更新多个命名范围
【发布时间】:2021-09-06 08:38:41
【问题描述】:

首先,我意识到有一些方法可以在不使用命名范围和脚本的情况下做到这一点。遗憾的是,Google Docs 导入的范围强烈反对,所以我需要找到一种方法来完成这项工作。

我想我已经快完成这个脚本了,但我缺乏 GAS 中基本循环的编码知识。我用蓝色突出显示了与脚本和shared an example at this link有关的电子表格的相关部分:

在编辑特定单元格时,我希望发生以下情况:

  • 从特定电子表格的一系列单元格中获取命名范围列表
  • 从同一电子表格中的相邻单元格范围更新那些命名范围的范围

我理解一个一个地使用 setNamedRange() 的概念,但不是基于电子表格范围的循环。我希望它是可扩展的,以便我可以轻松扩展可以使用此脚本更新的范围数量。

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 触发器绑定到特定工作表。

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();
}

【问题讨论】:

    标签: javascript google-apps-script google-sheets named-ranges


    【解决方案1】:

    这样的?

    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();
    }
    

    【讨论】:

    • 稍微调整一下,就可以了!显然 setNamedRange 只能在电子表格级别而不是工作表级别上完成。所以我只需要使用 ss = SpreadsheetApp.getActive();现在我只需要弄清楚如何为每个范围设置工作表名称 - “范围”所在的工作表 - onEdit 触发单元所在的工作表
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    相关资源
    最近更新 更多