使用 Google 个工作表中列中的电子邮件地址发送电子邮件

Send an email using email addresses from a column in Google sheets

我正在尝试创建代码,使用 google sheet 中特定列的地址发送电子邮件。我希望代码在 sheet 被其他用户编辑后发送电子邮件。例如,某人在 sheet 中的一行中输入了一个请求 - 然后一封电子邮件将发送给该​​请求的经理。这是我目前所拥有的...

function SendEmail(){
// Fetch the email address
var emailRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("HLP REQUESTS").getRange("K:K");
var emailAddress = emailRange.getValues()[0][0];
// Send Alert Email.
var message = 'A request has been submitted for professional learning related to an HLP you champion.  Please check the Design Team Notes document in case follow-up is required.'; // Second column
var subject = 'HLP Request for Professional Learning';
MailApp.sendEmail(emailAddress, subject, message);
}

当我 运行 上面的代码出现错误时 - 异常:发送电子邮件失败:没有收件人。 K 列中有一个有效的电子邮件地址,所以我有点困惑。

如果您想从 K 列的最后一个单元格中获取电子邮件地址,可以这样做:

function SendEmail(){
  var emailRange = SpreadsheetApp.getActiveSpreadsheet()
    .getSheetByName("HLP REQUESTS").getRange("K:K");

  var emailAddress = emailRange.getValues()
    .flat()           // convert a 2d array into a flat array
    .filter(String)   // remove empty elements from the array
    .pop();           // get the last element from the array

  var message = 'A request has been submitted for professional learning related to an HLP you champion.  Please check the Design Team Notes document in case follow-up is required.';
  var subject = 'HLP Request for Professional Learning';

  MailApp.sendEmail(emailAddress, subject, message);
}

更新

这是带有可安装触发器 onEdit 的完整实现,它会在选中复选框(L 列)后立即发送电子邮件:

// global variables
var SS = SpreadsheetApp.getActiveSpreadsheet(); // get the srpreadsheet
var checkbox_col = 12;                          // column with checkboxes (L in this case)

// the main function
function sendEmail(e) {
  try {
    var {rowStart, columnStart} = e.range;   // get row and column of the cell that was edited
    if (columnStart != checkbox_col) return; // do nothing if it was not column with checkboxes
    if (e.value != 'TRUE') return;           // do nothing if the checkboxs was unchecked
    e.range.setValue(false);                 // else uncheck the chekbox
        
    var sheet = SS.getSheetByName('HLP REQUESTS');                // get the sheet
    var emailAddress = sheet.getRange('K' + rowStart).getValue(); // get email addres from current row, column K

    var message = 'A request has been submitted for professional learning related to an HLP you champion. Please check the Design Team Notes document in case follow-up is required.';
    var subject = 'HLP Request for Professional Learning';

    MailApp.sendEmail(emailAddress, subject, message);       // send the message
    SS.toast('Email to ' + emailAddress + ' has been sent');
  } 
  catch(e) { SpreadsheetApp.getUi().alert(e) }
}


// additional functions -------------------------------------------------------------------------

// insatll the trigger
function install_onEidt_trigger() {
  ScriptApp.newTrigger('sendEmail').forSpreadsheet(SS).onEdit().create();
  SS.toast('Trigger was installed');
}

// remove all triggers
function remove_all_triggers() {
  ScriptApp.getProjectTriggers().forEach(t => ScriptApp.deleteTrigger(t));
  SS.toast('All triggers were remoded');
}

// custom menu to install and remove triggers
function onOpen() {
  SpreadsheetApp.getUi().createMenu('⚙️ Scripts')
  .addItem('Install trigger', 'install_onEidt_trigger')
  .addItem('Remove all triggers', 'remove_all_triggers')
  .addToUi();
}

要让它发挥作用,您需要:

  • 重新加载传播sheet(或手动运行函数onEdit())获取自定义菜单脚本
  • 自定义菜单运行项安装触发器
  • 之后,每当用户单击 L 列中的复选框时,它将尝试将消息发送到当前行 K 列中的地址

我的测试 sheet 看起来像这样:

发送电子邮件

function SendEmail() {
  const ss = SpreadsheetApp.getActive();
  const rsh = ss.getSheetByName("HLP REQUESTS");
  const emails = rsh.getRange("K1:K" + rsh.getLastRow()).getDisplayValues().flat();
  var message = 'A request has been submitted for professional learning related to an HLP you champion.  Please check the Design Team Notes document in case follow-up is required.';
  var subject = 'HLP Request for Professional Learning';
  emails.forEach(e => {
     MailApp.sendEmail(e, subject, message);
  });
}

如果您希望将其附加到 onEdit,您将不得不重新考虑该过程,因为 onEdit 触发器会在对任何 sheet 的每次编辑时触发,并且很可能您将需要使用可安装的 onEdit,以便您可以执行需要许可的操作。我建议您试用一下 onEdit 简单触发器。查看事件对象,看看有什么可以以低开销成本获得。