基于单元格值的电子邮件通知。无法对所有行应用脚本功能

时间:2019-10-31 09:54:59

标签: email google-apps-script google-sheets

我正在使用Google表格和Google脚本编辑器来创建一个脚本,以在每次产品数量低于最低库存水平时自动向自己发送电子邮件。由于我有多种产品的最低库存水平不同,因此我希望收到一系列电子邮件,每行一封。

我将一张纸用于实际的库存数据,而另一张纸包含用于引用脚本的信息,例如我的电子邮件以及要包含在电子邮件中的消息。

我成功地发送了一封电子邮件,该电子邮件从清单工作表的第一行发送了收集数据,但是我无法将其应用于随后的所有行。 我尝试将.getRange("F2")更改为.getRange("F2:F"),然后每当其中一种产品的最低库存水平低于最低水平时,我都会收到一封包含所有产品信息的电子邮件,无论其数量是否低于是否达到最低水平。

理想的解决方案是一封电子邮件,其中包含有关所有数量少于最小数量的产品的所有信息。

这是我的电子表格的链接:https://docs.google.com/spreadsheets/d/1ZHmBvi8ZeaDRYq6Qigaw08NUiOwZumPrLnvnka_mgmA/edit?usp=sharing

当前脚本:

function CheckInventory() {
  // Fetch inventory quantity
  var InventoryRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Inventory").getRange("F2"); 
  var Inventory = InventoryRange.getValue();

   // Fetch minimum quantity
  var MinimumQuantityRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Inventory").getRange("D2");
  var MinimumQuantity = MinimumQuantityRange.getValue();

  // Check Inventory
  if (Inventory < MinimumQuantity){
    // Fetch email address
    var emailRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Notification Rules").getRange("E2");
    var emailAddress = emailRange.getValues();

    // Fetch email message details.
    var detailsRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Notification Rules").getRange("G2");
    var details = detailsRange.getValues();
    var subjectdetailsRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Notification Rules").getRange("H2");
    var subjectdetails = subjectdetailsRange.getValues(); 

    // Send Alert Email.
    var message = details;
    var subject = subjectdetails;
    MailApp.sendEmail(emailAddress, subject, message);
    }
}

1 个答案:

答案 0 :(得分:0)

更新:

  • 正如您在评论中所说,您希望在编辑库存单元时发送电子邮件,并且仅当此编辑的库存数量低于相应的最小值时。因此,我在这里相应地更新我的答案。

首先,我想您已经完成了此操作,但是由于该函数使用了sendEmail,因此您必须grant authorization才能正常工作。我为此创建了一个触发器。运行一次:

function createEditTrigger() {
  var ss = SpreadsheetApp.getActive();
  ScriptApp.newTrigger("CheckInventory")
    .forSpreadsheet(ss)
    .onEdit()
    .create();
}

然后,此功能将在每次编辑电子表格时运行。为了避免每次编辑文件时都发送电子邮件,我们需要一个条件来检查所编辑的单元格是否为库存,并且该库存是否低于最小值:

function CheckInventory(e) {
  var ss = e.source;
  var inventorySheet = ss.getSheetByName("Inventory");
  var rowIndex = e.range.getRow();
  var columnIndex = e.range.getColumn();
  var numCols = 6;
  var row = inventorySheet.getRange(rowIndex, 1, 1, numCols).getValues()[0];
  var editedInventory = row[5];
  var editedMinimum = row[3];
  var sheetName = ss.getActiveSheet().getName();
  // Checking that: (1) edited cell is an inventory quantity, and (2) Inventory is below minimum
  if(editedInventory <= editedMinimum && sheetName == "Inventory" && columnIndex == 6 && rowIndex > 1) {
    var inventoryValues = inventorySheet.getDataRange().getValues();
    var emailBody = "";
    for(var i = 1; i < inventoryValues.length; i++) {
      var inventory = inventoryValues[i][5];
      var minimum = inventoryValues[i][3];
      if(inventory <= minimum) {
        var productName = inventoryValues[i][0] + " " + inventoryValues[i][1];
        var productUnits = minimum + " " + inventoryValues[i][4];
        var messagePart1 = "Inventory for " + productName + " has gone under " + productUnits + ". ";
        var messagePart2 = "Organise purchase order. Inventory as of today is: " + inventory + " " + inventoryValues[i][4];
        var message = messagePart1.concat(messagePart2);
        var newItem = "<p>".concat(message, "</p>");
        emailBody += newItem;
      }
    }
    var emailSubject = "Low inventory alert";
    var emailAddress = "your-email@your-domain.com";
    // Send Alert Email
    if(emailBody != "") {
      MailApp.sendEmail({
        to: emailAddress,
        subject: emailSubject,
        htmlBody: emailBody
      });  
    }
  }
}

正如我在评论中所说,如果您只想发送电子邮件,那么拥有许多电子邮件主题是没有意义的,因此我对该主题进行了硬编码。

关于电子邮件,我以为您只是想要一个电子邮件地址来接收电子邮件,因此我也对其进行了硬编码。如果要在“通知”选项卡中找到所有不同的电子邮件地址,以接收有关所有产品的电子邮件,则需要对该代码进行小的修复。告诉我是否需要您。

此外,我根本没有使用“通知”标签,而是直接使用脚本创建了消息。我不确定拥有“通知规则”表是否有用。它的大部分信息与清单中的信息相同,其余数据(基本上是电子邮件地址)可以轻松地包含在其中。但是,只要适合您。

我希望这会有所帮助。