Отправка электронной почты, когда ячейка редактируется с использованием электронной почты в параллельной ячейке - PullRequest
1 голос
/ 07 марта 2019

Я прочитал много сценариев onEdit и Triggers, но все еще не могу достичь того, чего хочу, я много пишу в Excel VBA, и Google лист очень сильно отличается.Итак, все основано на моем скриншоте, и я хочу отправить электронное письмо, когда ячейка содержит «Утверждено», «Отклонено», «Выполняется», а адрес электронной почты должен основываться на параллели отредактированной ячейки.Я умираю, чтобы сделать эту работу.enter image description here

Код основан на Интернете, но я не могу настроить его на основании моих данных / листа.

Ответы [ 3 ]

1 голос
/ 07 марта 2019

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

1 голос
/ 07 марта 2019

Вы можете добавить пользовательскую функцию в выпадающее меню в пользовательском интерфейсе электронных таблиц с помощью следующего сценария. Это позволит вам обойти ограничение onEdit (), которое не позволяет использовать класс MailApp, но за счет того, что пользователи вручную вызывают сценарий вместо автоматически запускаемого сценария.

Здесь пользователь выберет «Отправить E-Mail» из выпадающего меню и предложит ему / ей первичный ключ через модальное окно ввода. Строка соответствующего ключа будет идентифицирована, и электронное письмо будет отправлено после того, как статус автоматически изменится на «одобренный». В этом сценарии предполагается, что электронная таблица содержит как минимум четыре столбца со строками заголовков «Первичный ключ», «Описание», «Электронная почта» и «Статус» в любом порядке.

Обратите внимание: этот код был успешно протестирован. Обновите строки 20 и 21, заменив квадратные скобки и содержащийся в них текст, который определяет переменные sheetURL и workSheetName.

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('Custom Menu')
  .addItem('Send E-Mail', 'sendEmail')
  .addToUi();
}

function sendEmail(){

  // Display a dialog box with a title, message, input field, and "OK" and "Cancel" buttons. The
  // user can also close the dialog by clicking the close button in its title bar.
  var ui = SpreadsheetApp.getUi();
  var response = ui.prompt('Pop-Up Prompt', 'Please enter primary key:', ui.ButtonSet.OK_CANCEL);

  // Process the user's response.
  if (response.getSelectedButton() == ui.Button.OK) {
    Logger.log('The user entered the following primary key:', response.getResponseText());

    // Map the header rows in order that column position is not hard-coded.
    var sheetURL = '[ENTER YOUR SHEET URL HERE]';
    var workSheetName = '[ENTER YOUR WORKSHEET NAME HERE]';
    var sheet = SpreadsheetApp.openByUrl(sheetURL).getSheetByName(workSheetName);
    var lastColumn = sheet.getLastColumn();
    var headerRange = sheet.getRange(1, 1, 1, lastColumn);
    var headers = headerRange.getValues();

    for (var i=1; i<headers[0].length+1; i++) {
      switch (headers[0][i-1]){
        case "Primary Key":
          var primaryKeyIndex = i;
          break;
        case "Description":
          var descriptionIndex = i;
          break;
        case "Email":
          var emailIndex = i;
          break;
        case "Status":
          var statusIndex = i;
          break;
      }
    }
    // Header rows mapped.

    // Search for row corresponding to primary key.
    var primaryKey = response.getResponseText();
    var keyRow = findInColumn(columnToLetter(primaryKeyIndex), primaryKey);
    if (keyRow == -1){
      ui.alert('Primary Key "'+ primaryKey + '" not found.');
    } else {
      ui.alert('Primary Key "'+ primaryKey + '" found at row: ' +keyRow+ '.');
      sheet.getRange(keyRow, statusIndex).setValue("Approved");

      //Prepare Email
      var subject = "test";
      var email = sheet.getRange(keyRow, emailIndex).getValue();
      var body = "Hi, \n\n Your entry with primary key " + primaryKey + " is now approved.";
      MailApp.sendEmail(email, subject, body);

    }

  } else if (response.getSelectedButton() == ui.Button.CANCEL) {
    Logger.log('The user clicked cancel.');
  } else {
    Logger.log('The user clicked the close button in the dialog\'s title bar.');
  }
}

// Helper function to find corresponding row to data in column.
function findInColumn(column, data) {

  var sheet  = SpreadsheetApp.getActiveSpreadsheet();
  var column = sheet.getRange(column + ":" + column);  // like A:A

  var values = column.getValues(); 
  var row = 0;

  while ( String(values[row]) && String(values[row][0]) !== String(data) ) {
    row++;
  }

  if (String(values[row][0]) === String(data))
    return row+1;
  else 
    return -1;

}


// Helper function to convert Column Number to Column Letter
function columnToLetter(column){
  var temp, letter = '';
  while (column > 0)
  {
    temp = (column - 1) % 26;
    letter = String.fromCharCode(temp + 65) + letter;
    column = (column - temp - 1) / 26;
  }
  return letter;
}
0 голосов
/ 07 марта 2019

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

function onEdit() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var aSheet = ss.getActiveSheet();
  // check sheet name
  if (aSheet.getName() != 'Form Responses') return;

  var range = ss.getActiveRange();
  var row = range.getRow();
  var col = range.getColumn();
//  Logger.log(col);

  var headers = aSheet.getRange(1,1,1,aSheet.getLastColumn()).getValues()[0];
//  Logger.log(headers[col-1]);

  // check column header
  if (headers[col-1] != 'Status') return;

  var value = range.getValue();
  var values = ["approved", "denied", "in progress"]; // values to check for

  // check values
  if (values.indexOf(value.toString().toLowerCase()) == -1) return;

//  Logger.log(row);
  var rowValues = aSheet.getRange(row, 1, 1, aSheet.getLastColumn()).getValues()[0];
  Logger.log(rowValues);

  // change as necessary
  var recipient = rowValues[1]; // email is in 2nd column
  var body = 'Email body'; // create body
  var subject = 'Test'; // set subject

  // send email
  MailApp.sendEmail(recipient, subject, body);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...