【问题标题】:How to email editors of a Google Sheet using App Script如何使用 App 脚本向 Google 表格的编辑者发送电子邮件
【发布时间】:2020-08-07 19:39:26
【问题描述】:

我正在尝试编写一个函数,该函数根据单元格的值向 Google 表格的编辑者发送电子邮件。我遇到了实现这一点的问题,并且希望得到一些建议。在某些情况下,表格是表格的后端,我们询问填写表格的人在我们的活动之前是否需要任何特殊的便利。

我能够成功设置向所有者发送电子邮件的功能。问题是“所有者”,也就是创建表单的人,只会制作表单而不是自己运行活动。

他们将管理活动的人员添加为编辑。因此,我希望脚本在与会者需要特殊住宿时通过电子邮件发送给编辑。

这是我给所有者发送电子邮件的内容:

function accommodateNotify() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Form Responses 1');
  var ownerEmail = ss.getOwner().getEmail();
  var startingRow = 6;
  Logger.log(ownerEmail);
  var name = ss.getName();
  Logger.log(name);
  var url = ss.getUrl();
  Logger.log(url);
    
  var lastRow = getLastNonEmptyRow(sheet.getRange(1, 83, sheet.getLastRow(), 1));
  Logger.log(lastRow);
  var needsAccommodation = sheet.getRange(lastRow, 83).getValue();
  Logger.log(needsAccommodation);
  var requiredAccommodation = sheet.getRange(lastRow, 85).getValue();
     
  if (needsAccommodation == "Yes") {
    var message = "An attendee for " + name + " " + " has stated they need accommodations. Please review: " +url;
    var subject = "Accommodation Request Alert";
    Logger.log("sending email...\n" + "  subject: " + subject + "\n  message: " + message);
    GmailApp.sendEmail(ownerEmail, subject, message);
  }
}

使用getEditors 的问题在于它返回一个数组(因为它们可能不止一个编辑器)。您对我将如何构建它以通过电子邮件发送给编辑有任何指导吗?

我设法把它放在一起,但由于某种原因它给编辑发了两次电子邮件......

function accommodateNotify() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Form Responses 1');
  var editors = ss.getEditors();
  for (var i = 0; i < editors.length; i++) {
    Logger.log(editors[i].getEmail());
    //var ownerEmail = ss.getOwner().getEmail();
    var startingRow = 2;
    var name = ss.getName();
    Logger.log(name);
    var url = ss.getUrl();
    Logger.log(url);
    var lastRow = getLastNonEmptyRow(sheet.getRange(1, 29, sheet.getLastRow(), 1));
    Logger.log(lastRow);
    var needsAccommodation = sheet.getRange(lastRow, 29).getValue();
    Logger.log(needsAccommodation);
    var requiredAccommodation = sheet.getRange(lastRow, 85).getValue();

    if (needsAccommodation == "Yes") {
      var message = "A student for " + name + " " + " has stated they need accommodations. Please review: " +url;
      var subject = "Accommodation Request Alert";
      Logger.log("sending email...\n" + "  subject: " + subject + "\n  message: " + message);
      GmailApp.sendEmail(editors, subject, message);
    }
  }
}

【问题讨论】:

  • 仔细检查for 循环的结束位置。如果您在循环中包含GmailApp.sendEmail(editors, ...),那么这就是您执行两次的原因。要么将 GmailApp.send 拉出 for 循环,要么在每次迭代时发送 editors[i] 电子邮件。

标签: email google-apps-script gmail google-apps-script-editor


【解决方案1】:

解决方案

根据我从您的问题中了解到的情况,您的问题是您想向编辑发送一封电子邮件,editors 是一个包含所有编辑的数组。另外,请注意GmailApp.sendEmail() 一次只能向一个收件人发送电子邮件。

在下面,我提议对您的脚本进行更改,遍历所有编辑器,以便能够向每个编辑器发送一封电子邮件。该代码具有不言自明的 cmets。

还要注意getEditors 返回一个用户对象,而不是电子邮件,因此必须使用getEmail() 获取这些对象。

if (needsAccommodation == "Yes") {
      var message = "A student for " + name + " " + " has stated they need accommodations. Please review: " +url;
      var subject = "Accommodation Request Alert";
      Logger.log("sending email...\n" + "  subject: " + subject + "\n  message: " + message);
      
      // iterate over all the editors that are in the array
      for(i=0;i<editors.length;i++){
      // send an email with the same message and subject to each of the editors
      GmailApp.sendEmail(editors[i].getEmail(), subject, message);
      }
    }

我希望这对您有所帮助。让我知道您是否需要其他任何内容,或者您​​是否不理解某些内容。 :)

【讨论】:

    猜你喜欢
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 2020-04-14
    • 1970-01-01
    • 2020-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多