首页 > 解决方案 > Google Scripts for Sheets 中的 onEdit() 简单触发器如何处理不相邻的范围?

问题描述

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

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

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

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

谢谢

标签: google-apps-scriptgoogle-sheetstriggers

解决方案


我们可以从事件对象的范围属性中获取活动工作表,但不能从选择中获取,但我们可以使用 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());

推荐阅读