【问题标题】:How are non-adjacent ranges handled by the onEdit() simple trigger in Google Scripts for Sheets?Google Scripts for Sheets 中的 onEdit() 简单触发器如何处理不相邻的范围?
【发布时间】:2018-06-08 22:26:09
【问题描述】:

我正在尝试让 onEdit() 简单触发器对 Google 表格中所有已编辑的单元格执行操作。问题是,如果您编辑一组不相邻的单元格,则事件对象只会选择第一个选定的范围。

例如,我有以下代码。如果我在工作表中输入公式或为单元格赋值,脚本会自动将背景颜色更改为红色。

function onEdit(e) {
  var range = e.range;
  range.setBackgroundRGB(255, 0, 0); //set color to red 
}

如果我用鼠标选择许多彼此不相邻的范围(或单元格)并一次更改它们的所有值(例如,如果我从某处复制一个值并将其粘贴到许多相邻的单元格中,则会出现问题立刻)。脚本不会更改所有背景颜色,而只会更改所选第一个范围的颜色。

谢谢

【问题讨论】:

    标签: google-apps-script google-sheets triggers


    【解决方案1】:

    我们可以从事件对象的范围属性中获取活动工作表,但不能从选择项中获取,但我们可以使用 getSelection 和 getRangeList。第一个返回一个对象,该对象可用于获取通过 getRangeList 完成的选定范围引用。

    来自https://developers.google.com/apps-script/reference/spreadsheet/selection的示例

    var activeSheet = SpreadsheetApp.getActiveSheet();
    var rangeList = activeSheet.getRangeList(['A1:B4', 'D1:E4']);
    rangeList.activate();
    
    var selection = activeSheet.getSelection();
    // Current Cell: D1
    Logger.log('Current Cell: ' + selection.getCurrentCell().getA1Notation());
    // Active Range: D1:E4
    Logger.log('Active Range: ' + selection.getActiveRange().getA1Notation());
    // Active Ranges: A1:B4, D1:E4
    var ranges =  selection.getActiveRangeList().getRanges();
    for (var i = 0; i < ranges.length; i++) {
      Logger.log('Active Ranges: ' + ranges[i].getA1Notation());
    }
    Logger.log('Active Sheet: ' + selection.getActiveSheet().getName());
    

    【讨论】:

    • 金奖,谢谢!不幸的是,事件对象没有返回 RangeList。
    • getActiveRangeList()(从触发函数调用)仅返回 1 个范围 see this bug report in Google 请为这个问题投票。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    相关资源
    最近更新 更多