google-apps-script - Google Sheets onEdit(e) 未捕获多个编辑
问题描述
Google 表格脚本编辑器中的 onEdit(e) 函数仅捕获对单个单元格的编辑。有没有办法让它捕获对多个单元格的编辑,例如,如果我将信息复制到 20 个单元格中,onEdit(e) 是否可以识别出 20 个单元格已被编辑而不仅仅是第一个单元格?
我到处寻找解决方案,但找不到任何人问这个问题的例子。
function recordChange(c){
var range = c.range;
var column = 8; //Column for change log
var row = range.getRow();
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var oldRow = range.getRow();
var oldColumn = range.getColumn();
sheet.getRange(oldRow, oldColumn).setBackground("orange");
var changeCell = sheet.getRange(row, column)
changeCell.setValue(new Date())
var testCell = sheet.getRange(2, 2)
var test = range.getValues();
var newT = test.map(function(x){ return x});
testCell.setValue(newT)
}
function recordAction(c){
var range = c.range;
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var row = range.getRow();
for (var i = 1; i<9; i++){
sheet.getRange(row, i).setBackground(null);
}
}
//Main Function
function onEdit(e){
var range = e.range;
if (range.getRow() != 1){
if (range.getColumn() != 9 && range.getColumn() != 8) {recordChange(e);} else {recordAction(e);}
}
}
编辑单元格应在单独的列中添加日期,并以橙色突出显示单元格。这行得通,但是当我尝试编辑多个单元格时,它只会注册第一个单元格,因此它作为在工作表上记录编辑的一种手段是毫无用处的。
我假设有一种方法可以捕获数组中的多个编辑,但是我找不到任何明显的方法。
解决方案
您需要使用 e.range 对象中的一些方法。
我在这里写了一个小示例代码:
function onEdit(e) {
var sheet = SpreadsheetApp.getActive().getActiveSheet();
var changes = e.range.getValues();
// +1 because of header row
var lastRow = e.range.getLastRow() + 1;
var date = new Date();
var dateOfChange = date.toLocaleDateString() + " at " + date.toLocaleTimeString();
var timeColumn = 4
//sheet.getDataRange().getLastColumn()
for (var i = 0; i < changes.length; i++) {
var row = (lastRow - changes.length) + i;
var timeCell = sheet.getRange(row, timeColumn);
//this is quick and dirty but you will probably want to add more advanced data validation
var validator = 0
changes[i].forEach(function(x) {x.toString().length > 0 ? validator++ : null;})
if (validator > 0 && e.range.getLastColumn() < timeColumn) {
timeCell.setValue(dateOfChange);
} else {
timeCell.clear()
}
}
}
只需将时间列值更改为您自己的时间戳列整数,并确保该列位于您要粘贴数据的最后一列之后,否则您需要编写更复杂的代码。
推荐阅读
- javascript - 使用 ID / 或类更改值,但针对其中一个字段
- mongodb - $geowithin:$polygon 不使用 2dsphere 索引
- swift - 在 Swift 中将 JSONEncoder 用于 Equatable 方法
- css - 自定义一个以组件为内容的 ng-boostrap 模态
- python - 如何在 Seaborn 中仅针对正值创建箱线图?
- database - 从数据库填充 Wix 日历
- rx-swift - RxSwift 变量到另一个变量的链式传播
- python - Pandas 包处理丑陋的列名
- java - 并行流中的第一元素确定
- java - Spring在属性中包含相对路径