【问题标题】:Inventory Reminders with Google Apps Scripts使用 Google Apps 脚本的库存提醒
【发布时间】:2021-09-13 20:32:41
【问题描述】:

刚开始学习Javascript/Google Apps Script,请耐心等待。

我的目标是创建一个自动电子邮件脚本,当库存低于某个水平时,它会通过电子邮件发送提醒。

首先,我有一个带有 3 个选项卡的 Google 表格:ContactSheet、ReorderSheet 和 EmailSheet。这些选项卡有列,分别是:人名和电子邮件地址;项目名称、编号、制造商、当前库存和重新订购阈值;主题行和消息。

代码如下。没有运行时错误,但电子邮件要么不发送,要么仅针对电子表格中的第一项或最后一项发送。 (应该为 5 个不同的项目发送 5 封电子邮件。)我认为问题出在 if 语句上——我假设变量无法调用它们各自的索引,如果这有意义的话。我尝试将变量转换为数组但没有成功。根据记录器,这个版本效果最好,并且只在最后一个块发生故障。

提前致谢。

function sendEmail() {
  var Spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var ContactSheet = Spreadsheet.getSheetByName('ContactSheet');
  var ReorderSheet = Spreadsheet.getSheetByName('ReorderSheet');
  var EmailSheet = Spreadsheet.getSheetByName('EmailSheet');
  
  var SubjectLine = EmailSheet.getRange(2,1).getValue();
  var Message = EmailSheet.getRange(2,2).getValue();
  
  var N = ReorderSheet.getLastRow();
  
  for(var i = 2; i < N+1; i++) {
    var ItemName = ReorderSheet.getRange(i,1).getValue();
    var ItemNumber = ReorderSheet.getRange(i,2).getValue(); 
    var ItemManufacturer = ReorderSheet.getRange(i,3).getValue();
    var ItemStock = ReorderSheet.getRange(i,4).getValue();
    var ItemReorder = ReorderSheet.getRange(i,5).getValue();}

  var M = ContactSheet.getLastRow();
  
  for(var j = 2; j < M+1; j++) {
    var Name = ContactSheet.getRange(j,1).getValue();
    var EmailAddress = ContactSheet.getRange(j,2).getValue();} 
  
  if (ItemStock < ItemReorder) {
    SubjectLine = SubjectLine.replace("<item>",ItemName);
    Message = Message.replace("<name>",Name).replace("<item>",ItemName).replace("<itemnumber>",ItemNumber).replace("<manufacturer>",ItemManufacturer);
    MailApp.sendEmail(EmailAddress, SubjectLine, Message);}
}

【问题讨论】:

  • 不确定你的意思。我正在访问的电子表格是由我为库存 (ReorderSheet) 创建的,另外两个选项卡是为设置此脚本而创建的。没有从脚本写入工作表。
  • 你做了什么来调试它?
  • 你如何确定你应该在联系表的哪一行?也许您希望将每封电子邮件发送给联系表中的所有联系人。
  • 是的,我想将电子邮件发送给所有联系人。尝试嵌套 for/if,将 vars 更改为数组,并使用 do/while。同样,刚开始学习,所以这些尝试可能没有用。

标签: javascript for-loop if-statement google-apps-script inventory-management


【解决方案1】:

这个for循环不包含sendEmail方法:

for (var i = 2; i < N + 1; i++) {
    var ItemName = rsh.getRange(i, 1).getValue();
    var ItemNumber = rsh.getRange(i, 2).getValue();
    var ItemManufacturer = rsh.getRange(i, 3).getValue();
    var ItemStock = rsh.getRange(i, 4).getValue();
    var ItemReorder = rsh.getRange(i, 5).getValue();
  }

所以你总是只处理最后一行的数据

和这个一样:

for (var j = 2; j < M + 1; j++) {
    var Name = csh.getRange(j, 1).getValue();
    var EmailAddress = csh.getRange(j, 2).getValue();
  }

此结构将向每个电子邮件地址发送电子邮件:

function sendEmail() {
  var ss = SpreadsheetApp.getActive();
  var csh = ss.getSheetByName('ContactSheet');
  var rsh = ss.getSheetByName('ReorderSheet');
  var esh = ss.getSheetByName('EmailSheet');
  var subject = esh.getRange(2, 1).getValue();
  var message = esh.getRange(2, 2).getValue();
  var N = rsh.getLastRow();
  var M = csh.getLastRow();
  for (var j = 2; j < M + 1; j++) {
    var Name = csh.getRange(j, 1).getValue();
    var EmailAddress = csh.getRange(j, 2).getValue();
    for (var i = 2; i < N + 1; i++) {
      var ItemName = rsh.getRange(i, 1).getValue();
      var ItemNumber = rsh.getRange(i, 2).getValue();
      var ItemManufacturer = rsh.getRange(i, 3).getValue();
      var ItemStock = rsh.getRange(i, 4).getValue();
      var ItemReorder = rsh.getRange(i, 5).getValue();
      if (ItemStock < ItemReorder) {
        subject = subject.replace("<item>", ItemName);
        message = message.replace("<name>", Name).replace("<item>", ItemName).replace("<itemnumber>", ItemNumber).replace("<manufacturer>", ItemManufacturer);
        MailApp.sendEmail(EmailAddress, subject, message);
      }
    }
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多