首页 > 解决方案 > 优化 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;
}

如前所述,我需要尽可能快地制作此脚本。由于脚本运行缓慢,我不能丢失任何条目。你有什么建议吗?

谢谢你的帮助 :)

标签: google-apps-scriptgoogle-sheets

解决方案


推荐阅读