Как сократить время ожидания - оповещение по электронной почте с помощью устанавливаемого триггера onOpen из библиотеки - PullRequest
0 голосов
/ 21 января 2020

У меня есть этот код в библиотеке, которая вызывается onOpen нескольких электронных таблиц:

function emailAlerts() {
// sends email alert when accurate anchors is above treshold
  var linksSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('links');
  var Ssurl = SpreadsheetApp.getActiveSpreadsheet().getUrl();
  var accuracyCellValue = linksSheet.getRange(3,4).getValue();
  var customerCellValue = linksSheet.getRange(1,5).getValue();
  var treshold = 15;
  if (accuracyCellValue > treshold) {
    var message = 'Attention! The accuracte anchors for the customer is ' + accuracyCellValue + '%, while the treshold is: ' + treshold + '%. Customer spreadsheet:' + Ssurl;
    var subject = 'Accurate anchors alert for customer ' + customerCellValue;
    MailApp.sendEmail('yaniv@mydomain.co.il','noreply@mydomain.co.il', subject, message);
  }
}

Это работает, но проблема в том, что загрузка электронных таблиц до конечной sh занимает около 15 секунд, когда Открыто.

Мне действительно нужно сократить время выполнения, чтобы избежать путаницы среди пользователей.

Я хочу сохранить функцию в библиотеке, чтобы при необходимости легко вносить изменения во все электронные таблицы.

Я буду рад услышать любые идеи.

Спасибо!

PS В одной библиотеке есть несколько триггеров onEdit - все очень быстро извиняются.

1 Ответ

2 голосов
/ 21 января 2020

Причина, по которой ваш код медленный, заключается в том, что он включает в себя несколько вызовов на внешние серверы, в частности на SpreadsheetApp и MailApp. Эти звонки занимают много времени. Если эти вызовы необходимы, значительно ускорить ваш код.

Например, измените:

var linksSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('links');
var Ssurl = SpreadsheetApp.getActiveSpreadsheet().getUrl();

на

var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var linksSheet = spreadsheet.getSheetByName('links');
var Ssurl = spreadsheet.getUrl();
  • Другая точка оптимизации заключается в перемещении как можно большего количества кода в оператор if, если нет необходимости выполнять этот код в случае невыполнения условия.

Пример:

function emailAlerts() {
// sends email alert when accurate anchors is above treshold
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var linksSheet = spreadsheet.getSheetByName('links');
  var accuracyCellValue = linksSheet.getRange(3,4).getValue();
  var treshold = 15;
  if (accuracyCellValue > treshold) {
    var customerCellValue = linksSheet.getRange(1,5).getValue();
    var Ssurl = spreadsheet.getUrl();
    var message = 'Attention! The accuracte anchors for the customer is ' + accuracyCellValue + '%, while the treshold is: ' + treshold + '%. Customer spreadsheet:' + Ssurl;
    var subject = 'Accurate anchors alert for customer ' + customerCellValue;
    MailApp.sendEmail('yaniv@mydomain.co.il','noreply@mydomain.co.il', subject, message);
  }
}
  • Неприменимо в вашем случае, но в том случае, если вам это понадобится в другой ситуации: если вы извлекаете значения из соседнего диапазона, значительно быстрее извлекать значения всего диапазона с помощью getValues(), чем проходить по ячейкам и извлекать значение каждый индивидуально с getValues().
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...