来自Google工作表的单元格值的电子邮件通知

时间:2014-09-22 21:32:27

标签: google-apps-script google-sheets

我正在创建一个Google表格,用他们的名字,姓氏,职位和部门输入新员工,然后在添加新员工时通过该信息生成一封电子邮件。

我已创建此代码,以便在编辑行(dept)中的最后一个单元格时触发电子邮件,并且我想生成一封电子邮件,其中包含前两个单元格的值(名字,姓氏)在受试者和身体中的所有4个细胞(第一个,最后一个,标题,部门)。

但有些事情不太正确,我为Rowdata收到了“未定义”的错误。有什么建议吗?

function sendNotificationNEWpersons() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
//Get Active cell
  var mycell = ss.getActiveSelection();
  var cellcol = mycell.getColumn();
  var cellrow = mycell.getRow();
  var rowData = sheet.getRange(cellrow, sheet.getLastColumn()).getValues();
//Defined Notification Details
  var recipients = "xxxx@gmail.com";
  var subject = "NEW EMPLOYEE: " + rowData[0][4] + rowData[0][5] + "(Row " + mycell.getRow() + ")";
  var body = rowData[4] + rowData[5] + "has just been added to the NewPersons sheet on Row " + mycell.getRow() + " To view them, visit: " + ss.getUrl();
//If column 5 isn't empty in NewPersons sheet
  if (cellcol == 5 && sheet.getName() == "NewPersons" && mycell.getValue() !=-1)
  {
//Send the Email
  MailApp.sendEmail(recipients, subject, body);
  }
//End sendNotification
  }

1 个答案:

答案 0 :(得分:2)

因此,您的代码中存在一些导致未定义错误的错误。首先,您只使用单个单元格的内容填充rowData,而不是您可能想要的整行。其次,在设置主题和正文变量的值时,你是错误地处理了rowData变量。

假设您的行数据被放置在电子表格的AD列中,而rowData变量只应包含一个包含4列的行(对应于该名称中的名字,姓氏,标题和部门),这里是您的代码的固定版本:

function sendNotificationNEWpersons() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();

  var mycell = ss.getActiveSelection();
  var cellcol = mycell.getColumn();
  var cellrow = mycell.getRow();

  // Get the full row of data, not just one cell
  var rowData = sheet.getSheetValues(cellrow, 1, 1, sheet.getLastColumn());
  // rowData is now a 2D array of Object (cell values), with a single row
  // and sheet.getLastColumn() columns

  // Here, only including the first and last names in the email
  var recipients = "xxxx@gmail.com";
  var subject = "NEW EMPLOYEE: " + rowData[0][0] + " " + rowData[0][1] +
      "(Row " + mycell.getRow() + ")";
  var body = rowData[0][0] + " " + rowData[0][1] + 
      "has just been added to the NewPersons sheet on Row " + 
      mycell.getRow() + " To view them, visit: " + ss.getUrl();

  //If column 5 isn't empty in NewPersons sheet
  if (cellcol == 5 && sheet.getName() == "NewPersons" &&
      mycell.getValue() !=-1) {
    //Send the Email
    MailApp.sendEmail(recipients, subject, body);
  }
}

代码将避免您看到的错误。但是,这种解决方案可能不是最好的设计。您没有指定如何调用此函数(您可能正在使用菜单控件或onEdit触发器或其他函数) - 取决于当前选择的单元格位于最新人员行并且位于列中的假设5可能不正确。

以下是您可能需要考虑的其他一些设计:

  1. 使用Google表单。您可以使用(名字,姓氏,标题,部门)文本字段创建表单。然后,您可以为该表单提供onFormSubmit(e)触发器,以便在提交新条目时向收件人发送电子邮件(form submit event object包含输入到表单中的所有数据)。从那时起,可以直接将新员工输入表单,并将数据放在表单响应电子表格中;触发器将处理电子邮件。
  2. 创建侧边栏。您可以为电子表格设计一个用户可以输入数据的侧边栏,并包含一个“添加员工”按钮,将该数据写入电子表格,发送电子邮件并执行其他任何需要执行的操作。这种方法实际上与使用Google表单相同,但更具可定制性,在技术上更具挑战性。您可以查看Build an Add-on Quickstart示例代码,了解如何构建工作侧边栏。
  3. 正确使用onEdit(e)次触发器。如果您设置电子表格onEdit(e)触发器,则可以查询事件以确定编辑了哪个单元格。您可以使用该信息来确定您所在的行和列,而无需使用ss.getActiveSelection()。请注意,这种方法并不理想,因为onEdit(e)会在电子表格中的任何单元格被编辑时触发,因此它需要您在执行其余触发器之前仔细验证编辑的单元格位置是否合适。