首页 > 解决方案 > 基于单元格值的电子邮件通知。无法对所有行应用脚本功能

问题描述

我正在使用 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);
    }
}

标签: emailgoogle-apps-scriptgoogle-sheets

解决方案


更新:

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

首先,我猜您已经这样做了,但是由于该功能使用sendEmail,您必须授予授权才能使其工作。我为此创建了一个触发器。运行一次:

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

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

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

另外,我根本没有使用您的通知选项卡,我直接使用脚本创建了消息。我不确定拥有“通知规则”表是否有用。它的大部分信息与库存中的信息相同,其余数据(基本上是电子邮件地址)可以很容易地包含在其中。但无论什么适合你。

我希望这有任何帮助。


推荐阅读