【问题标题】:Prevent duplicate E-mail Google Spreadsheets script防止重复的电子邮件 Google 电子表格脚本
【发布时间】:2020-06-17 09:15:55
【问题描述】:

我目前能够使用 Google 电子表格脚本发送电子邮件。但是我的触发器和 if 条件并没有阻止我希望的电子邮件发送:

这是我的代码: '''

function myFunction() {

  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const ws = ss.getSheetByName("MASTER");

  const h3 = 'SPP Proyek JIS Tanggal xx dari xxx';
  const headers = ws.getRange("A2:M2").getValues();
  const item = headers[0][4];
  const spec = headers[0][5];
  const sat = headers[0][6];
  const qty = headers[0][7];
  const price = headers[0][8];
  const total = headers[0][9];
  const tujuan = headers[0][10];

  const lr = ws.getLastRow();

  const tableRangeValues = ws.getRange(3, 5,lr-2,7).getDisplayValues();
  const trigger = ws.getRange(3, 1,lr-2).getValues();
  const statusEmail = ws.getRange(3, 13,lr-2).getValues();

  const htmlTemplate = HtmlService.createTemplateFromFile("Email");
  htmlTemplate.h3 = h3;
  htmlTemplate.headers = headers;
  htmlTemplate.item = item;
  htmlTemplate.spec = spec;
  htmlTemplate.sat = sat;
  htmlTemplate.qty = qty;
  htmlTemplate.price = price;
  htmlTemplate.total = total;
  htmlTemplate.tujuan = tujuan;
  htmlTemplate.tableRangeValues = tableRangeValues;
  htmlTemplate.trigger = trigger;
  htmlTemplate.statusEmail = statusEmail;

  const htmlForEmail = htmlTemplate.evaluate().getContent();

  if ((trigger != 'FALSE') && (statusEmail != 'EMAIL_SENT')); {

  GmailApp.sendEmail(
    "sistem.jis@gmail.com", 
    "Approval SPP Komersial", 
    "HTML Support",
    { htmlBody: htmlForEmail }
   );

  ws.getRange(3, 13,lr-2).setValue('EMAIL_SENT');

}

'''

这是我的示例文件链接: https://docs.google.com/spreadsheets/d/13TKIhY7HmK3o-j98q45XXb2nwZzfYwyYn7EULhY_RJw/edit#gid=1216091331

看来我的触发器和条件代码有问题,我不明白

谢谢!

【问题讨论】:

    标签: javascript google-apps-script google-sheets gmail


    【解决方案1】:

    定义const trigger = ws.getRange(3, 1,lr-2).getValues(); 会返回一个[[FALSE], [true], [FALSE], [true]] 类型的数组

    • 要使您的代码正常工作,您需要定义一个循环来逐行(和触发器)逐行迭代
    • 另外,从if ((trigger != 'FALSE') && (statusEmail != 'EMAIL_SENT')); { 中删除;

    示例:

    function myFunction() {
    
      const ss = SpreadsheetApp.getActiveSpreadsheet();
      const ws = ss.getSheetByName("MASTER");
    
      const h3 = 'SPP Proyek JIS Tanggal xx dari xxx';
      const headers = ws.getRange("A2:M2").getValues();
      const item = headers[0][4];
      const spec = headers[0][5];
      const sat = headers[0][6];
      const qty = headers[0][7];
      const price = headers[0][8];
      const total = headers[0][9];
      const tujuan = headers[0][10];
      const lr = ws.getLastRow();
      const tableRangeValues = ws.getRange(3, 5,lr-2,7).getDisplayValues();
      var data = ws.getRange(3, 1,lr-2,13).getDisplayValues();
      for (var i = 0; i < data.length; i++){
        const trigger = data[i][0];
        const statusEmail = data[i][12];
    
        const htmlTemplate = HtmlService.createTemplateFromFile("Email");
        htmlTemplate.h3 = h3;
        htmlTemplate.headers = headers;
        htmlTemplate.item = item;
        htmlTemplate.spec = spec;
        htmlTemplate.sat = sat;
        htmlTemplate.qty = qty;
        htmlTemplate.price = price;
        htmlTemplate.total = total;
        htmlTemplate.tujuan = tujuan;
        htmlTemplate.tableRangeValues = tableRangeValues;
        htmlTemplate.trigger = trigger;
        htmlTemplate.statusEmail = statusEmail;
    
        const htmlForEmail = htmlTemplate.evaluate().getContent();
        Logger.log(trigger);
        if ((trigger != 'FALSE') && (statusEmail != 'EMAIL_SENT')) {
            GmailApp.sendEmail(
          "sistem.jis@gmail.com", 
          "Approval SPP Komersial", 
          "HTML Support",
          { htmlBody: htmlForEmail }
          );
    
          ws.getRange(3, 13,lr-2).setValue('EMAIL_SENT');
        }
      }
    }
    

    注意: 在这个示例中,我没有修改 tableRangeValues,因为这些值稍后会在您的客户端进行处理。根据您希望它们是什么样的,您可能还想通过 tem 进行迭代。

    【讨论】:

    • 你好 ziganotschka,谢谢你的回答。我尝试像这样定义每一行。但不会使用现有代码运行 'const startRow = 3;常量 getLastRow = 900; const dataRange = ws.getRange(startRow, 1, getLastRow, 13);常量数据 = dataRange.getValues(); for (var i = 0; i
    • 您能否编辑您的问题以包含您的新代码?会更容易可视化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-10
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 2020-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多