Уведомление по электронной почте на основе значения ячейки. Невозможно применить функцию скрипта для всех строк - PullRequest
1 голос
/ 31 октября 2019

Я использую таблицы 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 голосов
/ 31 октября 2019

Обновление:

  • Как вы сказали в комментарии, вы хотите, чтобы электронное письмо отправлялось при редактировании ячейки инвентаря, и только если это отредактированное количество инвентаря ниже соответствующего минимума. Итак, здесь я обновляю свой ответ соответствующим образом.

Во-первых, я полагаю, вы уже сделали это, но поскольку функция использует 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
      });  
    }
  }
}

Как я уже сказал вкомментарий, если вы просто хотите отправить электронное письмо, не имеет смысла иметь много тем электронной почты, поэтому я жестко закодировал эту тему.

Что касается электронных писем, я предположил, что вы просто хотите, чтобы адрес электронной почты получал письмо, поэтому я также жестко запрограммировал его. Если вы хотите, чтобы все различные адреса электронной почты, найденные на вкладке «Уведомления», получали сообщения электронной почты обо всех продуктах, необходимо внести небольшое исправление в этот код. Скажите, если вам это нужно.

Кроме того, я вообще не использовал вашу вкладку уведомлений, я создал сообщение напрямую, используя скрипт. Я не уверен, что так полезно иметь лист «Правила уведомления». Большая часть его информации такая же, как и в инвентаре, и остальные данные (адрес электронной почты, в основном) могут быть легко включены туда. Но все, что вам подходит.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...