电子表格运行脚本 onEdit

问题描述 投票:0回答:3

我有一个在电子表格中使用的脚本。它位于单元格 B2,它需要一个像这样的参数

=myfunction(A2:A12)
。该函数在内部从大范围的单元格获取信息。

似乎没有什么效果。我尝试将其添加到
脚本 > 资源 > 当前项目触发器 > 编辑时
脚本 > 资源 > 当前项目触发器 > 打开时

如何让此功能在每次文档编辑时更新结果?

google-apps-script triggers google-drive-api custom-function
3个回答
1
投票

当您在自定义函数(如 getRange 和 getValues 等)内调用 Google Apps 服务时,遗憾的是,除了传递您正在“监视”的单元格的all之外,无法在每次编辑时更新此类自定义函数“用于编辑。

而且,也许更令人沮丧的是,传递一个使用公式引用所有“观看”单元格的单元格的解决方法不会触发更新 - 似乎需要直接引用“观看”单元格.

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

但是这个论坛上许多成员(他们对这方面的知识比我多得多)的建议很简单:“不要使用自定义函数”。


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)");
  }
}

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

希望我是正确的并且我有帮助


1
投票

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

我做了以下操作(假装 A1 是我正在观看的单元格)

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

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

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

这使得它几乎毫无用处,但它可能适合你的情况?

如果将自定义函数分配给项目触发器,它具有更强大的功能,因此我个人最终将其添加到“脚本>资源>当前项目触发器>编辑时”

基本上是“观看一列”,因此它仅在当前单元格位于“编辑范围”内时才执行操作。这有点麻烦,需要一些隐藏的单元格,但它目前对我有用

  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);
  }
© www.soinside.com 2019 - 2024. All rights reserved.