【问题标题】:Run a function when a cell value changes (onEdit Function)当单元格值更改时运行函数(onEdit 函数)
【发布时间】:2020-02-06 19:57:03
【问题描述】:

在下表中:

https://docs.google.com/spreadsheets/d/1F22Z19gi9WRaYbsrvlDyuiJX5VXfppAlCPzB5bjdMN8/edit?usp=sharing

在脚本编辑器中,我添加了以下代码:

function onEdit(e) {
  var sheetName = 'Sheet2'
  var cellName = 'C2'

  var sortSheet = e.range.getSheet()

  if (sortSheet.getName() === sheetName) {
    if (e.range.getValue().length === cellName) {
      var sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2");
      var e = sh.getRange(2, 3).getValues();
      var m = 'Test Message';
      var subject = 'Test Subject';
      MailApp.sendEmail(e, subject, m);
    }
  }
}

目的是当sheet2中的“C2”单元格值发生变化时触发MailApp函数

我在 sheet1(我在其中添加单元格值)上测试了相同的脚本,并且它可以工作,但是,当我尝试在 sheet2(从 sheet1 复制值)上应用时,脚本不起作用。任何帮助,在此先感谢

请注意该工作表是可编辑的,因此非常欢迎您编辑脚本

【问题讨论】:

  • 您的意思是希望触发器在非人工编辑的工作表上运行?
  • 正如我在“目的是在 sheet2 中更改“C2”单元格值时触发 MailApp 函数”问题中提到的,无论该值是手动编辑的还是公式的结果。我的意思是(据我了解)如果值发生变化,脚本应该检测值变化并运行函数,不是吗?
  • 这两种情况有很大的不同,因为onEdit只有在值被人更改时才会触发。如果它被脚本更改,则需要解决方法。
  • 你能推荐一些东西吗?我还发现了一个类似的线程@stackoverflow.com/questions/30223833/…,线程中提到的是在从另一张表复制/粘贴值时让 onEdit 运行。我们在这里尝试做的是完成同样的事情,但我们使用公式来复制值,而不是 ctrl c/ctrl v。你怎么看?

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


【解决方案1】:

如何在非人工编辑时触发触发器

  • 简单和可安装的应用程序脚本onEdit 触发器都是retricted 人工更改
  • 另外,simple 触发

无法访问需要授权的服务。例如,一个 简单触发器无法发送电子邮件,因为 Gmail 服务需要 授权,但一个简单的触发器可以翻译一个短语 语言服务,是匿名的。

解决方法是将onEdit 触发器替换为可安装的onChange trigger

  • onchange 触发器的限制较少,例如它可以由表格公式IMPORTRANGE触发
  • 您需要做的是创建一个新的空电子表格并将公式IMPORTRANGE("paste here the spreadsheet_url of the original spreadsheet", "Sheet2!E2") 粘贴到单元格E2 中。
  • 点击Allow access
  • 现在,每次更新原始电子表格的“Sheet2”中的“E2”都会更新新的电子表格 - 这将触发 onChange 触发器。

只需修改您的代码如下:

function onChange() { 
  var sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2");
  var e = sh.getRange(2, 3).getValue();
  var m = 'Test Message';
  var subject = 'Test Subject';
  Logger.log("sending");
  MailApp.sendEmail(e, subject, m);
}

【讨论】:

  • 是的,这也有效。完美的解决方法。谢谢 ziganotschka
  • 很高兴为您提供帮助!如果可以的话,出于文档目的,请接受对您有帮助的答案 (✓) - 它可以帮助将来遇到相同问题的其他人也找到解决方案:)
【解决方案2】:

聊天后,我们决定将邮件合并到已经可用的 doPost() 函数中。

function doPost (e) {


.... 

var doc = SpreadsheetApp.getActive();
var sheet = doc.getSheetByName(sheetName)
var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0]
var nextRow = sheet.getLastRow() + 1
var newRow = headers.map(function(header) {
  return header === 'Timestamp' ? new Date() : e.parameter[header]
})

sheet.getRange(nextRow, 1, 1, newRow.length).setValues([newRow])
var email = newRow[1];
var subject = 'XXXXXXXXX';
var body = 'XXXXXXX';
MailApp.sendEmail(email, subject, body);

...... //rest of the code

}

【讨论】:

  • “MailApp 需要授权,并且可能无法在简单的 onEdit 触发器上工作”当我第一次打开“当前项目触发器”时,我确实给予了授权(针对工作表和邮件应用程序)并且安装了 onEdit 触发器“用...替换你的代码”我做了,但仍然没有运气
  • 好的。然后我建议您分享一份附有脚本的电子表格副本。
  • 请注意,onEdit 触发器需要对工作表进行实际编辑。重新计算公式不算作编辑。在这种情况下,您可以(也许)创建一个可以从菜单运行的函数来发送邮件?
  • “那么我建议你分享一份附有脚本的电子表格”docs.google.com/spreadsheets/d/…(可编辑)
猜你喜欢
  • 2017-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多