javascript - Google Sheets Changelog onEdit() 脚本不返回数据,只重复标题
问题描述
我对脚本非常陌生,并试图充分利用 onEdit() 函数来跟踪对协作电子表格所做的更改。
该脚本似乎运行良好,因为每次任何用户在工作表上进行更改时都会在 Changelog 工作表中添加一行。但是,它有时只注册我正在寻找的数据,并且大多数时候注册一行是标题的副本:请参阅此处
我这里的授权有什么问题吗?或者是别的什么?
非常感谢,非常感谢!
--
以下是脚本的详细信息:
function onEdit(e) {
var changelogSheetName = "Changelog";
var ss = SpreadsheetApp.getActiveSpreadsheet();
var cell = SpreadsheetApp.getActiveRange();
var timestamp = new Date();
var currentSheet = ss.getActiveSheet();
var currentSheetName = currentSheet.getName();
var previousValue = e.oldValue;
var newValue = cell.getValue();
var typeChange = "Edit";
if (currentSheetName == changelogSheetName) return;
var changelogSheet = ss.getSheetByName(changelogSheetName);
if (changelogSheet == null) {changelogSheet = ss.insertSheet(changelogSheetName, ss.getNumSheets());}
changelogSheet.getRange('A1:G1').setBackground('#E0E0E0');
changelogSheet.appendRow(["Timestamp", "Sheet", "Cell", "Type", "Old Value", "New Value", "User"]);
changelogSheet.deleteColumns(8,19);
changelogSheet.setFrozenRows(1);
changelogSheet.setColumnWidth(1, 170);
changelogSheet.setColumnWidth(7, 170);
changelogSheet.protect();
var user = Session.getEffectiveUser().getEmail();
if (previousValue == null){typeChange = "Add";} else if (newValue == "") {typeChange = "Remove";}
changelogSheet.appendRow([timestamp, currentSheetName, cell.getA1Notation(), typeChange, previousValue, newValue, user]);
}
解决方案
这部分代码应该在您的语句中,因为您只希望在工作表ChangeLog不存在if (changelogSheet == null)
时执行这部分。这也会导致脚本在每次发生事件时写入标头。
changelogSheet.getRange('A1:G1').setBackground('#E0E0E0');
changelogSheet.appendRow(["Timestamp", "Sheet", "Cell", "Type", "Old Value", "New Value", "User"]);
changelogSheet.deleteColumns(8,19);
changelogSheet.setFrozenRows(1);
changelogSheet.setColumnWidth(1, 170);
changelogSheet.setColumnWidth(7, 170);
changelogSheet.protect();
在这里,我编辑了您的代码,修复了一些逻辑并利用事件对象(e):
function onEdit(e) {
var ss = e.source.getActiveSheet();
var editedSheet = ss.getSheetName();
var changelogSheetName = "Changelog";
if (editedSheet == changelogSheetName) return;
var changelogSheet = e.source.getSheetByName(changelogSheetName);
if (!changelogSheet) {
changelogSheet = e.source.insertSheet(changelogSheetName, e.source.getNumSheets());
changelogSheet.appendRow(["Timestamp", "Sheet", "Cell", "Type", "Old Value", "New Value", "User"]);
changelogSheet.getRange('A1:G1').setBackground('#E0E0E0');
changelogSheet.deleteColumns(8, 19);
changelogSheet.setFrozenRows(1);
changelogSheet.setColumnWidth(1, 170);
changelogSheet.setColumnWidth(7, 170);
changelogSheet.protect();
}
var timestamp = new Date();
var previousValue = e.oldValue;
var newValue = e.value;
var typeChange = "Edit";
var cell = e.range.getA1Notation();
var user = Session.getEffectiveUser().getEmail();
if (previousValue == null) {
typeChange = "Add";
} else if (newValue == "") {
typeChange = "Remove";
}
changelogSheet.appendRow([timestamp, editedSheet, cell, typeChange, previousValue, newValue, user]);
}
编辑表:
输出:
参考:
推荐阅读
- android - RecyclerView 在Android中单击时选择了多个项目
- mysql - Apexcharts 不显示来自 Web 服务的数据
- java - 使用正则表达式从字符串中删除不在允许列表中的所有内容
- flutter - Flutter Riverpod:使用状态通知器刷新屏幕外页面
- react-native - 从后端获取数据时,React 本机应用程序不断返回未定义
- php - 回声
- exchangewebservices - 从 Azure 门户中删除 Exchange 应用权限
- c# - C#使用输入参数调用存储的MYSQL过程
- angular - TypeError:您在预期流的位置提供了“未定义”。您可以提供 Observable、Promise、Array 或 Iterable。在
- python - 使用 df.loc 和 astype() *有时* 问题 SettingWithCopyWarning 分配给列切片