简体   繁体   中英

Google Script Execution Time

I have the following script to record who edited a field and the date time:

function onEdit() {
 var s = SpreadsheetApp.getActiveSheet();
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var sheet = ss.getSheetName();
 var r = s.getActiveCell();
 var live = true;
 var row = r.getRow();
 var user = Session.getActiveUser();
 var time = new Date();
   SpreadsheetApp.getActiveSheet().getRange('S' + row.toString()).setValue(time);
   SpreadsheetApp.getActiveSheet().getRange('T' + row.toString()).setValue(user);
};

It takes 30 seconds for the updates to appear in my sheet. Looking at the execution log, I see this takes 40 seconds to complete, with just getting the values of S6 and T6 being the problem.

How can I speed this up?

[17-03-18 12:23:28:831 EDT] SpreadsheetApp.getActiveRange() [0 seconds]
[17-03-18 12:23:28:831 EDT] Range.getRow() [0 seconds]
[17-03-18 12:23:28:831 EDT] Range.getLastRow() [0 seconds]
[17-03-18 12:23:28:831 EDT] Range.getColumn() [0 seconds]
[17-03-18 12:23:28:831 EDT] Range.getLastColumn() [0 seconds]
[17-03-18 12:23:28:831 EDT] SpreadsheetApp.getActiveSpreadsheet() [0 seconds]
[17-03-18 12:23:28:833 EDT] Session.getActiveUser() [0.001 seconds]
[17-03-18 12:23:28:833 EDT] User.getEmail() [0 seconds]
[17-03-18 12:23:28:835 EDT] Starting execution
[17-03-18 12:23:28:841 EDT] SpreadsheetApp.getActiveSpreadsheet() [0 seconds]
[17-03-18 12:23:28:843 EDT] SpreadsheetApp.getActiveSheet() [0 seconds]
[17-03-18 12:23:28:843 EDT] SpreadsheetApp.getActiveSpreadsheet() [0 seconds]
[17-03-18 12:23:28:887 EDT] Spreadsheet.getSheetName() [0.044 seconds]
[17-03-18 12:23:28:888 EDT] Sheet.getActiveCell() [0 seconds]
[17-03-18 12:23:28:889 EDT] Range.getRow() [0 seconds]
[17-03-18 12:23:28:889 EDT] Range.getColumn() [0 seconds]
[17-03-18 12:23:28:889 EDT] Range.getColumn() [0 seconds]
[17-03-18 12:23:28:889 EDT] Range.getRow() [0 seconds]
[17-03-18 12:23:28:889 EDT] Session.getActiveUser() [0 seconds]
[17-03-18 12:23:28:890 EDT] SpreadsheetApp.getActiveSheet() [0 seconds]

[17-03-18 12:23:48:344 EDT] Sheet.getRange([S6]) [19.454 seconds]

[17-03-18 12:23:48:345 EDT] Range.setValue([Sat Mar 18 12:23:28 GMT-04:00 2017]) [0 seconds]
[17-03-18 12:23:48:346 EDT] SpreadsheetApp.getActiveSheet() [0 seconds]

[17-03-18 12:24:08:844 EDT] Sheet.getRange([T6]) [20.497 seconds]

[17-03-18 12:24:08:847 EDT] Execution failed: Exceeded maximum execution time [40.002 seconds total runtime]

Change:

 var user = Session.getActiveUser();

to:

 var user = Session.getActiveUser().getEmail();

Or a faster way. Use the event data returned by onEdit:

function onEdit(e) {
  var row = e.range.getSheet().getActiveCell().getRow()
  var user=e.user
  e.range.getSheet().getRange('S' + row.toString()).setValue(Utilities.formatDate(new Date(), "GMT-6:00", "MM/dd/yyyy HH:mm:ss"));
  e.range.getSheet().getRange('T' + row.toString()).setValue(user);
};

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM