Мой гуглскрипт рассылает дубликаты писем - PullRequest
0 голосов
/ 23 апреля 2019

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

function sendHTMLTEMP(arr,x){
var ss = 
SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Current Point 
 Totals");
 var column = ss.getRange('B:B');
 var values = column.getValues(); // get all data in one call
 var x = 0;
 while (values[x][0] != "" ) {
  x++; 

if(ss.getRange(x,9).getValue() !=='' && 
  ss.getRange(x,13).getValue() 
 !== 'Sent'){
 var email = ss.getRange(x,10).getValue();
 var expert = ss.getRange(x,2).getValue();
 var manager = ss.getRange(x, 4).getValue();
 var glm = ss.getRange(x, 11).getValue();
 var warning = ss.getRange(x, 9).getValue();
 var points = ss.getRange(x,8).getValue();
 var admin = ss.getRange(x,12).getValue();
 var body = HtmlService.createHtmlOutputFromFile('Warning 
 Email').getContent().toString();

body = body.replace('%manager%',manager);
body = body.replace('%expert%',expert);
body = body.replace('%warning%',warning);
body = body.replace('%points%', points);
  try {
  MailApp.sendEmail({
    to: email,
    cc: glm,
    bcc: admin,
    subject: 'Action Required on NorthEast Tracker',
    htmlBody: body
  });

 ss.getRange(x, 13).setValue('Sent')   

  } catch(err) 
  {}
 }}}

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

Просто как продолжение - я смог решить эту проблему, изменив то, что вызвало запуск скрипта.

Лист контейнера был довольно интенсивно используемым листом, который заставлял скрипт запускаться каждые несколько секунд, что приводило к отправке дубликатов. С тех пор я изменил триггер на запуск каждые 30 минут и не видел дубликатов электронных писем для отправки.

TLDR: изменен триггер с «при изменении» на «управляемое время - каждые 30 минут»

0 голосов
/ 24 апреля 2019

Если вы отправляете это электронное письмо из формы отправки, это известная проблема. Иногда отправка формы запускается несколько раз только для одной новой строки в электронной таблице. Способ исправить это - таймерная блокировка, которая выбрасывает эти дополнительные представления, обычно достаточно 5 секундного ожидания, чтобы это исправить.

Оберните вашу функцию в это:

function onSubmit(){
    var lock = LockService.getScriptLock();
    try {
        lock.waitLock(5000); // wait 5 seconds for others' use of the code section and lock to stop and then proceed
    } catch (e) {
        Logger.log('Could not obtain lock after 5 seconds.');
        return HtmlService.createHtmlOutput("<b> Server Busy please try after some time <p>")
        // In case this a server side code called asynchronously you return a error code and display the appropriate message on the client side
        return "Error: Server busy try again later... Sorry :("
    }


///DO STUFF



    Utilities.sleep(3000);
    lock.releaseLock();
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...