google-apps-script - 优化 OnEdit() 脚本
问题描述
我正在尝试开发一个简单的脚本来创建一个日志表,以在其中一个表格上标记一个复选框时显示某些信息。
该脚本工作正常(它完成了它需要做的事情),但有时运行缓慢。如果多个用户同时“编辑”工作表,则某些条目会丢失,因为最后一个编辑会覆盖前一个。我需要尽可能优化脚本以避免丢失信息。
我认为有两种可能的方法来做到这一点。一种是使用函数来识别下一个可用行,另一种是在工作表中使用 countA 函数并从代码中获取值 (...getRange('whatever').getValue())。他们俩都变慢了,所以我想问题出在其他地方。
我也尝试使用 onEdit(e) 并通过 e.range 获取活动范围,但它也太慢了。
请在代码下方找到。
function onEdit() {
var ss = SpreadsheetApp.getActive();
var user = Session.getActiveUser().getEmail();
var activeCell = ss.getActiveRange();
var sheet = activeCell.getSheet();
var row = activeCell.getRow();
var column = activeCell.getColumn();
var activeCellValue = activeCell.getValue();
if(!isSupervisor(user) && activeCellValue == true && sheet.getName() != "Activities" && sheet.getName() != "Edit Log" && row >= 10 && column >= 2 && column <= 26 && column % 2 != 0){
var editLog = ss.getSheetByName("Edit Log");
var nextRow = 4 + editLog.getRange('P1').getValue();
var date = new Date();
var language = sheet.getRange(4, column - 1).getValue();
var assignedTo = sheet.getRange(3, column - 1).getValue();
var startHour = sheet.getRange(row, 1).getValue();
var startHourHour = sheet.getRange(row, 27).getValue();
var startHourMinutes = sheet.getRange(row, 28).getValue();
var activity = sheet.getRange(row, column - 1).getValue();
var note = activeCell.getNote();
var generatingID = sheet.getName()+"_"+language+"_"+activity+"_"+startHourHour;
//var shortID = language+"_"+activity+"_"+startHour;
if(!isAlreadyAdded(generatingID, editLog.getRange("A4:A").getValues())) {
editLog.getRange("B1").setValue("Not added");
editLog.getRange("B2").setValue(generatingID);
editLog.getRange(nextRow, 1).setValue(generatingID);
editLog.getRange(nextRow, 3).setValue(date);
editLog.getRange(nextRow, 4).setValue(user);
editLog.getRange(nextRow, 5).setValue(sheet.getName());
editLog.getRange(nextRow, 6).setValue(activeCellValue);
editLog.getRange(nextRow, 7).setValue(language);
editLog.getRange(nextRow, 8).setValue(activity);
editLog.getRange(nextRow, 9).setValue(assignedTo);
editLog.getRange(nextRow, 10).setValue(startHour);
editLog.getRange(nextRow, 13).setValue(note);
} else {
editLog.getRange("B1").setValue("Already added");
editLog.getRange("B2").setValue(generatingID);
}
}
}
function isAlreadyAdded(generatingID, values) {
for(var i = 0; i < values.length; i++) {
if(values[i] == generatingID) {
return true;
}
}
return false;
}
function getFirstEmptyRow(data) {
for(var i = 0; i < data.length; i++) {
if(data[i][0] == null || data[i][0] == '') {
return i;
}
}
}
function isSupervisor(user) {
var supervisors = getSupervisors();
for(var i = 0; i < supervisors.length; i++) {
if(user == supervisors[i]) {
return true;
}
}
return false;
}
function getSupervisors() {
var supervisors = [];
//real values are hidden due to confidential information
supervisors.push("???");
supervisors.push("???");
supervisors.push("???");
supervisors.push("???");
supervisors.push("???");
supervisors.push("???");
supervisors.push("???");
supervisors.push("???");
return supervisors;
}
如前所述,我需要尽可能快地制作此脚本。由于脚本运行缓慢,我不能丢失任何条目。你有什么建议吗?
谢谢你的帮助 :)
解决方案
推荐阅读
- nginx - 使用 Nginx + Gunicorn 时,Bash 脚本不起作用,但除此之外没问题
- c# - 如何在没有阴影的情况下绘制我自己的工具提示?
- python - 从 OpenDAP 数据集中提取数据以获取多维变量
- mysql - 在 JPA Spring Boot 查询中转换 MySql 查询
- audio - NAudio Mp3解码点击和弹出
- eclipse-plugin - 单击时更新按钮文本
- batch-file - 通过 Visual Basic 6.0 运行批处理程序 (.bat)
- sql - 包括从 SQL 到 JSON 的“位”值
- css - 使用相对路径在 VSCode 中找不到 CSS/SCSS 代码模块
- c - 如何使用 arm-none-eabi-gcc + cmake 设置 cmocka 示例?