Google App Scripts OnEdit Trigger Справка, чтобы избежать «слишком много одновременных вызовов» - PullRequest
0 голосов
/ 27 июня 2019

Я использую листы Google, чтобы отслеживать детали программы и отправлять электронные письма на основе информации в листе. Каждая вкладка листа Google имеет 3-5 различных электронных писем, которые можно отправить. Электронные письма контролируются простым скриптом и триггером onEdit, который ищет «Отправить!» быть выбранным в столбце, а затем отправляет соответствующее письмо. Проблема заключается в том, что при быстром внесении большого количества изменений в лист все разные триггеры срабатывают, и сценарий приложения завершается ошибкой с сообщением об ошибке «Служба использует слишком много компьютерного времени в течение одного дня» или «Слишком много одновременных вызовов». После того, как эти пределы скрипта приложения Google достигнуты, для сброса потребуется 24 часа.

В прошлом я добавлял «Utilities.sleep (2000)» с разными временными интервалами, чтобы избежать «слишком много одновременных ...», но это только тратило больше времени выполнения и приводило меня к «слишком большому времени компьютера». .." ошибка. Итак, как я могу изменить код скрипта или триггеры, чтобы все еще работать, когда "Отправить!" выбран в таблице, но не испытываете тайм-ауты этих других листов Google?

Заранее благодарю за любую помощь.

Вот пример одного из сценариев электронной почты. Триггеры относятся к типу «при редактировании».

function SendDD01Confirmation() {

  Utilities.sleep(1000)

  var sheetNameToWatch = "DD";
  var columnNumberToWatch = 24; // column A = 1, B = 2, etc.
  var valueToWatch = "Send!";

  var emailAddressColumn = 5;
  var namecolumn = 3;
  var datecolumn = 1;
  var datewrittencolumn = 6;
  var schoolcolumn = 2;
  var timescolumn = 7;

  var statuscolumn = 25;  
  var statusValue = "✓";

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getActiveCell();

  var emailAddress = sheet.getRange(range.getRow(), emailAddressColumn).getValue();
  var name = sheet.getRange(range.getRow(), namecolumn).getValue();
  var date = sheet.getRange(range.getRow(), datecolumn).getValue();
  var datewritten = sheet.getRange(range.getRow(), datewrittencolumn).getValue();
  var school = sheet.getRange(range.getRow(), schoolcolumn).getValue(); 
  var times = sheet.getRange(range.getRow(), timescolumn).getValue();

  var status = sheet.getRange(range.getRow(),statuscolumn)  

  var emailSubject = "Program has been scheduled for " +date+ "!";

  var body = "Program is coming to your class! You are scheduled to receive a one-hour presentation on " +datewritten+ " at " +school+ ", with the following time(s):\n \n" +times+ "\n (Rest of email removed for brevities sake)";

  if (sheet.getName() == sheetNameToWatch && range.getColumn() == columnNumberToWatch && range.getValue() == valueToWatch) {
       GmailApp.sendEmail(emailAddress, emailSubject, body)
       status.setValue(statusValue);

       }                                                                                                                                                                                                                                                  

}

1 Ответ

1 голос
/ 27 июня 2019

Попробуйте так:

Вы делаете в своем коде много вещей, которые вам не нужны.Во-первых, поместите код, который проверяет правильный лист, прямо вверху, чтобы вам не приходилось делать кучу бесполезных объявлений.Во-вторых, получить все данные за один раз, как я это делал с getValues ​​(), и было бы предпочтительнее не использовать промежуточные переменные для значений данных, а вместо этого просто использовать фактические элементы данных, такие как data [0] [1] и т. Д..

function SendDD01Confirmation(e) {
  var sh=e.range.getSheet();
  var n=sh.getName();
  if(n!="DD")return;//This is preferable close to the beginning of the function
  var statusValue = "✓";
  var data=sheet.getRange(e.range.rowStart,1,1,25).getValues();
  var emailAddress = data[0][4];//it would be better to remove these intermediate variables as well but it's a bit more difficult to trouble shoot.
  var name = data[0][2];
  var date = data[0][0];
  var datewritten = data[0][5];
  var school = data[0][1];
  var times = data[0][6];
  var status = data[0][24];
  var emailSubject = "Program has been scheduled for " +date+ "!";
  var body = "Program is coming to your class! You are scheduled to receive a one-hour presentation on " +datewritten+ " at " +school+ ", with the following time(s):\n \n" +times+ "\n (Rest of email removed for brevities sake)";
  if (e.range.columnStart == 24 && e.value == "Send!") {
    GmailApp.sendEmail(emailAddress, emailSubject, body);
    sh.getRange(e.range.rowStart,25).setValue(statusValue);
  }                                                                                                                                                                                                                                                  
}

Вы, вероятно, можете сократить это до:

function SendDD01Confirmation(e) {
  var sh=e.range.getSheet();
  var n=sh.getName();
  if(n!="DD")return;
  var statusValue = "✓";
  var data=sheet.getRange(e.range.rowStart,1,1,25).getValues();
  var emailAddress = data[0][4];//it would be better to remove these intermediate variables as well but it's a bit more difficult to trouble shoot.
  var emailSubject = "Program has been scheduled for " + data[0][0] + "!";
  var body = "Program is coming to your class! You are scheduled to receive a one-hour presentation on " + data[0][5] + " at " + data[0][1] + ", with the following time(s):\n \n" + data[0][6] + "\n (Rest of email removed for brevities sake)";
  if (e.range.columnStart==24 && e.value=="Send!") {
    GmailApp.sendEmail(emailAddress, emailSubject, body);
    sh.getRange(e.range.rowStart,25).setValue(statusValue);
  }                                                                                                                                                                                                                                                  
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...