优化OnEdit()脚本

时间:2019-08-15 09:12:37

标签: google-apps-script google-sheets

我正在尝试开发一个简单的脚本来创建一个日志表,以在其中一个工作表上选中一个复选框时显示某些信息。

该脚本可以正常工作(它可以完成所需的工作),但有时工作缓慢。如果多个用户同时“编辑”工作表,则某些条目会丢失,因为上次编辑会覆盖前一个。我需要尽可能地优化脚本,以免丢失信息。

我认为有2种可能的方法可以做到。一种是使用函数来标识下一个可用行,另一种是使用工作表中的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;
}

如前所述,我需要使此脚本尽可能快。由于脚本的缓慢性,我不会丢失任何条目。你有什么建议吗?

感谢您的帮助:)

0 个答案:

没有答案