【问题标题】:TypeError: Cannot read property "values" from undefined. (line 9, file "Code")TypeError:无法从未定义中读取属性“值”。 (第 9 行,文件“代码”)
【发布时间】:2014-10-19 20:31:44
【问题描述】:

function onInstall(e) {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Form');


  var Timestamp = e.values[0];
  var Load = e.values[1];
  var Email = e.values[2];
  var Location = e.values[3];

  var template = HtmlService.createHtmlOutputFromFile("notification");
  template.Location = Location;

  MailApp.sendEmail(Email, "subject", "", {
    HtmlBody: template.evaluate().getContent()
  });

}

我写了这个小程序。每次用户编辑电子表格。它应该运行触发器并向列中提到的电子邮件地址发送电子邮件。我不擅长编码。但是请帮我解决这个问题,我一直在尝试。

这里是公共电子表格Spreadsheet的链接

function() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetName('Form');
}

function onEdit(e) {
  var Timestamp = e.values[0];
  var Load = e.values[1];
  var Email = e.values[2];
  var Location = e.values[3];

  MailApp.sendEmail(Email, "check In Call", "location");

}

【问题讨论】:

  • 显然 onEdit 函数并没有像你想象的那样被调用,因为它没有被参数调用。请告诉我们在哪里调用/使用了 onEdit 函数。
  • @ValentinWaeselynck 请访问此链接以查看我的 onEdit 功能的屏幕截图drive.google.com/file/d/0B8oqG1tmIuPARkpwZU0wMW9RZDA/…

标签: javascript function triggers google-apps-script


【解决方案1】:

这个脚本没有运行的原因有很多。我没有修复错误,而是为您从头开始编写了 sn-p,我将尝试解释为什么它目前不能逐行运行。

首先,这是一些工作代码:

function onEdit(e) {
  var activateSheet = SpreadsheetApp.getActiveSpreadsheet();
  SpreadsheetApp.setActiveSheet(activateSheet.getSheetByName('Form'));
  var sheet = SpreadsheetApp.getActiveSheet();
  var row = e.range.getRowIndex();//Gets the row the change was made to.  

  var timestamp = sheet.getRange(row, 1).getValues(); //Gets the email
  var load = sheet.getRange(row, 2).getValues(); //Gets the email
  var email = sheet.getRange(row, 3).getValues(); //Gets the email
  var location = sheet.getRange(row, 4).getValues(); //Gets the email

  MailApp.sendEmail(email, "Check In Call", location);

}

“Load”和“Timestamp”字段似乎不是您想要的,但我还是把它们留了下来,因为也许您需要它们。

这里列出了一些对你没有用的东西:

  1. 您调用工作表的第一个函数在任何阶段都没有运行,因为没有触发器,并且它不会将激活的工作表传递给您的“onEdit”函数。
  2. 'getSheetName()' 用于检索工作表的名称,而不是按名称获取工作表。您实际寻找的方法是:'getSheetByName(name)'。
  3. e.value is only available if what's edited is a single cell,这不太可能基于您的电子表格。
  4. 即使 e.value 不是单个单元格,您也没有正确使用它,但这不是本问题的主题。

附带说明:我从语法错误中感觉到您不熟悉 Javascript。在尝试使用 Google Apps 脚本进行任何操作之前,我建议您先熟悉 Javascript,以避免在尝试完成简单操作时浪费大量时间并感到沮丧。

【讨论】:

  • 这个脚本正在运行。但它只是将最后一行作为电子邮件正文发送。我想要的是:当我更改位置列的数据时,它应该将“编辑的,新添加的数据”发送到写在“电子邮件列”中的电子邮件地址。这背后的原因是:我的工作是管理卡车位置。我有几个客户,每个客户都分配有一辆卡车。当卡车改变位置时,我需要通知我的客户。有了这个,我将创建一列电子邮件和相应的位置列。当卡车更改位置时,我将编辑该列并将自动电子邮件发送给客户。这将节省时间
  • 对.... 我对上面的代码进行了更改,它将获取已编辑的行,并发送一封包含该行详细信息的电子邮件。公平警告,无论您编辑哪一列,这都会发送一封电子邮件(包括电子邮件,或任何其他单元格)。但是,我认为这是对您提出的相当广泛的问题的回答。 Stackoverflow 社区在这里回答特定的代码问题,而不是代表您编写应用程序。我包含我的代码主要是为了给你具体的例子,让你开始修复问题。
  • 谢谢。我收到此错误无法从未定义中读取属性“范围”。 (第 5 行,文件“代码”
  • 代码对我来说运行完美,它正在工作。确保您通过实际更改电子表格来运行它,而不是在脚本界面中运行该函数,否则(如错误消息所述)更改的范围将是未定义的。
  • 我的做法完全相同。我们必须在某个地方定义范围吗?>
【解决方案2】:

两件事:

  1. 如果您尝试从脚本编辑器运行此代码来测试它,它将无法工作,并且您将收到您正在看到的错误消息,因为没有为 e 分配值(因为实际上没有事件)。
  2. 简单的 onEdit 函数无法发送电子邮件,请参阅有关事件和触发器的文档here

您应该在编辑时测试代码(在真实条件下)并设置可安装的 onEdit 触发器(脚本编辑器菜单/资源/此项目触发器/添加新触发器)

你也可以用代码“模拟”一个事件,详情见Mogsdad answer here

【讨论】:

  • 你能写出正确的代码吗,拜托。我读起来很难理解
  • 您的代码是正确的,只需更改函数名称并按照我的说明安装可安装的 onEdit。然后尝试编辑您的工作表,您将收到邮件。
  • 这个答案是“教如何钓鱼”的一个很好的例子,从长远来看,它比“免费钓鱼”的答案更有用。 (Related Meta discussion.)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-03
  • 2020-11-16
  • 1970-01-01
相关资源
最近更新 更多