在 Google 脚本上使用 Mailapp 进行 OnEdit

OnEdit with Mailapp on Google Script

我有一个 Google 电子表格,其中包含 4 列,包括产品、销售人员、类别和状态。我想要达到的是每当用户在状态列上选择是选项并且如果该产品类别也是 G,则使用 MailApp 发送电子邮件。 电子邮件还应包含产品价值。

到目前为止,我可以发送电子邮件。但是我对这里的偏移概念真的很困惑,无法在电子邮件中发送产品

电子表格:https://docs.google.com/spreadsheets/d/1wVr0SGryNNvorVdDZEY1E6UDgh25_A5A2LhN1UNbIHE/edit?usp=sharing

function onEdit() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var sheetName = sheet.getName();
  var r = sheet.getActiveCell();
  var cell = sheet.getActiveCell().getA1Notation();
  if(ss.getActiveCell().getColumn() !== 5) return;//
  var row = sheet.getActiveRange().getRow();
  var cellvalue = sheet.getActiveCell().getValue().toString();
  var prod = sheet.getRange().offset(0, -2).getValues();
  var cat = cellvalue.offset(0, -1).getValues();
  var recipients = "email@email.com";
  var message = '';
  if(cellvalue === 'Yes' && cat === 'G') { 
    message = cell + ' in Sheet ' + sheetName + ' was changed to YES.';
    var subject = 'Cell Changed to YES';
    var body = message + ss.getUrl() + ' to view the changes' + prod;
    MailApp.sendEmail(recipients, subject, body);
   }

}

使用通过 onEdit event 传递的对象可能比操纵活动单元格和偏移量更容易。

此事件对象为您提供了新值,因此您可以检查它是否是您想要的值 ('Yes')。它还为您提供了已编辑的范围,因此您可以使用它来检查更改是否在正确的列 ('D') 中并获取已修改的行。获得该行后,您可以使用它来获取该行中其他列('Products' 和 'Cat')的值。

像这样的东西应该可以工作:

function onEdit(event) {
  const statusColumnNumber = 4; // Indices of rows and columns start from 1, so column D is 4.
  if (event.range.getColumn() === statusColumnNumber && event.value === 'Yes') {
    const sheet = event.range.getSheet();
    const rowValues = sheet.getRange(event.range.getRow(), 1, 1, sheet.getLastColumn()).getValues().flat();
    const categoryColumnIndex = 2; // Indices of JavaScript arrays start from 0, so column C is in position 2 of the array.

    if (rowValues[categoryColumnIndex] === 'G') {
      const prodColumnIndex = 0;
      const prodValue = rowValues[prodColumnIndex];
      const recipients = "email@email.com";
      const subject = 'Cell Changed to YES';
      const message = event.range.getA1Notation() + ' in Sheet ' + sheet.getName() + ' was changed to YES. ' 
      const body = message + '\n' + sheet.getParent().getUrl() + ' to view the changes for ' + prodValue;

      MailApp.sendEmail(recipients, subject, body);
    }
  }
}

如您问题的评论中所述,由于您使用的服务需要权限(MailApp), you'll need to create an installable trigger 调用此函数。