【问题标题】:Google Apps Script - Send Email based on value in cellGoogle Apps 脚本 - 根据单元格中的值发送电子邮件
【发布时间】:2020-12-10 14:09:04
【问题描述】:

我是 Google App Scripts 的新手,有一个包含三列的电子表格:姓名、逾期和上次联系时间:https://docs.google.com/spreadsheets/d/1W04JiFZwpGCD-qddUkNJ9xQ1xiYwZnGhissudF1EvxM/edit?usp=sharing

我想向自己发送一封电子邮件提醒,其中包含 B 列中值过期的任何人的姓名。

到目前为止,我只能为第 2 行编写一个向自己发送电子邮件的脚本。我不知道如何让脚本循环遍历 B 列中的值。

这是我的脚本:

function sendEmail() {
  
  var overdueRange = SpreadsheetApp.getActiveSpreadsheet().getRange("B2"); 
  var overdueValue = overdueRange.getValue();
  if (overdueValue === "Overdue"){
    var nameRange = SpreadsheetApp.getActiveSpreadsheet().getRange("A2");
    var name = nameRange.getValues();
    var message = 'Reach out to ' + name 
    var subject = 'Reach out to this person.'
    MailApp.sendEmail('myemail@email.com', subject, message);
    }
}

sendEmail()

【问题讨论】:

  • 你这样调用sendEmail 两次。还要小心getValues,它返回一个二维数组。同样通过这种方式,您正在请求活动工作表。而是指定工作表名称。如果您打算使用这样的活动工作表,这将无法用作时间驱动的触发功能。整理完所有这些之后,您可以考虑如何创建循环。

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


【解决方案1】:

解释:

只需几点说明流程即可:

  • 我假设您正在从脚本编辑器执行sendEmail()。这样,由于您在函数之外还有sendEmail(),因此您最终将调用sendEmail() 两次。移除函数的“全局”调用,只在脚本编辑器中调用sendEmail()

  • 不建议在spreadsheet 对象上应用getRange。通过名称或位置定义特定工作表。在下面的示例脚本中,我通过其名称 (Sheet1) 定义工作表。将该名称更改为您的实际情况。

  • 您的代码中的name 是一个二维数组,而不是单个值。请小心,因为这不是正确的做法。

  • 在下面的脚本中,我定义了一组列 AB。名称在A 列中定义,过期状态在B 列中定义。通过这种方式,您可以迭代此数组,并通过访问数组本身在每次迭代中获取单个值。我使用了forEach,但请随意使用您自己的迭代方法。

解决方案:

function sendEmail() {
  const ss = SpreadsheetApp.getActive();
  const sh = ss.getSheetByName('Sheet1'); // change Sheet1 to the name of your sheet
  const data = sh.getRange('A2:B'+sh.getLastRow()).getValues();
  data.forEach(r=>{
     let overdueValue = r[1];  
     if (overdueValue === "Overdue"){
         let name = r[0];
         let message = 'Reach out to ' + name;
         let subject = 'Reach out to this person.'
         MailApp.sendEmail('myemail@email.com', subject, message); 
     }
  });  
}

适用于脚本的工作表:

【讨论】:

  • 这完美无瑕。为我糟糕的代码道歉,我已经习惯了 JS 并且在理解 Google App Scripts 时遇到了一些困难。您对我可以在哪里阅读它有什么建议吗?
  • @Dpuiatti 没有理由道歉并忽略投票失败和负面反馈。我们都在这里学习。我建议您从 here 开始了解基础知识,然后您可以使用其他资源,例如 youtube/stackoverflow 等。除非作者是该领域的专家,否则我会避免使用在线博客。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-07
  • 1970-01-01
  • 2020-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多