我正在使用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);
}
}
答案 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
});
}
}
}
正如我在评论中所说,如果您只想发送电子邮件,那么拥有许多电子邮件主题是没有意义的,因此我对该主题进行了硬编码。
关于电子邮件,我以为您只是想要一个电子邮件地址来接收电子邮件,因此我也对其进行了硬编码。如果要在“通知”选项卡中找到所有不同的电子邮件地址,以接收有关所有产品的电子邮件,则需要对该代码进行小的修复。告诉我是否需要您。
此外,我根本没有使用“通知”标签,而是直接使用脚本创建了消息。我不确定拥有“通知规则”表是否有用。它的大部分信息与清单中的信息相同,其余数据(基本上是电子邮件地址)可以轻松地包含在其中。但是,只要适合您。
我希望这会有所帮助。