使用并行单元格中的电子邮件编辑单元格时发送电子邮

问题描述 投票:1回答:3

我已经阅读了很多onEdit和Triggers脚本,但我仍然无法实现我想要实现的目标,我在excel VBA和google表中编写了很多代码是非常不同的。所以事情基于我的截图,我想要的是在单元格包含“已批准”,“已拒绝”,“正在进行”并且电子邮件地址必须基于已编辑单元格的并行时发送电子邮件。我很想完成这项工作。 enter image description here

该代码基于互联网,但我无法根据我的数据/表进行调整。

google-apps-script google-sheets
3个回答
1
投票

您可以使用以下脚本将自定义函数添加到Spreadsheets UI中的下拉菜单中。这将允许您绕过不允许使用MailApp类的onEdit()限制,但这是以让用户手动调用脚本而不是自动运行的脚本为代价的。

在这里,用户将从下拉菜单中选择“发送电子邮件”,它将通过输入提示模式提示他/她输入主键。将识别相应密钥的行,并在状态之后发送的电子邮件自动更改为“已批准”。此脚本假定电子表格包含至少四列,其中包含任何顺序的标题行“主键”,“描述”,“电子邮件”和“状态”。

请注意:此代码已成功测试。请通过替换定义sheetURL和workSheetName变量的方括号和其中包含的文本来更新第20行和第21行。

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;
}

1
投票

我建议您不要使用onEdit触发器发送电子邮件。我认为它被许多用户过度使用。如果你是,你将不得不使用installable triggers。这是一个看起来非常干净的example email solution昨天来了。


0
投票

您可以使用以下大部分代码。修改电子邮件部分以满足您的需求。此代码检查工作表名称为“表单响应”,并将编辑的列标题检查为“状态”,如上所示。

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.