Google Apps脚本 - 电子表格运行脚本onEdit?

时间:2013-04-04 22:49:38

标签: google-apps-script google-docs google-drive-api

我有一个我在电子表格中使用的脚本。它位于单元格B2处,它采用类似=myfunction(A2:A12)的参数。在内部,该函数从大量单元格中获取信息。

似乎没什么用。我尝试将其添加到
脚本>资源>当前的项目触发器>在编辑上 脚本>资源>当前的项目触发器>在开放

如何使用此功能更新每个文档编辑的结果?

3 个答案:

答案 0 :(得分:1)

当您在自定义函数(如getRange和getValues等)中调用Google Apps服务时,遗憾的是,除了传递所有之外,无法通过每次编辑更新此类自定义函数你正在“观察”编辑的单元格。

而且,或许更令人沮丧的是,传递的解决方法是说一个单元格引用所有“看过”的单元格,并且公式不会触发更新 - 似乎需要直接参考“观察”细胞。

您可以将GoogleClock()作为参数传递,这至少会每分钟更新一次函数输出。

但是这个论坛上许多成员的建议(比我更了解这些东西)只会是:“不要使用自定义函数”。

答案 1 :(得分:1)

我不确定这个确切的代码是否有效,但您可以尝试这样的事情......

function onEdit(event){
  var activeSheet = event.source.getActiveSheet();
  if(activeSheet.getName() == "ActiveSheetName") {
    var targetSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("TargetSheetName");
    targetSheet.getRange(2,2).setValue("=myfunction(A2:A12)");
  }
}

假设工作表“TargetSheetName”中的B2单元格并假设已编辑的单元格位于工作表“ActiveSheetName”上,则在编辑任何工作表中的任何单元格时,将触发onEdit函数。由于有一个if语句来检查该编辑的单元格是否在工作表“ActiveSheetName”上,只有当编辑过的单元格位于该工作表上并且它将B“单元格设置为值= myfunction(A2:A12)时才会触发,强迫它更新(我猜)。

希望我是对的,我很乐于助人

答案 2 :(得分:0)

我有一个类似的问题,对我来说,我想“观察”一个特定的细胞来触发我的功能。

我做了以下(假装A1是我正在观看的细胞)

IF(LEN(A1) < 1, " ", customFunction() )

如果我编辑过该单元格,则会成功触发。但是:

  

“自定义函数返回值,但不能在外部设置值   它们所处的细胞。在大多数情况下,自定义函数   单元格A1不能修改单元格A5。但是,如果自定义函数返回一个   双数组,结果溢出包含该函数的单元格   并填充包含该细胞的细胞的下方和右侧的细胞   自定义功能。您可以使用包含的自定义函数对此进行测试   返回[[1,2],[3,4]] ;.“   来自:https://developers.google.com/apps-script/execution_custom_functions

这几乎没用,但它可能对你的情况有用吗?

如果将自定义功能分配给项目触发器,则它具有更强大的功能,因此我个人将其添加到“脚本&gt;资源&gt;当前项目触发器&gt;在编辑中”

并且基本上“观看了一个列”,因此只有在当前单元格在“编辑范围”内时才会执行操作。这有点像一个小屋,需要一些隐藏的细胞,但它现在对我有用

  var rowIndex = thisspreadsheet.getActiveCell().getRowIndex();
  var colIndex = thisspreadsheet.getActiveCell().getColumn();
  //clamp to custom range
  if(rowIndex < 3 && colIndex != 5)
  {
      return 0; 
  }

  //check against copy
  var name = SpreadsheetApp.getActiveSheet().getRange(rowIndex, 5).getValue();
  var copy = SpreadsheetApp.getActiveSheet().getRange(rowIndex, 6).getValue();
  if(name != copy )
  {
     ///value has been changed, do stuff
     SpreadsheetApp.getActiveSheet().getRange(rowIndex, 6).setValue(name);
  }